參考:https://segmentfault.com/a/1190000003763833
生成keystore
使用命令行
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
按上圖命令分別輸入的是簽名文件名,別名父泳,指明生成的是2048位RSA秘鑰,簽名有效期。
一民轴、使用gradle打包
android studio 多渠道打包CMD命令:gradle assembleRelease
需要在命令提示行(管理員)中定位到項(xiàng)目位置盹沈,然后輸入gradle
初始化gradle環(huán)境硼控,然后輸入如上命令。
使用Umeng進(jìn)行渠道統(tǒng)計(jì)动壤,一般都是在manifest文件中寫入一個meta標(biāo)簽,meta的key值固定,通過循環(huán)改變meta中的value值來實(shí)現(xiàn)市場渠道的寫入淮逻。
<meta-data android:name="UMENG_CHANNEL" android:value="Channel_ID" />
a .將渠道名稱都寫到channel.txt中琼懊,然后在build.gradle配置阁簸,讀取文件。
// productFlavors
productFlavors {
def path = "./channel.txt"
file(path).eachLine { channel ->
"$channel" {
manifestPlaceholders = [UMENG_VALUE: channel]
}
}
}
b.直接在build.gradle里面配置渠道名稱
// 友盟多渠道打包
productFlavors {
wandoujia {}
// _360 {}
// baidu {}
// xiaomi {}
// tencent {}
// taobao {}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
或者
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
qihoo {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qihoo"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
qq {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qq"]
}
}
使用命令進(jìn)行多渠道打包
a. 打包全部渠道
// 打包全部Debug版本
./gradlew assembleDebug
// 打包全部Release版本
./gradlew assembleRelease
b.指定渠道版本 (assemble+Product Flavor)
// 打包wandoujia渠道的Release版本和Debug版本
./gradlew assembleWandoujia
// 打包wandoujia渠道的Release版本
./gradlew assembleWandoujiaRelease
缺點(diǎn):當(dāng)渠道很多的時候哼丈,每一次打包都要進(jìn)行構(gòu)建編譯启妹,執(zhí)行效率低下,耗時長醉旦。
—
二饶米、美團(tuán)的打包方案
這個方案依賴于google的簽名機(jī)制,如果google改變android的簽名機(jī)制的話這個方案就無法使用了车胡。
Github上有人寫了這個方法的庫:https://github.com/GavinCT/AndroidMultiChannelBuildTool檬输,其博客講解網(wǎng)址為:http://www.cnblogs.com/ct2011/p/4152323.html
美團(tuán)的打包原文網(wǎng)址:http://tech.meituan.com/mt-apk-packaging.html
如果能直接修改apk的渠道號,而不需要再重新簽名能節(jié)省不少打包的時間匈棘。幸運(yùn)的是我們找到了這種方法丧慈。直接解壓apk,解壓后的根目錄會有一個META-INF目錄主卫,如下圖所示:META-INF目錄如果在META-INF目錄內(nèi)添加空文件逃默,可以不用重新簽名應(yīng)用。因此簇搅,通過為不同渠道的應(yīng)用添加不同的空文件完域,可以唯一標(biāo)識一個渠道。采用這種方式馍资,每打一個渠道包只需復(fù)制一個apk筒主,在META-INF中添加一個使用渠道號命名的空文件即可。這種打包方式速度非衬裥罚快乌妙,900多個渠道不到一分鐘就能打完。
在META-INF目錄內(nèi)添加空文件建钥,可以不用重新簽名應(yīng)用藤韵。文件名稱可以命名為channel+渠道的唯一標(biāo)識。
然后在需要讀取渠道號的時候熊经,可以在使用java代碼直接讀取泽艘,獲取渠道號。
public static String getChannel(Context context) {
ApplicationInfo appinfo = context.getApplicationInfo();
String sourceDir = appinfo.sourceDir;
String ret = "";
ZipFile zipfile = null;
try {
zipfile = new ZipFile(sourceDir);
Enumeration<?> entries = zipfile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = ((ZipEntry) entries.nextElement());
String entryName = entry.getName();
if (entryName.startsWith("mtchannel")) {
ret = entryName;
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (zipfile != null) {
try {
zipfile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
String[] split = ret.split("_");
if (split != null && split.length >= 2) {
return ret.substring(split[0].length() + 1);
} else {
return "";
}
}
這樣镐依,每打一個渠道包只需復(fù)制一個apk匹涮,在META-INF中添加一個使用渠道號命名的空文件即可。
常見問題答疑
這部分問題是由美團(tuán)大神丁志虎在微博上答復(fù)的槐壳,摘錄如下:
這個方案沒法解決不同渠道使用渠道自己SDK的問題然低,友盟的SDK提供了在代碼中設(shè)置渠道的方式,所以再獲取到渠道號后再調(diào)用SDK相關(guān)設(shè)置渠道的方法就可以了
apk用的是java那一套簽名,放在META-INF文件夾里的文件原則上是不參與簽名的雳攘。如果Google修改了apk的簽名規(guī)則带兜,這一套可能就不適用了。