1. 程式人生 > >友盟渠道號的問題

友盟渠道號的問題

需求:需要給個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
/>節點不唯一,然後想著在string.xml引用渠道的值,打包以及反編譯再次打包,獲得的渠道號為null,這裡這麼操作為啥獲取不到友盟的channel,我也不太清楚;此路不通,想著友盟最開始初始化的  UMConfigure.init(context,null, context.getString(),UMConfigure.DEVICE_TYPE_PHONE,null);用string.xml引用來解決,但是用apktool翻編譯,再次打包之後仍然獲取不到渠道,最後無意之間在網上看到美團打包,一分鐘打900個包,
3、美團打包,用Python進行二次打包以及一個java工具類獲取渠道號 1)、java工具類
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 "";
	}
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檔案操作,一個渠道號佔一行
文章轉載自這個連結http://blog.csdn.net/u012390044/article/details/50585792 
點選開啟連結包含工具