当前位置:   article > 正文

多渠道打包之动态修改App名称,图标,applicationId,版本号,添加资源_buildtypes release 自定义打包 修改 appid

buildtypes release 自定义打包 修改 appid

近来公司有需求,同一套代码,要打包N套APP,而且这些APP的软件名称,软件图标,applicationId,版本号,甚至主页都不一样。之前都是单次修改,单次打包,可随着需求越来越多,需要打的包也会越来越多,单次打包费时费力,很明显已经不再适合,于是研究了一下,使用gradle成功实现了需要的功能,打包过程也变的更为简单。

gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。他可以帮助我们轻松实现多渠道打包的功能。

  • 效果图

多渠道打包

  • 项目结构图

这里写图片描述

  • 项目结构中build.gradle的具体内容
  1. apply plugin: 'com.android.application'
  2. //打包时间
  3. def releaseTime() {
  4. return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
  5. }
  6. //获取local.properties的内容
  7. Properties properties = new Properties()
  8. properties.load(project.rootProject.file('local.properties').newDataInputStream())
  9. android {
  10. compileSdkVersion 23
  11. buildToolsVersion "23.0.3"
  12. // 使用签名文件进行签名的两种方式
  13. // //第一种:使用gradle直接签名打包
  14. // signingConfigs {
  15. // config {
  16. // storeFile file('keyTest.jks')
  17. // storePassword '123456'
  18. // keyAlias 'HomeKey'
  19. // keyPassword '123456'
  20. // }
  21. // }
  22. //第二种:为了保护签名文件,把它放在local.properties中并在版本库中排除
  23. // ,不把这些信息写入到版本库中(注意,此种方式签名文件中不能有中文)
  24. signingConfigs {
  25. config {
  26. storeFile file(properties.getProperty("keystroe_storeFile"))
  27. storePassword properties.getProperty("keystroe_storePassword")
  28. keyAlias properties.getProperty("keystroe_keyAlias")
  29. keyPassword properties.getProperty("keystroe_keyPassword")
  30. }
  31. }
  32. // 默认配置
  33. defaultConfig {
  34. minSdkVersion 16
  35. targetSdkVersion 23
  36. versionCode 1
  37. versionName "1.0.1"
  38. }
  39. // 多渠道 的不同配置
  40. productFlavors {
  41. baidu{
  42. // 每个环境包名不同
  43. applicationId "com.shi.androidstudio.multichannel.baidu"
  44. // 动态添加 string.xml 字段;
  45. // 注意,这里是添加,在 string.xml 不能有这个字段,会重名!!!
  46. resValue "string", "app_name", "百度"
  47. resValue "bool", "auto_updates", 'false'
  48. // 动态修改 常量 字段
  49. buildConfigField "String", "ENVIRONMENT", '"我是百度首页"'
  50. // 修改 AndroidManifest.xml 里渠道变量
  51. manifestPlaceholders = [CHANNEL_VALUE: "baidu"
  52. ,app_icon : "@mipmap/logo_baidu"]
  53. }
  54. qq{
  55. applicationId "com.shi.androidstudio.multichannel.qq"
  56. resValue "string", "app_name", "腾讯"
  57. resValue "bool", "auto_updates", 'true'
  58. buildConfigField "String", "ENVIRONMENT", '"我是腾讯首页"'
  59. manifestPlaceholders = [CHANNEL_VALUE: "qq"
  60. ,app_icon : "@mipmap/icon_qq"]
  61. }
  62. xiaomi{
  63. applicationId "com.shi.androidstudio.multichannel.xiaomi"
  64. resValue "string", "app_name", "小米"
  65. resValue "bool", "auto_updates", 'true'
  66. resValue "drawable", "isrRank", 'true'
  67. buildConfigField "String", "ENVIRONMENT", '"我是小米首页"'
  68. manifestPlaceholders = [CHANNEL_VALUE: "xiaomi"
  69. ,app_icon : "@mipmap/icon_xiaomi"]
  70. }
  71. }
  72. //移除lint检测的error
  73. lintOptions {
  74. abortOnError false
  75. }
  76. buildTypes {
  77. debug {
  78. // debug模式下,显示log
  79. buildConfigField("boolean", "LOG_DEBUG", "true")
  80. //为已经存在的applicationId添加后缀
  81. applicationIdSuffix ".debug"
  82. // 为版本名添加后缀
  83. versionNameSuffix "-debug"
  84. // 不开启混淆
  85. minifyEnabled false
  86. // 不开启ZipAlign优化
  87. zipAlignEnabled false
  88. // 不移除无用的resource文件
  89. shrinkResources false
  90. // 使用config签名
  91. signingConfig signingConfigs.config
  92. }
  93. release {
  94. // release模式下,不显示log
  95. buildConfigField("boolean", "LOG_DEBUG", "false")
  96. // 为版本名添加后缀
  97. versionNameSuffix "-relase"
  98. // 不开启混淆
  99. minifyEnabled false
  100. // 开启ZipAlign优化
  101. zipAlignEnabled true
  102. // 移除无用的resource文件
  103. shrinkResources true
  104. // 使用config签名
  105. // signingConfig signingConfigs.config
  106. // 混淆文件位置
  107. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  108. // // 批量打包
  109. applicationVariants.all { variant ->
  110. variant.outputs.each { output ->
  111. def outputFile = output.outputFile
  112. if (outputFile != null && outputFile.name.endsWith('.apk')) {
  113. //输出apk名称为:渠道名_版本名_时间.apk
  114. def fileName = "${variant.productFlavors[0].name}_v${defaultConfig.versionName}_${releaseTime()}.apk"
  115. output.outputFile = new File(outputFile.parent, fileName)
  116. }
  117. }
  118. }
  119. }
  120. }
  121. }
  122. //项目依赖
  123. dependencies {
  124. compile fileTree(dir: 'libs', include: ['*.jar'])
  125. testCompile 'junit:junit:4.12'
  126. compile 'com.android.support:appcompat-v7:23.3.0'
  127. }
  • 项目结构中local.properties的具体内容
  1. ## This file is automatically generated by Android Studio.
  2. # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
  3. #
  4. # This file should *NOT* be checked into Version Control Systems,
  5. # as it contains information specific to your local configuration.
  6. #
  7. # Location of the SDK. This is only used by Gradle.
  8. # For customization when using a Version Control System, please read the
  9. # header note.
  10. sdk.dir=D\:\\Android_Studio\\SDK
  11. #对应自己实际的证书路径和名字,在这里由于签名文件是放在app目录下,因为没有写绝对路径。
  12. keystroe_storeFile=keyTest.jks
  13. keystroe_storePassword=123456
  14. keystroe_keyAlias=HomeKey
  15. keystroe_keyPassword=123456

看完build.gradle和local.properties的具体内容之后,我们再来挑选几个地方来具体说一下。

一. signingConfigs

在signingConfigs中主要是为打包配置签名文件具体信息的,这里我使用了两种方式,第一种方式把签名文件的位置,storePassword ,keyAlias,keyPassword 等具体内容都直接写在其中,然后使用gradle进行打包,第二种是通过通过使用local.properties文件来间接加载签名文件的具体信息。一般我们更倾向于第二种方法,这样有助于保护我们的签名文件(在local.properties中不能有中文)。

二. productFlavors

不同渠道的设置基本都是在 productFlavors 里设置的,在里面想要添加多少个渠道都可以。

修改app名称

  1. resValue "string", "app_name", "腾讯"
  2. resValue "bool", "auto_updates", 'true'

通过resValue 我们可以在在 string.xml 里面添加了一个新的字段app_name,由于是添加,所以原来的string.xml 文件中不能存在app_name字段,否则会报错。 
当然我们还可以添加布尔类型,还可以为color.xml、dimen.xml添加一些我们需要的字段。

修改app图标

当我们在productFlavors 中添加了不同渠道环境名称之后,我们还可以mian文件夹同层级中建立和baidu,qq,xiaomi名称对应的文件夹,并放入特定的图标文件,当然我们还可以放入其他资源文件,甚至AndroidManifest.xml都可以放入,Gradle在构建应用时,会优先使用flavor所属dataSet中的同名资源。所以,在flavor的dataSet中添加同名的资源文件,会覆盖默认的资源文件,这样就能达到不同环境不同软件图标的功能。

这里写图片描述

不同环境,修改 AndroidManifest.xml 里渠道变量(项目中未使用这个功能)

①在 AndroidManifest.xml 里添加渠道变量

  1. <application
  2. android:icon="${app_icon}"
  3. android:label="@string/app_name"
  4. android:theme="@style/AppTheme">
  5. ...
  6. <meta-data
  7. android:name="CHANNEL"
  8. android:value="${CHANNEL_VALUE}" />
  9. ...
  10. </application>

②在 build.gradle 设置 productFlavors

  1. productFlavors {
  2. baidu{
  3. manifestPlaceholders = [CHANNEL_VALUE: "baidu"
  4. ,app_icon : "@mipmap/logo_baidu"]
  5. }
  6. qq{
  7. manifestPlaceholders = [CHANNEL_VALUE: "qq"
  8. ,app_icon : "@mipmap/icon_qq"]]
  9. }
  10. xiaomi{
  11. manifestPlaceholders = [CHANNEL_VALUE: "xiaomi"
  12. ,app_icon : "@mipmap/icon_xiaomi"]]
  13. }
  14. }

这样我们可以在不同环境使用不同的 key 值。

简单介绍就到这里了,做个笔记方便以后使用,如果”不小心”帮到别人了当然也是极好的了。 
最后附上github上的项目地址 
以及整个demo下载地址

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

闽ICP备14008679号