文档章节

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

IT-Carl
 IT-Carl
发布于 2017/03/29 10:37
字数 1216
阅读 64
收藏 0

这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识、前端、后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过!

在项目开发过程中,经常会有需要打包不同版本的 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 节点下添加如下代码

 
  1. buildTypes {
  2.  
  3.     //这里的名字自定义,不要求大小写
  4.     release{
  5.     
  6.         // 这里是在 applicationId 中添加了一个后缀。所以『.』要加上
  7.         applicationIdSuffix ".release" 
  8.         
  9.         // 这里的作用是选择是否混淆代码
  10.         minifyEnabled false
  11.         proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  12.     }
  13.  
  14.     dev{
  15.         applicationIdSuffix ".dev"
  16.         minifyEnabled false
  17.         proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  18.  
  19.     }
  20. }
  21.  
  22. // 这里是为了不同过的版本设置一些特殊的参数,并不直接和 buildType 关联。
  23. //例如:使用 buildType 中的 dev 版本,也可以使用 flavors_release 里面设置的自定义参数。这需要自己按照需求制定。
  24. productFlavors{
  25.  
  26. //自定义名字不过不能和上面buildType中相同,不然Gradle编译会不通过。在这里使用了『flavors_』前缀以便区分。
  27.     flavors_release{
  28.     
  29.     // manifestPlaceholders中写到的『str』,『package_name』不支持用大写,否则Gradle编译会不通过。
  30.     // 这里所设置的变量可以直接使用在『AndroidManifest.xml』中,使用方式为:${package_name}
  31.     // android:label="${package_name}" 
  32.         manifestPlaceholders = [str:"releaseStr",package_name:"com.sunhz.mvptest.release"]
  33.  
  34.         // 这里的参数是为了在 java 代码中使用,具体的使用方式为:context.getResources().getString(R.string.strKey);
  35.         resValue("string" , "strKey","releaseStrValue")
  36.     }
  37.  
  38.     flavors_dev{
  39.         manifestPlaceholders = [str:"devStr",package_name:"com.sunhz.mvptest.dev"]
  40.  
  41.         resValue("string" , "strKey","devStrValue")
  42.     }
  43. }

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

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

image

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

image

在『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 属性相同。

如下图:

image

image

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

applicationId 和 packageName 它们是什么关系?

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

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

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

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

 
  1. PackageManager packageManager = mContext.getPackageManager();
  2. List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS);
  3. List<String> packageNameList = new ArrayList<String>();
  4. for (PackageInfo packageInfo : packageInfoList) {
  5.     packageNameList.add(packageInfo.packageName);
  6. }

我们打印出来的包名信息中,会出现 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 。

applicationId 和 packageName 它们各自代表什么?

按照上面的结果来说, package 代表了 java 代码中的包名。 applicationId 代表了应用中的唯一标识。和应用签名一起用来区别和其他应用不同。我想这也就是为什么 Google 市场能够允许相同应用不同 applicationId 的原因。

© 著作权归作者所有

IT-Carl

IT-Carl

粉丝 4
博文 6
码字总数 6318
作品 0
深圳
高级程序员
私信 提问
Gradle和Gradle插件

文章是翻译整理的官网文档developer.android/studio/build/ 一、Gradle和Gradle插件 Gradle:Gradle是一款帮助开发人员更快更好的编译、自动化运行和分发软件的工具。Gradle具有无与伦比的通...

都有米
2018/06/19
0
0
为什么是Gradle? -- Gradle教程(一)

原文链接:http://www.woaitqs.cc/gradle/2016/12/20/android-gradle-1.html 开发 Android 的同时,也应该了解其构建构建工具。特别是在实际的生产开发项目中,对于需要分发的包有各式各样的...

_qisen
2016/12/20
0
0
给 Android 开发者的 Gradle 入门指南

本文的目的是为您提供关于 Gradle 的高级概述,以及在开发 Android 应用程序时如何适应整个构建系统。 我将通过 Gradle 和 Gradle 的 Android 插件的基础知识,以及新的 Android 项目附带的默...

oschina
2017/11/22
3.5K
2
史上最详细的Android Studio系列教程五--Gradle命令详解与导入第三方包

Android Studio + Gradle的组合用起来非常方便,很多第三方开源项目也早都迁移到了Studio,为此今天就来介绍下查看、编译并导入第三方开源项目的方法。 Sublime + Terminal编译并查看源码 首...

让代码飞一会
2015/07/05
600
1
Android studio 使用心得(四)---android studio 多渠道打包(二)

版权声明:本文出自veidy的博客,转载必须注明出处 转载请注明出处:http://my.oschina.net/aibenben/blog/370985 Android studio 使用心得(四)---android studio 多渠道打包 这篇文章讲了一...

veidy
2015/01/23
18.6K
3

没有更多内容

加载失败,请刷新页面

加载更多

刚哥谈架构 (二) 我眼中的架构师

之前在公司,有小伙伴在向别人介绍我的时候,经常会有人这么说:“刚哥是我们的architcture”,如果来人是老外,心中一定是一惊,心中暗叹,“这位匪首看上去貌不惊人,难道已经做到了架构和...

naughty
32分钟前
2
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
85
3
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部