友盟渠道號的問題
阿新 • • 發佈:2018-12-27
需求:需要給個apk模板,然後用操作工具,打包對應的友盟渠道包
1、友盟多渠道打包
1)、在maniest.xml加入
<meta-data
android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" /> 2)、在gradle檔案中加入 productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
productFlavors {
baidu{}}
這個要加在android{}內 在buildTypes{}中的release中加入 applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name
.endsWith('.apk')) {
// 輸出apk名稱為
def fileName = "輸出名_${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
控制apk輸出目錄以及apk的名字 2、最初的思路是用7zip把apk解壓,然後通過工具來查詢maniest.xml檔案中的 android:name="UMENG_CHANNEL"並將其值替換,發現<meta-data
3、美團打包,用Python進行二次打包以及一個java工具類獲取渠道號 1)、java工具類
2)、python.exe檔案可以去官網下載 https://www.python.org/downloads/或者http://download.csdn.net/download/hujiaxi222/10196673 打包工具下載http://download.csdn.net/download/hujiaxi222/10196658 3)、操作,將apk放入工具類中,雙擊檔案字尾名是.py檔案,就能看到對應的渠道apk,至於修改渠道號去 Info資料夾中的channel.txt檔案操作,一個渠道號佔一行public class ChannelUtil { private static final String CHANNEL_KEY = "cztchannel"; private static final String CHANNEL_VERSION_KEY = "czt_channel_version"; private static String mChannel; /** * 返回市場。 如果獲取失敗返回"" * @param context 上下文 * @return 渠道號 */ public static String getChannel(Context context){ return getChannel(context, ""); } /** * 返回市場。 如果獲取失敗返回defaultChannel * @param context 上下文 * @param defaultChannel 預設的渠道號 * @return 渠道號 */ public static String getChannel(Context context, String defaultChannel) { //記憶體中獲取 if(!TextUtils.isEmpty(mChannel)){ return mChannel; } //sp中獲取 mChannel = getChannelBySharedPreferences(context); if(!TextUtils.isEmpty(mChannel)){ return mChannel; } //從apk中獲取 mChannel = getChannelFromApk(context, CHANNEL_KEY); if(!TextUtils.isEmpty(mChannel)){ //儲存sp中備用 saveChannelBySharedPreferences(context, mChannel); return mChannel; } //全部獲取失敗 return defaultChannel; } /** * 從apk中獲取版本資訊 * @param context 上下文 * @param channelKey 渠道關鍵字 * @return 對應的渠道號 */ private static String getChannelFromApk(Context context, String channelKey) { //從apk包中獲取 ApplicationInfo appInfo = context.getApplicationInfo(); String sourceDir = appInfo.sourceDir; //獲取apk安裝路徑 //預設放在meta-inf/裡, 所以需要再拼接一下 String key = "META-INF/" + channelKey; String ret = ""; ZipFile zipfile = null; try { zipfile = new ZipFile(sourceDir); //開啟指定的zip檔案(sourceDir的路徑是安裝包所在的路徑) Enumeration<?> entries = zipfile.entries(); //返回zip檔案條目的列舉 while (entries.hasMoreElements()) { //判斷列舉是否還有更多的元素 ZipEntry entry = ((ZipEntry) entries.nextElement()); //返回此列舉的下一個zip檔案條目 String entryName = entry.getName(); //返回zip檔案的路徑名 if (entryName.startsWith(key)) { ret = entryName; break; } } } catch (IOException e) { e.printStackTrace(); } finally { if (zipfile != null) { try { zipfile.close(); } catch (IOException e) { e.printStackTrace(); } } } String[] split = ret.split("_"); String channel = ""; //split != null && split.length >= 2預設ret=“”,擷取ret.split("_")會有預設一個長度的陣列 if (split.length >= 2) { channel = ret.substring(split[0].length() + 1); } return channel; } /** * 本地儲存channel & 對應版本號 * @param context 上下文 * @param channel 渠道號 */ private static void saveChannelBySharedPreferences(Context context, String channel){ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); Editor editor = sp.edit(); editor.putString(CHANNEL_KEY, channel); editor.putString(CHANNEL_VERSION_KEY, getVersionCode(context)); editor.apply(); } /** * 從sp中獲取channel * @param context 上下文 * @return 為空表示獲取異常、sp中的值已經失效、sp中沒有此值 */ private static String getChannelBySharedPreferences(Context context){ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); String currentVersionCode = getVersionCode(context); if(TextUtils.isEmpty(currentVersionCode)){ //獲取錯誤 return ""; } String versionCodeSaved = sp.getString(CHANNEL_VERSION_KEY, ""); if(TextUtils.isEmpty(versionCodeSaved)){ //本地沒有儲存的channel對應的版本號 //第一次使用 或者 原先儲存版本號異常 return ""; } if(!currentVersionCode.equals(versionCodeSaved)){ return ""; } return sp.getString(CHANNEL_KEY, ""); } /** * 從包資訊中獲取版本號 * @param context 上下文 * @return 返回當前的版本名 */ private static String getVersionCode(Context context){ try{ return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName; }catch(NameNotFoundException e) { e.printStackTrace(); } return ""; }
文章轉載自這個連結http://blog.csdn.net/u012390044/article/details/50585792