Android Gradle 多版本多APK打包,图标不同,包名不同, 修改apk名字

环境: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")
	}  
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值