关于Android多渠道打包
如果你还不会的话,为什么不用walle呢?
github地址:https://github.com/Meituan-Dianping/walle
美团点评开源的一个项目,教程很详细,一看就会,可以说是非常方便了。
如果还是不会的话,如果想自己实现也不难,只需要在build.gradle中简单配置一下就可以了。
在Manifest中添加渠道标识(名字可以自定义):data android:value="${UMENG_CHANNEL}" android:name="CUSTOM_NAME" />
//Android Studio3.0 要求每个flavor必须有dimensionflavorDimensions "xiaomi" "huawei"//声明你所有的渠道,名字对应Manifest中的productFlavors { xiaomi { dimension "xiaomi" //渠道标识 manifestPlaceholders = [UMENG_CHANNEL: "702003"] //渠道包名不一致时可以单独设置每个包的包名 applicationId = "xx.xx.xx" } huawei { dimension "huawei" //渠道标识 manifestPlaceholders = [UMENG_CHANNEL: "702002"] //渠道包名不一致时可以单独设置每个包的包名 applicationId = "xx.xx.xx" }}
更多Android Studio3.0的规范详见:
https://developer.android.google.cn/studio/build/gradle-plugin-3-0-0-migration.html
此外,还需要把我们的签名信息配置到build.gradle中,在android下新建一个signingConfigs
signingConfigs{ custom{ keyAlias "xxxxx" keyPassword "xxxxx" storePassword "xxxxx" storeFile "xxxxx" } }
如果不想直接把签名信息写在build.gradle中,也可以自己新建一个文件,然后把信息写进去,在build.gradle中直接调用就可以,我个人不想写在build.gradle中是因为只要稍微一动这个文件,就得sync一次,有点麻烦。
比如我是项目里新建了一个keystore.properties来存储项目的签名信息。然后在build.gradle中调用的时候就是这样的:
//调用keystore.properties,传入你keystore的路径 Grovvy语法,其实和java还是有点相似的def keystorePropertiesFile = rootProject.file(".../keystore.properties")def keystoreProperties = new Properties()keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
keystore.properties中是这样的:
keyAlias=xxxxkeyPassword=xxxxstorePassword=xxxxstoreFile=xxxx
配置好之后,在build.gralde中的配置就是这样的
signingConfigs{ custom{ keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storePassword keystoreProperties['storePassword'] storeFile file(keystoreProperties['storeFile']) } }
在android 下的 buildTypes 的 release 下添加:
applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) { // 输出apk名称为apkname_{version}_{productFlavorName}_{releaseTime}.apk def fileName = "apkname${getVersionName()}_${variant.productFlavors[0].name}_${releaseTime()}.apk" output.outputFile = new File(outputFile.parent, fileName) } } } signingConfig signingConfigs.custom//releaseTime方法,Grovvy语法def releaseTime() { return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))}
applicationVariants是系统提供的一个属性,只适用于application module,我们这里用到的variant也是自带的,variant也提供了好多属性,这里用到了outputFile,如果想详细了解:
http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Advanced-Build-Customization
如果不同渠道代码会有差异的话,只需要在src下声明你对应渠道的package,然后把对应渠道的文件放到对应目录下就可以了,
比如xiaomi渠道需要替换一个drawable-xhdpi下名字为logo.png的图片,直接在src下新建xiaomi->res->drawable-xhdpi->logo.png(新的图片),打出来的xiaomi渠道包logo.png就是和别的不同的。替换别的文件也是同理。
配置完成后只需要运行 assembleRelease Tasks就可以自动编译了,或者Ter输入./gradlew assembleRelease,或者选择Build->Generate Signed APK,就可以了。
更多相关文章
- cocos2d-lua:安卓SDK新手接入准备
- Android(安卓)SDK 下载安装及配置
- 使用git工具提交上传代码到GitHub上或者远程仓库
- Android之AndroidManifest.xml文件解析
- lint/pmd/p3c静态代码检查工具的配置与使用
- Eclipse+ADT进行Android应用程序的代码混淆和签名
- Android(安卓)Fragment的三种应用方式
- Android文件存储和读取方式
- Android(安卓)Studio报错--记一次学习官方Room教程时踩的各种坑