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是如何产生的呢。
修正资源文件里的包名
如果你的项目里使用了自定义的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)
}
}
}