利用 Android Studio 和 Gradle 打包多版本APK
视频汇总首页:http://edu.51cto.com/lecturer/index/user_id-4626073.html
======================================
在项目开发过程中,经常会有需要打包不同版本的 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密码 -> 关键来了!如下图。
在『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 属性相同。
如下图:
我们能够看到,这两个属性的默认值是相同的。
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 。
applicationId 和 packageName 它们各自代表什么?
按照上面的结果来说, package 代表了 java 代码中的包名。 applicationId 代表了应用中的唯一标识。和应用签名一起用来区别和其他应用不同。我想这也就是为什么 Google 市场能够允许相同应用不同 applicationId 的原因。
长按下方二维码就可以识别关注
转载于:https://blog.51cto.com/xqtesting/1685124
利用 Android Studio 和 Gradle 打包多版本APK相关推荐
- android studio设置生成的release版本apk的名称
今天,简单讲讲如何使用android studio设置生成apk的名称. 一.首先讲讲如何使用android studio生成release版本的apk. 1.1.前提 发布release 版本,首先 ...
- android 使用jar里 aidl,Android Studio中用gradle打包带AIDL文件的jar文件
关键代码task class_jar(type: Jar) { from "build/intermediates/classes/release/" //核心,将.class 文 ...
- Android Studio 使用 Gradle 打包 Jar
Android Studio 打 Jar 包一直是一个麻烦的事,按照网上现有的教程,打包一个混淆的 jar 需要完成下列步骤: 1.将 plugin 修改为 library 后 build 出 aar ...
- Android开发之Android studio自动签名打包release 版本的正确姿势(完整版) | 文末尾附有Google官方签名教程
1.从以下方面讲解打包正式版本分为: 自动打包(也就是每次项目跑起来就是release正式版本)apk 手动打包:就是每次需要重新签名后选择release正式版本再跑起来生成apk 先说手动版本特别简 ...
- Android Studio默认编译出Release版本apk
在我们打包是进行Make Project,默认编译出来的是Debug包. 在Android Studio的左下角,有一个Build Variants,如图下: 这样Make Project编出来的所有 ...
- Android开发Android studio之gradle打包apk重命名的方法
老套路,先看效果图: 首先第一步在gradle里面(跟android同级)写个获取当前时间的方法如下: //获取时间的方法 GMT+8代表北京时间,下面两个方法都可以 static def getNo ...
- Android Studio通过Gradle命令来编译生成打包APK
博文首发地址:http://www.aplesson.com/?p=999 有的时候我们在Github或者其他地方看到好的开源Android Studio结构的项目,我们想要看到运行效果,所以需要编译 ...
- 修改gradle版本android,Android Studio 修改Gradle版本
Android Studio 修改Gradle版本 2020年07月24日 | 萬仟网移动技术 | 我要评论 Android Studio 修改Gradle版本实际开发中,我们在使用一些demo或者更 ...
- Android studio 和 gradle插件版本对应关系(最新 2022年)
官网链接:Android Gradle 插件版本说明 | Android 开发者 | Android Developers 由于网络的问题,在更新了Android studio版本之后,不能同 ...
最新文章
- JavaScript 中的return true 和return false
- 【数据科学】鱼水说竞赛:如何做好「特征工程」?
- ASP.NET页面级别的事务
- 陕师大计算机科学学院研究生,陕师大研究生
- 苹果或推中国特色版 iPhone;小米回应萌拍抄袭苹果事件;微软停止审核发布 Windows Phone 8.x | 极客头条...
- 提高 Web Service 数据传输效率的基本方法
- 容器技术Docker K8s 39 Serverless Kubernetes(ASK)详解-阿里云Serverless容器(ASK)适用场景与核心功能
- as ssd测试软件得分少,【科普贴】如何读懂AS SSD的测试数据
- Photoshop编辑GIF
- SpringBoot整合EasyExcel实现Excel表格的导出功能
- 静态资源压缩-nginx缓存问题
- 华为智慧屏鸿蒙系统深度评测,八个维度深度评测华为荣耀智慧屏
- 学校计算机桌子尺寸,电脑书桌尺寸多少合适?看完解决所有困惑!
- phpcms 设置page页码 首页、末页、总数据
- Uni-App - 使用 iconfont 图标或者自定义图标
- 用python绘制熊猫图案_在matplotlib中绘制熊猫日期
- 在工作站计算机中创建策略,禁止任何计算机访问本机 8000 端口
- 旅游类小程序源码在哪下载?
- 【转载】浅析金庸武侠小说中的哲理意蕴
- 局域网可以访问,但打印机就是连不上,提示拒绝访问,原来是这个原因
热门文章
- 产品经理——pm具备的五项技能
- -ms-,-moz-,-webkit-,-o-含义及各浏览器内核整理
- 在html中选项卡怎么做,纯css3制作选项卡
- windowsserver2008r2可以装什么模拟器_为什么不可以用塑料桶装汽油?答案就在这!...
- python的装饰器迭代器与生成器_python3 装饰器、列表生成器、迭代器、内置方法详解等(第四周)...
- Python基础之数据类型(一)
- JVM 类加载机制:编译器常量与初始化
- mysql 授权是哪一个表_MySQL授权系统的五个表
- 利用CSS实现文本省略效果
- java.sql.SQLException: No value specified for parameter 1