当前位置:   article > 正文

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

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

环境:Android Studio3.2.1    gradle 3.1.3    gradle-4.4-all.zip

在app的build.gradle中加入(初版)

  1. //配置多版本的apk
  2. productFlavors{
  3. Offline{
  4. applicationId "com.xxxx.xxxx.beta"
  5. manifestPlaceholders = [app_name:"xxxx" ,icon: "@mipmap/ic_launcher_xxxx"]
  6. resValue("string" , "baseUrl","xxxxxxx")
  7. versionCode 2
  8. versionName "1.0.2"
  9. }
  10. Online{
  11. applicationId "com.xxxx.xxxx.online"
  12. manifestPlaceholders = [app_name:"xxxx" ,icon: "@mipmap/ic_launcher_xxxx"]
  13. resValue("string" , "baseUrl","xxxxxxx")
  14. versionCode 1
  15. versionName "1.0.3"
  16. }

注意:

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配置不同的名字:

  1. applicationVariants.all {
  2. variant ->
  3. variant.outputs.all {
  4. outputFileName = productFlavors[0].manifestPlaceholders.get("app_name")+".apk"
  5. }
  6. }

或者(productFlavors[0].name开头不能以数字开头,所以以数字开头的apk名称还是得用上一种方法)

  1. applicationVariants.all {
  2. variant ->
  3. variant.outputs.all {
  4. outputFileName = productFlavors[0].name+".apk"
  5. }
  6. }

出现的问题:

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{}下加入

  1. lintOptions {
  2. checkReleaseBuilds false
  3. abortOnError false
  4. }

打包成功。

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修改后的完整版:

  1. //配置多版本的apk
  2. productFlavors{
  3. Offline{
  4. applicationId "com.xxxx.xxxx.beta"
  5. manifestPlaceholders = [app_name:"fileOffline" ,icon: "@drawable/ic_launcher"]
  6. resValue("string" , "baseUrl","xxxxxxx")
  7. versionCode 2
  8. versionName "1.0.2"
  9. signingConfig signingConfigs.release
  10. }
  11. Online{
  12. applicationId "com.xxxx.xxxx.online"
  13. manifestPlaceholders = [app_name:"fileOnline" ,icon: "@drawable/ic_launcher_canada"]
  14. resValue("string" , "baseUrl","xxxxxxx")
  15. versionCode 1
  16. versionName "1.0.3"
  17. signingConfig signingConfigs.Onlinerelease//单独配置签名
  18. }

 

使用buildConfigField控制Log开关,替换不同apk 中的图标:

  1. //设置apk的名字
  2. android.applicationVariants.all { variant ->
  3. variant.outputs.all {
  4. outputFileName = productFlavors[0].manifestPlaceholders.get("apk_name")+".apk"
  5. }
  6. }
  7. //配置多版本的apk
  8. productFlavors{
  9. Offline{
  10. applicationId "com.xxxx.xxxx.beta"
  11. manifestPlaceholders = [app_name:"@string/app_name_on" ,icon: "@drawable/ic_launcher",apk_name:"fileOffline"]
  12. resValue("string" , "baseUrl","xxxxxxx")
  13. versionCode 2
  14. versionName "1.0.2"
  15. signingConfig signingConfigs.release
  16. buildConfigField("int","logo","R.drawable.logo")
  17. buildConfigField("boolean","ENABLE_DEBUG","true")
  18. }
  19. Online{
  20. applicationId "com.xxxx.xxxx.online"
  21. manifestPlaceholders = [app_name:"@string/app_name_on" ,icon: "@drawable/ic_launcher_canada",apk_name:"fileOnline"]
  22. resValue("string" , "baseUrl","xxxxxxx")
  23. versionCode 1
  24. versionName "1.0.3"
  25. signingConfig signingConfigs.Onlinerelease//单独配置签名
  26. buildConfigField("int","logo","R.drawable.ic_logo")
  27. buildConfigField("boolean","ENABLE_DEBUG","false")
  28. }

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设置:

  1. productFlavors{
  2. Offline{
  3. }
  4. Online{
  5. }
  6. }

common的build.gradle设置:

  1. productFlavors{
  2. Offline{
  3. buildConfigField("int","logo","R.drawable.logo")
  4. buildConfigField("boolean","ENABLE_DEBUG","true")
  5. }
  6. Online{
  7. buildConfigField("int","logo","R.drawable.ic_logo")
  8. buildConfigField("boolean","ENABLE_DEBUG","false")
  9. }
  10. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/265348
推荐阅读
相关标签
  

闽ICP备14008679号