赞
踩
环境:Android Studio3.2.1 gradle 3.1.3 gradle-4.4-all.zip
在app的build.gradle中加入(初版)
- //配置多版本的apk
- productFlavors{
- Offline{
- applicationId "com.xxxx.xxxx.beta"
- manifestPlaceholders = [app_name:"xxxx" ,icon: "@mipmap/ic_launcher_xxxx"]
- resValue("string" , "baseUrl","xxxxxxx")
- versionCode 2
- versionName "1.0.2"
- }
- Online{
- applicationId "com.xxxx.xxxx.online"
- manifestPlaceholders = [app_name:"xxxx" ,icon: "@mipmap/ic_launcher_xxxx"]
- resValue("string" , "baseUrl","xxxxxxx")
- versionCode 1
- versionName "1.0.3"
- }
注意:
1. 这里分了Offline和Online两个版本,applicationId分别配置的是两个版本的包名,如果没有配置的话,则默认使用defaultConfig下的包名。
2.manifestPlaceholders里配置应用名称或图标,需要在AndroidManifest.xml的application标签下配置android:label="${app_name}" android:icon="${icon}"
3.resValue
可以配置一些我们需要的不同的值,第一个参数是变量的类型,第二个参数key,第三个参数是变量的value。具体的使用value=context.getResources().getString(R.string.key)
sync一下,在侧边栏的gradle中就会出现assembleOnline和assembleOffline两个task,运行这两个task就能生成相应的包。
每个apk配置不同的名字:
- applicationVariants.all {
- variant ->
- variant.outputs.all {
- outputFileName = productFlavors[0].manifestPlaceholders.get("app_name")+".apk"
- }
- }
或者(productFlavors[0].name开头不能以数字开头,所以以数字开头的apk名称还是得用上一种方法)
- applicationVariants.all {
- variant ->
- variant.outputs.all {
- outputFileName = productFlavors[0].name+".apk"
- }
- }
出现的问题:
1. 在build.gradle中加入了productFlavors后,报错Error: All flavors must now belong to a named flavor dimension.
这个错误是说:必须保证所有的flavor都属于同一个维度。
解决办法:
在defaultConfig{}中添加 flavorDimensions "default"
2. 程序中有百度语音的内容,打包时报错:Error:Duplicate registration for activity com.baidu.voicerecognition.android.ui.BaiduASRDigitalDialog
Explanation for issues of type "DuplicateAcitivity":
解决办法:
在build.gradle的 android{}下加入
- lintOptions {
- checkReleaseBuilds false
- abortOnError false
- }
打包成功。
3. 打包成功后,安装apk,报错:Failure 【INSTALL_PARSE_FAILED_NO_CERTIFICATES: Package /data/app/vmd1519554990.tmp/base.apk has no certificates at entry AndroidManifest.xml】
原因:Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。在默认情况下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 会使用 APK Signature Scheme v2 和传统签名方案来签署您的应用。
解决办法:
在build.gradle的release签名设置下加入v2SigningEnabled false,在工具栏的Build>Generate Signed Bundle or APK中只选中V1然后打包,可以安装成功。如果在侧边栏的Gradle中使用assembleRelease打包,还是安装不成功。
(补充:用侧边栏的assembleRelease打包不成功,是因为在没有签名,这样编译出来的apk名字为app-Offline-release-unsigned.apk,需要在productFlavors的Offline或Online中加入signingConfig signingConfigs.release才能打出带签名的包app-Offline-release.apk,这样就可以安装成功了。)
4. 在AndroidManifest.xml的<application>中修改android:label="${app_name}" android:icon="${icon}",编译时出错:Manifest merger failed with multiple errors
(项目中有多个module,每个module中都有AndroidManifest)
解决办法:
在<application>中加入tools:replace="android:label,android:icon"即可。
productFlavors修改后的完整版:
- //配置多版本的apk
- productFlavors{
- Offline{
- applicationId "com.xxxx.xxxx.beta"
- manifestPlaceholders = [app_name:"fileOffline" ,icon: "@drawable/ic_launcher"]
- resValue("string" , "baseUrl","xxxxxxx")
- versionCode 2
- versionName "1.0.2"
- signingConfig signingConfigs.release
- }
- Online{
- applicationId "com.xxxx.xxxx.online"
- manifestPlaceholders = [app_name:"fileOnline" ,icon: "@drawable/ic_launcher_canada"]
- resValue("string" , "baseUrl","xxxxxxx")
- versionCode 1
- versionName "1.0.3"
- signingConfig signingConfigs.Onlinerelease//单独配置签名
- }
使用buildConfigField控制Log开关,替换不同apk 中的图标:
- //设置apk的名字
- android.applicationVariants.all { variant ->
- variant.outputs.all {
- outputFileName = productFlavors[0].manifestPlaceholders.get("apk_name")+".apk"
- }
- }
-
- //配置多版本的apk
- productFlavors{
- Offline{
- applicationId "com.xxxx.xxxx.beta"
- manifestPlaceholders = [app_name:"@string/app_name_on" ,icon: "@drawable/ic_launcher",apk_name:"fileOffline"]
- resValue("string" , "baseUrl","xxxxxxx")
- versionCode 2
- versionName "1.0.2"
- signingConfig signingConfigs.release
- buildConfigField("int","logo","R.drawable.logo")
- buildConfigField("boolean","ENABLE_DEBUG","true")
- }
- Online{
- applicationId "com.xxxx.xxxx.online"
- manifestPlaceholders = [app_name:"@string/app_name_on" ,icon: "@drawable/ic_launcher_canada",apk_name:"fileOnline"]
- resValue("string" , "baseUrl","xxxxxxx")
- versionCode 1
- versionName "1.0.3"
- signingConfig signingConfigs.Onlinerelease//单独配置签名
- buildConfigField("int","logo","R.drawable.ic_logo")
- buildConfigField("boolean","ENABLE_DEBUG","false")
- }
java代码中调用:
ivLogo.setImageResource(BuildConfig.logo);
注意:
1. apk的名字设定专门在productFlavors的manifestPlaceholders中设置了apk_name的字段,原本用的是app_name的值,但考虑到多语言的状态,app_name不能设为固定值,只能设为@string/app_name,如果apk的名字继续用app_name的话,编译出来的apk会生成一个@string的目录,目录里面才是apk,但apk的名字不是想要的名字而是app_name.apk
2. 要在有多个library的项目中,使用buildConfig,需要在使用到的library以及它上层的library的build.gradle中都配置productFlavors。里面不一定要有内容,但一定要配置。否则报错。
比如app里配置了多版本编译,app里包含fileinput这个library,fileinput下又包含了common的library,需要在common里设置某个需要替换的属性,那就需要在fileinput里设置一个空的productFlavors.
fileinput的build.gradle设置:
- productFlavors{
- Offline{
- }
- Online{
- }
- }
common的build.gradle设置:
- productFlavors{
- Offline{
- buildConfigField("int","logo","R.drawable.logo")
- buildConfigField("boolean","ENABLE_DEBUG","true")
- }
- Online{
- buildConfigField("int","logo","R.drawable.ic_logo")
- buildConfigField("boolean","ENABLE_DEBUG","false")
- }
- }
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。