Android 利用Gradle批量打渠道包 渠道号是从文件中读取的方便灵活
还有个问题就是每次输出文件的时候有个**unaligned.apk不知道怎么解决.
cd到工程根目录,gradle clean build -Pmc 就可打包了 前提是你得安装运行环境
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
//使用android插件
apply plugin: 'android'
//各种依赖
dependencies {
//添加libs文件夹下的所有jar包
compile fileTree(dir: 'libs', include: '*.jar')
//这里添加其他依赖,可以是本地、远程的库,例如本地libraries/support_v7的库
//compile project(':libraries:support_v7')
}
//下面一段是将libs/*/*.so文件加入打包
//如果你的项目是使用Eclipse+ADT建立的,则需要这段代码
task copyNativeLibs(type: Copy) {
from(new File('libs')) { include '**/*.so' }
into new File(buildDir, 'native-libs')
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
pkgTask.jniFolders = new HashSet<File>()
pkgTask.jniFolders.add(new File(buildDir, 'native-libs'))
}
//开始android配置
android {
//编译版本,这里指定的是最新的19
compileSdkVersion 19
buildToolsVersion "19.0.0"
//配置source路径(如果使用的不是默认路径的话,必须配置)
sourceSets{
main{
manifest {
srcFile 'AndroidManifest.xml'
}
//下面的写法看起来比较简洁,当然你也可以用上面的写法
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
//签名
signingConfigs {
//你自己的keystore信息
myConfig {
storeFile file("chenlei")
storePassword "chenlei"
keyAlias "chenlei"
keyPassword "chenlei"
debuggable=false
}
}
buildTypes {
release {
signingConfig signingConfigs.myConfig
}
}
setup();
}
tasks.withType(Compile) {
options.encoding = "UTF-8"
}
def setup() {
//输入参数中包含 -Pmc 时才进行多渠道构建
if (project.hasProperty('mc')) {
//渠道源
def path = "./build-type/channels.txt"
file(path).eachLine { line ->
android.buildTypes.create( line, {
signingConfig android.signingConfigs.myConfig
runProguard false
proguardFile 'proguard-project.txt'
})
android.sourceSets.findAll { source ->
source.name.equals(line)
}.each { source ->
source.setRoot("./AndroidManifest.xml")
}
}
}
}
//替换AndroidManifest.xml的UMENG_CHANNEL_VALUE字符串为渠道名称
android.applicationVariants.all{ variant ->
variant.processManifest.doLast{
def manifestFile = "${buildDir}/manifests/${variant.dirName}/AndroidManifest.xml"
//将字符串UMENG_CHANNEL_VALUE替换成渠道号
def manifest = new File(manifestFile)
def updatedContent = manifest.getText('UTF-8').replaceAll("UMENG_CHANNEL_VALUE",""+variant.dirName)
manifest.write(updatedContent, 'UTF-8')
//将此次修改过渠道的AndroidManifest.xml文件指定为我们修改过的这个文件
variant.processResources.manifestFile = file(manifestFile)
}
}