Android配置build.gradle解锁更高逼格玩法(多版本共存、分服务器打包等)
背景
在日常的AndroidAPP开发过程中,常常需要在同一设备上安装同一APP的多个版本。如在没有测试设备的情况下需要使用到个人设备进行测试,而该设备已安装正式版本且有大量缓存数据。applicationId作为Android对APP的唯一识别,同一applicationId仅能在一个设备上出现一次,这时就需要对APP进行多版本共存处理。
分析
Android在对于APP安装时,会首先校验applicationId是否已在设备上存在。
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。--来自百度百科
我只抓住了一点,“抛弃了基于XML的各种繁琐配置”
代码
1.建版本 首先,我们需要在APP的build.gradle中,buildTypes下建版本。
buildTypes {release {...}debug {debuggable true...}dev {...}...} 复制代码这里的版本,可以建无数多个,但debug下一定要写
debuggable true 复制代码这样AndroidStudio才能区分RunApp操作时调试的是哪一个版本。写完之后,在Build-->Generate Signed APK中,BuildType就能去选择对应的版本了。
2.改Id applicationIdSuffix可以很轻松地执行类似修改包名称的操作,原理是在defaultConfig的applicationId后面拼接内容。例如在debug版本下:
buildTypes {...debug {applicationIdSuffix ".debug"debuggable true...}...} } 复制代码同理,若需要存在N个版本,则在建立N个版本后,添加applicationIdSuffix属性即可。如:
buildTypes {...debug {applicationIdSuffix ".debug"debuggable true...}dev {applicationIdSuffix ".dev"...}...dev_n {applicationIdSuffix ".dev_n"...}...} } 复制代码做完以上两步,如果没有配置provider的话,多版本已经可以共存。但Android7.0以后,如果要使用一些权限的话,provider是必须的。
3.provider provider也是唯一的。这时候强大的Groovy再次登场。
buildTypes {release {manifestPlaceholders = [PROVIDER: "${defaultConfig.applicationId}.fileprovider"]}debug {applicationIdSuffix ".debug"manifestPlaceholders = [PROVIDER: "${defaultConfig.applicationId}.debug.fileprovider"]debuggable true} } 复制代码注:${defaultConfig.applicationId}就是我们在defaultConfig中配置的,
同时,需要在manifest中替换authorities
<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="${PROVIDER}"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/filepaths" /> </provider> 复制代码4.APP名 我感觉。。。你可能还需要在设备上区分版本
buildTypes {release {manifestPlaceholders = [APP_NAME: "HelloWorld", PROVIDER: "${defaultConfig.applicationId}.fileprovider"]}debug {applicationIdSuffix ".debug"manifestPlaceholders = [APP_NAME: "HelloWorld测试版", PROVIDER: "${defaultConfig.applicationId}.debug.fileprovider"]debuggable true}dev {manifestPlaceholders = [APP_NAME: "HelloWorld开发版", PROVIDER: "${defaultConfig.applicationId}.dev.fileprovider"]}... } 复制代码同时替换manifest中,application标签下的android:lable
<applicationandroid:name=".application.MyApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="${APP_NAME}"android:supportsRtl="true"android:theme="@style/AppTheme"tools:replace="android:icon,android:label,android:theme">... <application/> 复制代码注:tools:replace这个属性最好加上,我之前没加,编译不通过。
综上所述,如果想替换manifest中的任何配置,则需在manifestPlaceholders中,以key-value形式编写字段,同时在manifest中以
${key-name} 复制代码的形式调用就ok了,同理我们还能够替换icon和其他例如阿里云推送的key等等。
5.服务器地址 嗯,是的,这个也是可以替换的。原理是替换BuildConfig中对应字段。 BuildConfig路径
app\build\generated\source\buildConfig\PACKAGE_NAME\android\buildType
//正式环境 def SERVER_URL_RELEASE = "\"http://release.com/\"" //开发环境 def SERVER_URL_DEBUG = "\"http://debug.com/\""buildTypes {release {buildConfigField "String", "SERVER_URL", "${SERVER_URL_RELEASE}"...}debug {applicationIdSuffix ".debug"buildConfigField "String", "SERVER_URL", "${SERVER_URL_DEBUG}"debuggable true...}... } 复制代码首先定义服务器地址String,并在对应的位置指明
"字段类型","要替换的字段名","字段"
在常量文件(通常习惯性为Constants.java)中
public static final String SERVER_URL = BuildConfig.SERVER_URL; 复制代码只要字段名和字段类型能够对应,替换这些都是可以实现的。
6.APK自动命名 我们希望在打包时自动命名格式,例如:xxx_v1.2.3.apk,可在android目录下写上
android.applicationVariants.all { variant ->variant.outputs.all {outputFileName = "xxx_v${defaultConfig.versionName}.apk"} } 复制代码不仅如此,build.gradle文件还有其他玩法供大家解锁,希望能集思广益、不吝分享。
转载于:https://juejin.im/post/5c887b3c6fb9a049e82c613c
总结
以上是生活随笔为你收集整理的Android配置build.gradle解锁更高逼格玩法(多版本共存、分服务器打包等)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: hyperledge工具-configt
- 下一篇: Android初级开发笔记-- acti