Android Studio Gradle 打包
友盟渠道设置
<meta-data
android:name="UMENG_APPKEY"
android:value=""/>
<meta-data
android:name="UMENG_CHANNEL"
android:value=""/>
通常都是在AndroidManifest.xml文件中写入一个meta标签,用来标识该渠道,每次打包就要更改清单文件,所以一般渠道不多的,可以通过Ant或者Gradle、apktool 来给程序进行多渠道批量打包.
Ant 打包与apktool 则要重新签名这两种方式比较麻烦,As 作为谷歌推荐新一代构建工具,Gradle 命令可以批量打包,缺点时间久。
步骤1 配置占位符
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
步骤二 配置Gradle
apply plugin: 'com.android.application'
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
android {
def globalConfiguration = rootProject.extensions.getByName("ext")
compileSdkVersion globalConfiguration.getAt("androidCompileSdkVersion")
buildToolsVersion globalConfiguration.getAt("androidBuildToolsVersion")
defaultConfig {
applicationId "com.lazy.gank"
minSdkVersion globalConfiguration.getAt("androidMinSdkVersion")
targetSdkVersion globalConfiguration.getAt("androidTargetSdkVersion")
versionCode 1
versionName "1.0"
}
//配置签名文件
signingConfigs {
myConfig {
//绝对路径和相对路径都可以
storeFile file("lazy.jks")
storePassword "123456"
keyAlias "android"
keyPassword "123456"
}
}
//下面的代码开始打批量包
productFlavors {
// Define separate dev and prod product flavors.
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
QQ {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "QQ"]
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
//改文件名
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = "Gank_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
//def fileName = outputFile.name.replace(".apk", "-gra${defaultConfig.versionName}.apk")
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
步骤三 运行打包命令
在项目根目录,以终端执行以下命令, assembleRelease 是生成所有productFlavorsv下的Release渠道包
gradlew assembleRelease ## 打Release包
gradlew assembleDebug ## 只打Debug包, Debug 与 Release 区别不用多说
gradlew assembleQQRelease ## 只打QQ渠道包
Python 脚本打包(美团自动化打包)
直接参考 美团Android自动化之旅—生成渠道包
META-INF
谷歌签名打包算法,如果在META-INF目录内添加空文件,可以不用重新签名应用。因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道。这种打包方式我亲身体验过速度的确非常快。
步骤1 利用Python 脚本向apk 的META-INF 目录写入带渠道标识为命名的空文件
步骤2 动态解析apk里的META-INF目录下的带有渠道标识命名的文件获取该渠道
Zip注释字段
在apk的末尾有一个 注释字段,修改该字段,同样对apk 签名无影响,因为它并不属于apk文件, 所以无非写入注释,读取带注释的渠道名
步骤1 向apk文件写入注释
步骤2 向apk读取注释(渠道)
coding
Android中如何 获取apk文件 path
ApplicationInfo 类
/**
* Full path to the base APK for this application.
*/
public String sourceDir;
umeng 动态设置 channel
MobclickAgent.UMAnalyticsConfig config = new MobclickAgent.UMAnalyticsConfig(this, Config.UMENG_APPKEY, mChannelId);
MobclickAgent.startWithConfigure(config);