本文是对上篇文章的补充,重点是gradle从其他文件中获取相关数据
从proties文件中获取数据
build.gradle:
apply plugin: 'com.android.application'
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
android {
……省略很多
manifestPlaceholders = [UMENG_CHANNEL_VALUE : "umeng",
UMENG_APPKEY_VALUE : properties.getProperty("umengAppKey"),
]
文件中是这么写的
local.properties:
sdk.dir=/Users/lanyy/Documents/adt/sdk
umengAppKey=*************
从xml文件中读取
可参考:http://www.infoq.com/cn/articles/android-in-depth-gradle
自定义apk名
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
buildTypes {
release{
signingConfig signingConfigs.myConfig
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 输出apk名称为1.0_2015-01-15_wandoujia.apk
def fileName = "${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
}
将apk输出到指定位置
这里同样用上述的栗子,只要将最后一句
output.outputFile = new File(outputFile.parent, fileName)
修改为
output.outputFile = new File("自定义文件夹", fileName)
这个时候apk会输出到app项目下的一个叫自定义文件夹的文件夹
自动循环打包
这其实是我同事研究的成果,场景是要将服务器配置,及相关其他数据放进另外的文件中,gradle读取文件,从而打包。这里说的有点抽象,直接上代码。
首先有一个xml文件,我们把它取名为apkproperties.xml
里面的内容为
<?xml version="1.0" encoding="utf-8"?>
<apks>
<apk name = "dev" serverpath="服务器地址" uploadfileserverip="上传ip" uploadfileserverport="上传端口">
</apk>
<apk name = "test" serverpath="服务器地址" uploadfileserverip="上传ip" uploadfileserverport="上传端口">
</apk>
<apk name = "demo"serverpath="服务器地址" uploadfileserverip="上传ip" uploadfileserverport="上传端口">
</apk>
</apks>
gradle这么写
productFlavors {
//def apks = new XmlParser().parseText(xml)
def xmlFile = file('apkproperties.xml')
def file = file(xmlFile.absolutePath)
def apks = new XmlParser().parse(file.path)
apks.apk.each{
def name = it.'@name'
def serverpath = it.'@serverpath'
def uploadfileserverip = it.'@uploadfileserverip'
def uploadfileserverport = it.'@uploadfileserverport'
"${name}"({
manifestPlaceholders = [SERVER_PATH_VALUE: "$serverpath",UPLOAD_FILE_SERVER_IP_VALUE: "$uploadfileserverip",UPLOAD_FILE_SERVER_PORT_VALUE: "$uploadfileserverport"]
}
)
}
}
这样就能自动打出三个,分贝demo,dev,test不同环境的包了。
其实gradle是十分灵活的,熟练他的语法才能创造出更加灵活的打包方式!
参考:http://stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/