当公司需要定制化开发多个APP的时候,这样的APP名称不一样Launcher等都不一样,但是代码逻辑只有一套,只是根据不同的渠道去控制APP的相关功能。以前项目是Eclipse项目的时候只能用Ant打包,但是一次打几十个APK的的时候时间是相当的长,所以就研究如何使用Gradle批量打包,实现资源等相关配置,并且节约大量的打包时间。
如果项目只是一个渠道,就是说只生成一个APK的话src目录下就一个 main文件夹,结构如下图示:
默认的Gradle也就是一些简单的配置,如下
如果要实现多渠道,网上资料常见的就是类似友盟统计的渠道打包,根据AndroidManifest.xml中配置的key统计渠道信息,但是如果需要实现多个APP的打包这样还是不够的,需要在Gradle中实现资源配置等操作。下面就是我项目中用到的配置:
这些都是需要生成的APK,src配置好之后,接下来就需要配置Gradle文件。
release {
ndk {
moduleName "hp_native"
ldLibs "log", "z", "m"
abiFilters "armeabi"//,"armeabi-v7a", "x86"
cFlags "-I/some/include/path"
}
}
debug {
ndk {
moduleName "hp_native"
ldLibs "log", "z", "m"
abiFilters "armeabi", "x86"//, "armeabi-v7a", "x86"
cFlags "-I/some/include/path"
}
}
当然也可以配置APK的输出目录以及输出APK的名称
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = "${variant.productFlavors[0].name}.apk"
output.outputFile = new File("E:/output/apk/release/", fileName)
}
}
}
如图中,我们把main 节点的 res.srcDirs = []和 jni.srcDirs = []置为空,这样的目的就是说,这两部分使用的就是我们其他的OEM的资源文件和jni文件,如果这里不指定[]编译的时候会报错,因为,两个资源文件会有冲突。正确编译之后的结构:
错误的情况大家可以自己试一下,会出现这里面编译的层次混乱,导致最后编译失败
在这里面就可以配置不同的APP的包名 applicationId,签名signingConfig,百度地图key等信息。这样就完成了多渠道打包的基本配置,接下来就可以打包了,打开Terminal输入一下信息就能够打包所有渠道的APK,
gradlew assembleRelease
如果你要打包某一个,输入Terminal输入一下信息:
gradlew assembleXXXRelease
这里XXX就是你配置的productFlavors的名称。
这样就完成了全部的Gradle实现OEM多渠道打包,在此记录研究成果,希望能帮助需要的同学,如果有不明白的可以联系我,也可以下面留言。