首页 技术 正文
技术 2022年11月21日
0 收藏 572 点赞 2,897 浏览 2982 个字

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

搬砖的道路上,经常会有各种不同的需求,比如今天就碰到过一个打包版本的apk的要求,

比如一个apk给多个客户使用,如张三公司 ,李四集团,而我们的服务端的api域名以及处理方式也不一样,

苦逼的方式是一个一个修改包名,代码,但如果我们使用了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…』,如下图。

android studio多渠道多包名多apk打包

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

android studio多渠道多包名多apk打包

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

如下图:

android studio多渠道多包名多apk打包

android studio多渠道多包名多apk打包

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

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 的原因。

当我们获取到applicationId 以及包名后可以在每次请求服务端api时传递这个值,以实现服务端的一些功能!

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,023
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,513
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,360
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,143
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,774
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,852