Gradle for Android系列之五 多渠道打包
2017-01-11 09:25
573 查看
我们知道,很多的app需要发布在不同的应用商店中,但是各应用商店对上架的要求有时候又不相同,也就意味着我们需要针对不同的渠道,构建不同的渠道包,如果手动做这些事情,会比较繁琐,那么使用Gradle会方便很多!本篇在前文的基础上介绍一下使用gradle多渠道打包。
今天的内容基本上都是在app目录对应的build.gradle的android方法中设置的。主要是用到了gradle的Android插件里的productFlavors功能。
首先,我们需要设置buildTypes
我们在正常情况下,我们发布生产包,需要签名信息的,这时我们可以配置一下apk的签名信息signingConfigs,
这些签名信息,放在build.gradle文件中可能不安全,所以我们可以将其放在gradle.proprerties中,这样可以所有的module的build.gradle都可以引用,现在gradle.proprerties中配置(其他的属性如compileSdkVersion,buildToolsVersion这些也可以,写在该文件中,可以达到复用的目的 ):
接着我们在build.gradle文件中我们可以像以下一样引用:
配置完签名信息后,我们可以在buildTypes中添加签名属性signingConfig signingConfigs.release:
配置好这些基本的信息后,就需要设置本篇的重点productFlavors,这里用豌豆荚和应用宝做演示:
就这样设置好每个渠道对应的name,当然可以跟着不同渠道的要求,设置相应的属性,例如设置不同的applicationId,不同的启动页面等。接着在AndroidManifest.xml文件的application的标签下设置meta-data:
通过Gradle Android插件里的另一个功能manifestPlaceholders来自动的替换CHANNEL_VALUE,我们还需要在build.gradle文件中添加:
到这里我们已经配置好了各渠道的信息。但是我们通常还需要根据不同的渠道和版本信息来命名apk的名称,以方便我们进行发版:
在app的build目录下生成类似于app-v1.0-wandoujia-debug.apk这种命名方式的apk。到此基本上就能满足一般的需求了。
如果我们在应用启动时候,需要用到渠道的信息,可以这样获取:
今天的内容基本上都是在app目录对应的build.gradle的android方法中设置的。主要是用到了gradle的Android插件里的productFlavors功能。
首先,我们需要设置buildTypes
buildTypes { release { //是否启用混淆 minifyEnabled true //混淆文件配置 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //混淆后的zip优化,默认为true,可以不用设置 zipAlignEnabled true // 移除无用的resource文件 shrinkResources true //是否保留调试信息 debuggable false } debug { //是否启用混淆 minifyEnabled false //混淆文件配置 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //混淆后的zip优化,默认为true,可以不用设置 zipAlignEnabled true // 移除无用的resource文件 shrinkResources true //是否保留调试信息 debuggable true } }
我们在正常情况下,我们发布生产包,需要签名信息的,这时我们可以配置一下apk的签名信息signingConfigs,
signingConfigs { debug { //也可以是xxx.keystore具体要看你使用什么签名了 storeFile file("GradleDemo.jks") storePassword "android" keyAlias "android" keyPassword "android" } release { storeFile file("GradleDemo.jks") storePassword "android" keyAlias "android" keyPassword "android" } }
这些签名信息,放在build.gradle文件中可能不安全,所以我们可以将其放在gradle.proprerties中,这样可以所有的module的build.gradle都可以引用,现在gradle.proprerties中配置(其他的属性如compileSdkVersion,buildToolsVersion这些也可以,写在该文件中,可以达到复用的目的 ):
STORE_PASSWORD="android" KEYALIAS="android" KEYPASSWORD="android" STORE_PATH="GradleDemo.jks"
接着我们在build.gradle文件中我们可以像以下一样引用:
signingConfigs { release { storeFile file(STORE_PATH) storePassword STORE_PASSWORD keyAlias KEYALIAS keyPassword KEYPASSWORD } release { storeFile file(STORE_PATH) storePassword STORE_PASSWORD keyAlias KEYALIAS keyPassword KEYPASSWORD } }
配置完签名信息后,我们可以在buildTypes中添加签名属性signingConfig signingConfigs.release:
buildTypes { release { //是否启用混淆 minifyEnabled true //混淆文件配置 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //混淆后的zip优化,默认为true,可以不用设置 zipAlignEnabled true // 移除无用的resource文件 shrinkResources true //是否保留调试信息 debuggable false signingConfig signingConfigs.release } debug { //是否启用混淆 minifyEnabled false //混淆文件配置 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //混淆后的zip优化,默认为true,可以不用设置 zipAlignEnabled true // 移除无用的resource文件 shrinkResources true //是否保留调试信息 debuggable true signingConfig signingConfigs.debug } }
配置好这些基本的信息后,就需要设置本篇的重点productFlavors,这里用豌豆荚和应用宝做演示:
productFlavors { wandoujia {} yingyongbao {} }
就这样设置好每个渠道对应的name,当然可以跟着不同渠道的要求,设置相应的属性,例如设置不同的applicationId,不同的启动页面等。接着在AndroidManifest.xml文件的application的标签下设置meta-data:
<meta-data android:name="CHANNEL" android:value="${CHANNEL_VALUE}"/>
通过Gradle Android插件里的另一个功能manifestPlaceholders来自动的替换CHANNEL_VALUE,我们还需要在build.gradle文件中添加:
productFlavors.all { flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name] }
到这里我们已经配置好了各渠道的信息。但是我们通常还需要根据不同的渠道和版本信息来命名apk的名称,以方便我们进行发版:
//app-v1.0-wandoujia-debug.apk applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) { // 输出apk名称为wooyun_v1.0_wandoujia.apk def fileName = "app-v${variant.versionName}-${variant.productFlavors[0].name}-${variant.buildType.name}.apk".toLowerCase() output.outputFile = new File(outputFile.parent, fileName) } } }
在app的build目录下生成类似于app-v1.0-wandoujia-debug.apk这种命名方式的apk。到此基本上就能满足一般的需求了。
如果我们在应用启动时候,需要用到渠道的信息,可以这样获取:
public static String getChannelName(Context ctx) { if (ctx == null) { return null; } String channelName = null; try { PackageManager packageManager = ctx.getPackageManager(); if (packageManager != null) { //注意此处为ApplicationInfo 而不是 ActivityInfo,因为我们设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo ApplicationInfo applicationInfo = packageManager.getApplicationInfo(ctx.getPackageName(), PackageManager.GET_META_DATA); if (applicationInfo != null) { if (applicationInfo.metaData != null) { channelName = applicationInfo.metaData.getString(""); } } } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return channelName; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题