前几天项目闲暇之余看了一下同事做的这个功能,之前没做过,学习了一下,现总结如下:
主要分为三部曲:
一、在AndroidManifest.xml中定义渠道,代码如下,这里的name值随意定义:
<meta-data
android:name="APP_CHANNEL"
android:value="${APP_CHANNEL_VALUE}" />
二、app的Gradle中定义渠道以及其他信息
1、定义渠道签名
signingConfigs {
App1 {
storeFile file("keystore/t.jks")
storePassword "***"
keyAlias "***"
keyPassword "***"
}
App2 {
storeFile file("keystore/t1.jks")
storePassword "***"
keyAlias "***"
keyPassword "***"
}
App3 {
storeFile file("keystore/t2.jks")
storePassword "***"
keyAlias "***"
keyPassword "***"
}
}
2、定义各渠道applicationId,版本、appName、logo等等信息,这里定义不同的applicationId也就可以同一个包生成不同的app,在同一个手机上安装了,这里的resValue "string", "mapp_name", "测试App1" ,就是定义app name,在AndroidManifest.xml中对应 android:label="@string/mapp_name" ,这样就可以更改app name,这里的resValue常用于设置string.xml中的一些值,比如定义 string resValue "string", "mapp_name", "测试App1" ,定义 boolean resValue "bool", "debug", "true" ,
定义int resValue "integer", "number", "1" 。manifestPlaceholders 对应AndroidManifest.xml中定义的值,下面代码的APP_CHANNEL_VALUE就是meta-data里面定义的,在这里动态赋值。这里的app_icon就是android:icon="${app_icon}" ,
这里的buildConfigField对应BuildConfig文件里的常量,比如如果我们的不同包的api的host不同的话,就可以在这里为不同包设置不同的host,比如这里的buildConfigField "String", "HOST", '"http://www.jd.com"'就是为app1设置的host,然后编译一下就可使用,然后使用的时候就是 BuildConfig.HOST + "api/product",然后就是设置每个不同包的签名 signingConfig signingConfigs.App1就是对应signingConfigs定义的App1。app_icon资源文件应该在main的同级目录创建不同的包,命名应该和signingConfigs中定义的一样,然后再放对应的res资源,如下图:
productFlavors {
app1 {
applicationId "com.news.star.news1"
versionCode 1
versionName "1.0.0"
resValue "string", "mapp_name", "测试App1"
manifestPlaceholders = [APP_CHANNEL_VALUE: "app1",
app_icon : "@mipmap/logo_desk"]
buildConfigField "String", "HOST", '"http://www.jd.com/"'
signingConfig signingConfigs.App1
}
app2 {
applicationId "com.news.star.news2"
versionCode 2
versionName "1.0.1"
resValue "string", "mapp_name", "测试App2"
manifestPlaceholders = [APP_CHANNEL_VALUE: "app2",
app_icon : "@mipmap/logo_desk"]
buildConfigField "String", "HOST", '"http://www.tm.com/"'
signingConfig signingConfigs.App2
}
app3 {
applicationId "com.news.star.news3"
versionCode 3
versionName "1.1.0"
resValue "string", "mapp_name", "测试App3"
manifestPlaceholders = [APP_CHANNEL_VALUE: "app3",
app_icon : "@mipmap/logo_desk"]
buildConfigField "String", "HOST", '"http://www.xm.com/"'
signingConfig signingConfigs.App3
}
}
经过以上的配置基本都已完成,编译的时候应该会提示如下错误:
All flavors must now belong to a named flavor dimension.
需要我们配置flavorDimensions
温馨提示:
做了不同包以后本地更新下载的代码一般情况下需要更改一下了,在7.0的下载权限定义APP_File_Provider的时候,就需要利用上面说过的BuildConfig的方式去为不同的包配置了,用法是
FileProvider.getUriForFile(mContext, BuildConfig.APP_FILE_PROVIDER, apkfile);
以上纯属自我总结,如有错误请大佬指正,多谢。