欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

【Android】Android多渠道打包--Gradle打包

程序员文章站 2022-03-20 17:14:54
Android多渠道打包 Gradle打包 前言 由于App一般都会在多个应用市场上架,为了分析App在每个不同渠道的具体的数据,一般都会对不同渠道打包不同的App。多渠道打包有多种方式,这里只介绍利用Gradle进行多渠道打包。 步骤 1、在AndroidManifest.xml中增加配置 其中, ......

android多渠道打包--gradle打包

前言

由于app一般都会在多个应用市场上架,为了分析app在每个不同渠道的具体的数据,一般都会对不同渠道打包不同的app。多渠道打包有多种方式,这里只介绍利用gradle进行多渠道打包。

步骤

1、在androidmanifest.xml中增加配置

<meta-data
            android:name="app_channel"
            android:value="${app_channel_value}" />

其中,app_channel为配置的属性名。app_channel_value为在build.gradle中配置的变量。

2、在build.gradle中增加productflavors配置

productflavors {
        baidu {
            manifestplaceholders = [app_channel_value: "baidu"]
        }
        qq {
            manifestplaceholders = [app_channel_value: "qq"]
        }
    }

在这里,增加了两个渠道配置信息:baidu和qq。在manifestplaceholders的配置中,app_channel_value即为在androidmanifest用到的变量。

注意:gradle3.0以上版本,需要在defaultconfig节点中增加以下配置:

flavordimensions "default"

3、渠道名称获取

private string getmetadata(context context, string key) {
        try {
            packagemanager packagemanager = context.getpackagemanager();
            applicationinfo applicationinfo = packagemanager.getapplicationinfo(context
                    .getpackagename(), packagemanager.get_meta_data);
            return applicationinfo.metadata.getstring(key);
        } catch (exception e) {
            e.printstacktrace();
        }
        return "";
    }

4、修改应用名称

productflavors {
        baidu {
            manifestplaceholders = [app_name: "@string/app_name_baidu", app_channel_value: "baidu"]
        }
        qq {
            manifestplaceholders = [app_name: "@string/app_name_qq",app_channel_value: "qq"]
        }
    }

在manifestplaceholders中增加app_name的配置,在androidmanifest.xml中引用:

<application
        android:allowbackup="true"
        android:icon="${app_icon}"
        android:label="${app_name}"
        android:roundicon="${app_icon}"
        android:supportsrtl="true"
        android:theme="@style/apptheme">

        <meta-data
            android:name="app_channel"
            android:value="${app_channel_value}" />

        //省略其它内容
    </application>

5、修改应用图标

productflavors {
        baidu {
            manifestplaceholders = [app_name: "@string/app_name_baidu",app_icon:"@mipmap/icon_baidu", app_channel_value: "baidu"]
        }
        qq {
            manifestplaceholders = [app_name: "@string/app_name_qq", app_icon:"@mipmap/icon_qq",app_channel_value: "qq"]
        }
    }

在manifestplaceholders中增加app_icon的配置,在androidmanifest.xml中引用:

<application
        android:allowbackup="true"
        android:icon="${app_icon}"
        android:label="${app_name}"
        android:roundicon="${app_icon}"
        android:supportsrtl="true"
        android:theme="@style/apptheme">

        <meta-data
            android:name="app_channel"
            android:value="${app_channel_value}" />

        //省略其它内容
    </application>

6、修改应用包名

productflavors {
        baidu {
            applicationidsuffix ".baidu"
            manifestplaceholders = [app_name: "@string/app_name_baidu",app_icon:"@mipmap/icon_baidu", app_channel_value: "baidu"]
        }
        qq {
            applicationidsuffix ".qq"
            manifestplaceholders = [app_name: "@string/app_name_qq", app_icon:"@mipmap/icon_qq",app_channel_value: "qq"]
        }
    }

增加applicationidsuffix属性。

7、java中调用gradle中的变量

buildtypes {
        debug {
            minifyenabled false
            proguardfiles getdefaultproguardfile('proguard-android.txt'), 'proguard-rules.pro'
            buildconfigfield "string","field_test","\"field_test\""
        }
        release {
            minifyenabled false
            proguardfiles getdefaultproguardfile('proguard-android.txt'), 'proguard-rules.pro'
            buildconfigfield "string","field_test","\"field_test\""
        }
    }

增加buildconfigfield。同步后,通过buildconfig.field_test能获取到新增的变量值。

8、完整的gradle

apply plugin: 'com.android.application'

android {
    compilesdkversion 28
    defaultconfig {
        applicationid "com.wangyz.multichannel"
        minsdkversion 21
        targetsdkversion 28
        versioncode 1
        versionname "1.0"
        testinstrumentationrunner "android.support.test.runner.androidjunitrunner"
        flavordimensions "default"
    }
    buildtypes {
        debug {
            minifyenabled false
            proguardfiles getdefaultproguardfile('proguard-android.txt'), 'proguard-rules.pro'
            buildconfigfield "string","field_test","\"field_test\""
        }
        release {
            minifyenabled false
            proguardfiles getdefaultproguardfile('proguard-android.txt'), 'proguard-rules.pro'
            buildconfigfield "string","field_test","\"field_test\""
        }
    }
    productflavors {
        baidu {
            applicationidsuffix ".baidu"
            manifestplaceholders = [app_name: "@string/app_name_baidu",app_icon:"@mipmap/icon_baidu", app_channel_value: "baidu"]
        }
        qq {
            applicationidsuffix ".qq"
            manifestplaceholders = [app_name: "@string/app_name_qq", app_icon:"@mipmap/icon_qq",app_channel_value: "qq"]
        }
    }
}

dependencies {
    implementation filetree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.+'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testimplementation 'junit:junit:4.12'
    androidtestimplementation 'com.android.support.test:runner:1.0.1'
    androidtestimplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

9、完整的androidmanifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wangyz.multichannel">

    <application
        android:allowbackup="true"
        android:icon="${app_icon}"
        android:label="${app_name}"
        android:roundicon="${app_icon}"
        android:supportsrtl="true"
        android:theme="@style/apptheme">

        <meta-data
            android:name="app_channel"
            android:value="${app_channel_value}" />

        <activity android:name=".mainactivity">
            <intent-filter>
                <action android:name="android.intent.action.main" />

                <category android:name="android.intent.category.launcher" />
            </intent-filter>
        </activity>
    </application>

</manifest>