在项目开发过程中,经常会有需要打包不同版本的 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 SignedAPK…』,如下图。
选择 Module -> 创建 APK key,或者输入 APK key密码 -> 关键来了!如下图。
在『BuildType』处,有三个选项,分别是releas,dev,debug。其中debug为 Android Studio 自带的。
在『Flavors』处,选择我们在 build.gradle 中设置的两个Flavors,以方便直接使用定义在 build.gradle 中自定义的参数。
buildType 和 Flavors 并没有直接的联系。 他们可以根据用户需求互相配合使用。如上图,BuildType 选择了 release,但 Flavors 选择的却是 flavors_dev。
直接执行
./gradlew assembleRelease
assemble结合Build Variants来创建apk,Build Variants = Build Type + Product Flavorassemble 结合 Build Type 创建apk,如:
./gradlew assembleDebug
或./gradlew assembleRelease
assemble 结合 Product Flavor 创建apk,
举例
其实 assemble 是和 Build Variants 一起结合使用的, 举个例子大家就明白了,以友盟多渠道打包为例:
打包全部Release版本:
./gradlew assembleRelease
这条命令会把Product Flavor下的所有渠道的Release版本都打出来。
打包wandoujia渠道版本:
./gradlew assembleWandoujia
此命令会生成wandoujia渠道的Release和Debug版本
打包wandoujia渠道的release版本,执行如下命令就好了:
./gradlew assembleWandoujiaRelease
总之,assemble 命令创建apk有如下用法:
assemble: 允许直接构建一个Variant版本,例如assembleFlavor1Debug。
assemble: 允许构建指定Build Type的所有APK,例如assembleDebug将会构建Flavor1Debug和Flavor2Debug两个Variant版本。
assemble: 允许构建指定flavor的所有APK,例如assembleFlavor1将会构建Flavor1Debug和Flavor1Release两个Variant版本。
打出来的不同版本的包,全部都能够在同一部手机上安装,且能够将两个包全都发布到 Google 市场上,详情请看
关注我的公众号,轻松了解和学习更多技术