gradle 构建不同渠道 APK 包
2015-04-27 11:58
357 查看
在写这篇文章之前必须要对我们万恶的墙吐槽一下,同样的关键字,在百度和google就是完全两个不同的结果。
背景
在目前开发一个app当中,应用一般都会分为内测版、正式版。二者可能会有不同的配置,例如,Constants、packageName、xml等;
如果你是第一次使用gradle 构建android项目建议你先使用
gradle 插件,还有相关依赖包下载下来并且对环境进行初始化,如果出错了,一般可能是下载超时,试多几次即可,最后你会看到如下提示:
The TaskContainer.add() method has been deprecated and is scheduled to be remove d in Gradle 2.0. Please use the create() method instead.
:clean UP-TO-DATE
BUILD SUCCESSFUL
Total time: 7.847 secs
完成以上的步骤,就可以正式使用gralde 构建你的android项目了。
然后使用
最终打包的apk 就在build/apk 目录下了。然后,你会发现,两个apk 一个是 [项目名]-debug-unaligned [项目名]-release-unsigned
gradle 打包一般默认 会打出两个包 一个是 debug 和 release
那么问题来了,这两个版本的apk是如何产生的呢。
解决方案
以前可以通过MAVEN的地址变量对应来解决,而现在gradle提供了 BuildTypes和productFlavors
两种问题的解决方案
1. BuildTypes
buildTypes{} 这种语法是对 debug 和 release 两种版本的apk进行的配置。 在buildTypes当中对于 release版本的apk的配置 可以 配置其签名,log,混淆,zipAlign,报名;等等
如果你的项目里使用了自定义的View,且有自定义的属性时,会需要修正一下xml命名空间里的包名。
如果同时安装两个版本,那么最好能从应用名称上来区别一下,一般我们在
在
2. productFlavors
在build.gradle 当中填写
在 src 下 目录下 新建 与main 同级的 production 和staging 目录,同样里面的目录结构与main一致
注意:如果你的project不是按照上述目录构建,例如你是从eclipse当中导出的AS项目,也没有关系,gradle支持灵活设置项目目录
build.gradle
增加 两个目录 deploy 和 staging 两个目录; 同时需要注意建立的目录顺序一定和主目录的一致(这里同Maven打出不同版本,渠道的apk一样的方式)
在build.gradle当中 可以设置 sourceSets当中指定 staging 和deploy 的目录
3. 运行
图中红色标记的都是 都是不同的打包命令, 可以在AS当中点击单个,同样也可以在命令行当中运行 gradle assembleDeployDebug 等类似命令;图为打包产生apk 的目录
配置默认运行的打包命令
通过图中的配置,就可以配置你要运行到手机或者模拟器当中的apk是那个环境的包了!
背景
在目前开发一个app当中,应用一般都会分为内测版、正式版。二者可能会有不同的配置,例如,Constants、packageName、xml等;
如果你是第一次使用gradle 构建android项目建议你先使用
gradle clean把android
gradle 插件,还有相关依赖包下载下来并且对环境进行初始化,如果出错了,一般可能是下载超时,试多几次即可,最后你会看到如下提示:
BUILD SUCCESSFUL
The TaskContainer.add() method has been deprecated and is scheduled to be remove d in Gradle 2.0. Please use the create() method instead.
:clean UP-TO-DATE
BUILD SUCCESSFUL
Total time: 7.847 secs
完成以上的步骤,就可以正式使用gralde 构建你的android项目了。
然后使用
gradle build就完成了android 项目的构建了。如果,你是照着以上步骤走的话,你将会想项目目录里面看到一个build 的目录,里面就是用gradle 构建android项目的全部例如了,结构目录看附录。
最终打包的apk 就在build/apk 目录下了。然后,你会发现,两个apk 一个是 [项目名]-debug-unaligned [项目名]-release-unsigned
gradle 打包一般默认 会打出两个包 一个是 debug 和 release
那么问题来了,这两个版本的apk是如何产生的呢。
解决方案
以前可以通过MAVEN的地址变量对应来解决,而现在gradle提供了 BuildTypes和productFlavors
两种问题的解决方案
1. BuildTypes
buildTypes{} 这种语法是对 debug 和 release 两种版本的apk进行的配置。 在buildTypes当中对于 release版本的apk的配置 可以 配置其签名,log,混淆,zipAlign,报名;等等
修正资源文件里的包名
如果你的项目里使用了自定义的View,且有自定义的属性时,会需要修正一下xml命名空间里的包名。android.applicationVariants.all { variant ->
def buildType = variant.buildType
def encoding = java.nio.charset.Charset.defaultCharset().toString()
if (buildType.applicationIdSuffix) {
def defaultPackageId = variant.packageName.replaceAll(buildType.applicationIdSuffix,'')
variant.mergeResources.doLast {
def dir = file("${buildDir}/intermediates/res/${variant.dirName}/layout")
dir.listFiles().each { f->
String content = f.getText(encoding)
content = content.replaceAll("res/"+defaultPackageId, "res/"+variant.packageName)
f.write(content, encoding)
}
}
}
}
定制APK的应用名称
如果同时安装两个版本,那么最好能从应用名称上来区别一下,一般我们在AndroidManifest.xml中使用String resource来命名,如下:
<application
...
android:label="@string/app_name" >
在
build.gradle里增加下面的代码就可以为debug版一个特殊的命名了
android.applicationVariants.all { variant ->
def buildType = variant.buildType
def encoding = java.nio.charset.Charset.defaultCharset().toString()
if (buildType.applicationIdSuffix) {
def defaultPackageId = variant.packageName.replaceAll(buildType.applicationIdSuffix,'')
variant.mergeResources.doLast {
def f = file("${buildDir}/intermediates/res/${variant.dirName}/values/values.xml")
String content = f.getText(encoding)
content = content.replaceAll('来往','来往Beta')
f.write(content,encoding)
}
}
}
2. productFlavors
在build.gradle 当中填写
在 src 下 目录下 新建 与main 同级的 production 和staging 目录,同样里面的目录结构与main一致
注意:如果你的project不是按照上述目录构建,例如你是从eclipse当中导出的AS项目,也没有关系,gradle支持灵活设置项目目录
build.gradle
增加 两个目录 deploy 和 staging 两个目录; 同时需要注意建立的目录顺序一定和主目录的一致(这里同Maven打出不同版本,渠道的apk一样的方式)
在build.gradle当中 可以设置 sourceSets当中指定 staging 和deploy 的目录
3. 运行
图中红色标记的都是 都是不同的打包命令, 可以在AS当中点击单个,同样也可以在命令行当中运行 gradle assembleDeployDebug 等类似命令;图为打包产生apk 的目录
配置默认运行的打包命令
通过图中的配置,就可以配置你要运行到手机或者模拟器当中的apk是那个环境的包了!
相关文章推荐
- 使用Gradle构建Android应用的渠道包-Android studio 多渠道打包(超简洁版)
- 使用Gradle构建多个不同applicationId包
- 生成不同ABI版本APK在build.gradle中的配置
- 使用不同版本Gradle构建Andorid 出现Gradle version xxxx is required
- Android studio使用gradle动态构建APP(不同的包,不同的icon、label)
- 使用Jenkins+Git+Gradle自动化构建Android APK包
- Android Studio使用Gradle构建和发布APK
- gradle 神器编译不同的渠道包
- gradle打包的apk与eclipse编译的apk有什么不同
- android studio gradle打包,怎么样通过打不同的包名所依赖的项目不同,即所生成的apk大小不一样呢(每个apk不包含所有的依赖的项目)
- 使用Gradle构建多个不同applicationId包
- 使用Gradle构建Android应用的渠道包
- gradle 打不同包名的apk
- android--jenkins+gradle+android自动化构建apk步骤
- 使用Gradle构建多个不同applicationId包
- 多渠道打包-Gradle构建Android应用的渠道包
- 使用Gradle构建多个类型的多个渠道包
- 使用Gradle构建多个不同applicationId包
- Android使用gradle快速生成渠道apk包。
- 使用gradle手动构建Android项目并打包成APK