android多渠道打包
1.如何查看apk的簽名信息
1將apk解壓空厌;
2.找到META-INF 下的.RSA文件;
3.進入cmd環(huán)境银酬,進入.RSA文件文件所在路徑嘲更,命令:keytool -printcert -file XXX.RSA即可查看簽名信息。
查看Android開發(fā)的數(shù)字簽名信息:
1.cmd環(huán)境下進入C:\Users\用戶名.android目錄下揩瞪;
2.keytool -list -v -keystore debug.keystore赋朦;
debug.keystore
友盟的打包方案(常見) ##:
http://stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/
友盟統(tǒng)計多渠道為例:
1.在AndroidManifest.xml中配置placeholder
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
2.在build.gradle中設(shè)置productFlavors
android {
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
_360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
}
}
或者批量修改
android {
productFlavors {
xiaomi {}
_360 {}
baidu {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
直接執(zhí)行 gradle assembleRelease 慢慢等待打包完成
完整gradle 腳本
apply plugin: 'com.android.application'
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
android {
compileSdkVersion 21
buildToolsVersion '21.1.2'
defaultConfig {
applicationId "com.boohee.*"
minSdkVersion 14
targetSdkVersion 21
versionCode 1
versionName "1.0"
// dex突破65535的限制
multiDexEnabled true
// 默認是umeng的渠道
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]
}
lintOptions {
abortOnError false
}
signingConfigs {
debug {
// No debug config
}
release {
storeFile file("../yourapp.keystore")
storePassword "your password"
keyAlias "your alias"
keyPassword "your password"
}
}
buildTypes {
debug {
// 顯示Log
buildConfigField "boolean", "LOG_DEBUG", "true"
versionNameSuffix "-debug"
minifyEnabled false
zipAlignEnabled false
shrinkResources false
signingConfig signingConfigs.debug
}
release {
// 不顯示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
minifyEnabled true
zipAlignEnabled true
// 移除無用的resource文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 輸出apk名稱為boohee_v1.0_2015-01-15_wandoujia.apk
def fileName = "boohee_v${defaultConfig.versionName}${releaseTime()}${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
}
// 友盟多渠道打包
productFlavors {
wandoujia {}
_360 {}
baidu {}
xiaomi {}
tencent {}
taobao {}
...
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:21.0.3'
compile 'com.jakewharton:butterknife:6.0.0'
...
}
美團快速腳本打包方案:
美團前期打包方案 :
https://tech.meituan.com/mt-apk-packaging.html
原理:是在
MET-INF文件夾中添加個空文件 不需要重新編譯 命名上得以支持 應(yīng)用啟動的時候來讀取名字 區(qū)分渠道
后期由于sdk會就行簽名校驗 APK Signature Scheme v2
https://tech.meituan.com/android-apk-v2-signature-scheme.html
原理:是找個不受保護的 apksingblock這個區(qū)域 添加 id_value操作 寫入渠道信息 然后進行讀取
項目地址:https://github.com/Meituan-Dianping/walle
http://mp.weixin.qq.com/s/YmZ8M4TEd0yfPbNag8R1bw 在美團基礎(chǔ)上 進行封裝 里面包含360加固導(dǎo)致的打包失敗的 解決方法
兩種打包的使用場景 :
對于第一種:友盟打包 主要用于小公司 由于友盟有統(tǒng)計平臺 可以直觀的看到各個渠道的情況 缺點是:每次打包的時候 對于每個渠道都得重新編譯 時間消耗長
對于第二種 :打包時間短 只需要編譯一個包 通過復(fù)制修改內(nèi)部信息 來做到各個渠道的區(qū)別 應(yīng)用每次啟動 來讀取文件信息 請求接口 的時候帶來區(qū)分多渠道 缺點是: 需要后臺自己去做統(tǒng)計 成本較高