利用 Android Studio 和 Gradle 打包多版本APK

简介:

在项目开发过程中,经常会有需要打包不同版本的 APK 的需求。 比如 debug版,release版,dev版等等。 有时候不同的版本中使用到的不同的服务端api域名也不相同。 比如 debug_api.com,release_api.com,dev_api.com等等。


不同的版本对应了不同的 api 域名,还可能对应不同的 icon 等。


如果每次都在打包前修改我们都手动来修改,这样实在是不够方便。


但如果我们使用了 Android Studio 和 Gradle,这个麻烦就可以轻松省去。


具体方式如下: 在 Android Studio 中打开 build.gradle(Module中)的 android 节点下添加如下代码


buildTypes {


//这里的名字自定义,不要求大小写

release{


// 这里是在 applicationId 中添加了一个后缀。所以『.』要加上

applicationIdSuffix ".release"


// 这里的作用是选择是否混淆代码

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}


dev{

applicationIdSuffix ".dev"

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'


}

}


// 这里是为了不同过的版本设置一些特殊的参数,并不直接和 buildType 关联。

//例如:使用 buildType 中的 dev 版本,也可以使用 flavors_release 里面设置的自定义参数。这需要自己按照需求制定。

productFlavors{


//自定义名字不过不能和上面buildType中相同,不然Gradle编译会不通过。在这里使用了『flavors_』前缀以便区分。

flavors_release{


// manifestPlaceholders中写到的『str』,『package_name』不支持用大写,否则Gradle编译会不通过。

// 这里所设置的变量可以直接使用在『AndroidManifest.xml』中,使用方式为:${package_name}

// android:label="${package_name}"

manifestPlaceholders = [str:"releaseStr",package_name:"com.sunhz.mvptest.release"]


// 这里的参数是为了在 java 代码中使用,具体的使用方式为:context.getResources().getString(R.string.strKey);

resValue("string" , "strKey","releaseStrValue")

}


flavors_dev{

manifestPlaceholders = [str:"devStr",package_name:"com.sunhz.mvptest.dev"]


resValue("string" , "strKey","devStrValue")

}

}


上面设置完成后,我们要在哪里使用它?


使用方式如下: 在 Android Studio 的工具栏中,找到『Build』项,找到『Generate Signed APK…』。


选择 Module -> 创建 APK key,或者输入 APK key密码 -> 关键来了!如下图。

wKiom1XRMiOBI0wIAADtuLU1TYg588.jpg


在『BuildType』处,选择我们在 build.gradle 中设置的两个 BuildType,分别是releas,dev,debug。其中『debug』为 Android Studio 自带的。


在『Flavors』处,选择我们在 build.gradle 中设置的两个Flavors,以方便直接使用定义在 build.gradle 中自定义的参数。


所以! 上面我有提到说,buildType 和 Flavors 并没有直接的联系。 他们可以根据用户需求互相配合使用。如上图,BuildType 选择了 release,但 Flavors 选择的却是 flavors_dev。


到此基本的使用就全部说完了。


这里有一个问题,打出来的不同版本的包,全部都能够在同一部手机上安装,且能够将两个包全都发布到 Google 的市场上去这是为什么呢?


这里就要提到在 BuildType 中我们所设置的『applicationIdSuffix』属性了,按照这个属性的字面翻译为:『applicationId 的后缀』,那这里又来了一个问题,『applicationId』是什么? 其实这个『applicationId』属性,实际上在项目创建完成后就存在于 build.gradle 中。在 android 节点下的 defaultConfig 节点中。而且默认的 applicationId 和 AndroidManifest.xml 中的 package 属性相同。


如下图:

wKioL1XRNDySoLFlAADeRHp9nDY515.jpg


我们能够看到,这两个属性的默认值是相同的。


applicationId 和 packageName 它们是什么关系?


默认创建项目后,两者相同。如果需要根据不同的需求构建不同版本的APK,这时我们通过设置『applicationIdSuffix』可以做到。


这里有一个值得注意的现象。


举个例子,我们在打包时使用了 dev 类型,将打包出来的 APK 软件安装到手机中。


使用如下代码,获取我们手机上所有程序的packageName。


PackageManager packageManager = mContext.getPackageManager();

List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS);

List<String> packageNameList = new ArrayList<String>();

for (PackageInfo packageInfo : packageInfoList) {

packageNameList.add(packageInfo.packageName);

}


我们打印出来的包名信息中,会出现 com.spencer_dev.test.dev 。并没有出现 com.spencer_dev.test 。


但是! 如果通过反编译工具,将 APK 包进行反编译直接查看源代码,在 java 代码所在的 src 目录中的包名,还和我们设置的一样,为 com.spencer_dev.test 。可 AndroidManifest.xml 中的 package 和 BuildConfig 类中的 APPLICATION_ID 已经变成了 com.spencer_dev.test.dev 。










本文转自 小强测试帮 51CTO博客,原文链接:http://blog.51cto.com/xqtesting/1685124,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
Android开发
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
|
3月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
239 1
|
1月前
|
Android开发
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
|
1月前
|
Java Unix Linux
Android Studio中Terminal运行./gradlew clean build提示错误信息
遇到 `./gradlew clean build`命令执行出错时,首先应检查错误信息的具体内容,这通常会指向问题的根源。从权限、环境配置、依赖下载、版本兼容性到项目配置本身,逐一排查并应用相应的解决措施。记住,保持耐心,逐步解决问题,往往复杂问题都是由简单原因引起的。
234 2
|
1月前
|
Java Android开发 Windows
玩转安卓之配置gradle-8.2.1
为安卓开发配置Gradle 8.2.1,包括下载和解压Gradle、配置环境变量、修改配置文件以增加国内镜像,以及在Android Studio中配置Gradle和JDK的过程。
73 0
玩转安卓之配置gradle-8.2.1
|
2月前
|
XML IDE 开发工具
🔧Android Studio高级技巧大公开!效率翻倍,编码不再枯燥无味!🛠️
【9月更文挑战第11天】在软件开发领域,Android Studio凭借其强大的功能成为Android开发者的首选IDE。本文将揭示一些提升开发效率的高级技巧,包括自定义代码模板、重构工具、高级调试技巧及多模块架构。通过对比传统方法,这些技巧不仅能简化编码流程,还能显著提高生产力。例如,自定义模板可一键插入常用代码块;重构工具能智能分析并安全执行代码更改;高级调试技巧如条件断点有助于快速定位问题;多模块架构则提升了大型项目的可维护性和团队协作效率。掌握这些技巧,将使你的开发之旅更加高效与愉悦。
64 5
|
6月前
|
Android开发 开发者
Android Split APK介绍
【2月更文挑战第5天】
|
5月前
|
Android开发
Android Gradle开发—脚本实现自动打包后复制一份APK文件,并修改APK名称,到指定目录作备份
Android Gradle开发—脚本实现自动打包后复制一份APK文件,并修改APK名称,到指定目录作备份
276 0
|
6月前
|
XML API Android开发
android S 上 安装apk出现android.os.FileUriExposedException
android S 上 安装apk出现android.os.FileUriExposedException
72 6
|
6月前
|
设计模式 缓存 Java
补齐Android技能树——从AGP构建过程到APK打包过程,安卓rxjava面试
补齐Android技能树——从AGP构建过程到APK打包过程,安卓rxjava面试