Android配置build.gradle的productFlavors多渠道打包
Android在分发不同市场的release包时候,在中国经常会遇到各个不同市场需要编译打出一个不同apk包,这些不同的包在一些统计分析SDK中又是必需的,比如友盟统计分析,它需要根据写在Androidmanifest.xml的字段,如果针对每一个渠道都要去修改Androidmanifest.xml的值并重新打包,实在繁琐,最好的办法是在build.gradle里面配置productFlavors,一次性编译生成不同渠道的包,同时完成修改Androidmanifest.xml里面像友盟等第三方要求定义和需要修改的字段。
还有一种需求,比如,如果针对不同的应用市场,需要编译生成不同的App应用名等,这也需要build.gradle里面配置productFlavors实现一次编译,生成不同应用名的apk。
比如productFlavors这么定义:
flavorDimensions "zhangphil_demo"
productFlavors {
qq {
dimension "zhangphil_demo"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qq", app_name: "AppForQQ"]
}
huawei {
dimension "zhangphil_demo"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei", app_name: "AppForHUAWEI"]
}
xiaomi {
dimension "zhangphil_demo"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi", app_name: "AppForXIAOMI"]
}
}
同时,Androidmanifest.xml这样定义:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="zhangphil.demo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="${app_name}"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
</application>
</manifest>
meta-data里面定义了诸如像友盟一类统计SDK需要的UMENG_CHANNEL渠道名,${UMENG_CHANNEL_VALUE}即是在编译阶段由productFlavors定义的UMENG_CHANNEL_VALUE值来替换的。
同时,android:label定义决定了App的名字,这里写成${app_name},表示android:label的值由定义在productFlavors里面的app_name替换。
这就实现了,针对每一个渠道编译生成对应的App名,对应的渠道名。
在编译阶段,按住Ctrl键,鼠标左键点击选中全部,即可一次性编译出全部渠道的包:
然后一次编译生成全部的包:
用代码验证生成的包的正确性:
package zhangphil.demo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.sample_text);
ApplicationInfo appInfo;
try {
appInfo = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
String appName = appInfo.loadLabel(getPackageManager()) + "";
String appChannel = appInfo.metaData.getString("UMENG_CHANNEL");
textView.setText(appName + "\n" + appChannel);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行其中一个release包的输出:
《Android配置build.gradle的productFlavors编译不同配置的apk包》
链接:https://blog.csdn.net/zhangphil/article/details/83275860