Android美團多渠道打包方式
阿新 • • 發佈:2019-01-02
以umeng為例,官方的渠道配置方式:
其中“UMENG_CHANNEL”欄位為渠道資訊,使用美團的方式這裡可以註釋掉,只需填寫api key。<!-- 友盟API Key --> <meta-data android:name="UMENG_APPKEY" android:value="***************"> </meta-data> <!--umeng 渠道 --> <meta-data android:name="UMENG_CHANNEL" android:value="baidu" />
然後在MyApplication中新增如下程式碼
然後是ChannelUtil.java,這個是在別的部落格弄來的,至於來源我是找不到了,所有才寫了這篇部落格做筆記 ^_^public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); String channel=ChannelUtil.getChannel(this, "default channel");//獲取渠道名 AnalyticsConfig.setChannel(channel);//呼叫umeng api設定umeng渠道 } }
import java.io.IOException; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.preference.PreferenceManager; import android.text.TextUtils; public class ChannelUtil { private static final String CHANNEL_KEY = "cztchannel"; private static final String CHANNEL_VERSION_KEY = "cztchannel_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; //預設放在meta-inf/裡, 所以需要再拼接一下 String key = "META-INF/" + channelKey; 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(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 = ""; if (split != null && 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.putInt(CHANNEL_VERSION_KEY, getVersionCode(context)); editor.commit(); } /** * 從sp中獲取channel * @param context * @return 為空表示獲取異常、sp中的值已經失效、sp中沒有此值 */ private static String getChannelBySharedPreferences(Context context){ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); int currentVersionCode = getVersionCode(context); if(currentVersionCode == -1){ //獲取錯誤 return ""; } int versionCodeSaved = sp.getInt(CHANNEL_VERSION_KEY, -1); if(versionCodeSaved == -1){ //本地沒有儲存的channel對應的版本號 //第一次使用 或者 原先儲存版本號異常 return ""; } if(currentVersionCode != versionCodeSaved){ return ""; } return sp.getString(CHANNEL_KEY, ""); } /** * 從包資訊中獲取版本號 * @param context * @return */ private static int getVersionCode(Context context){ try{ return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode; }catch(NameNotFoundException e) { e.printStackTrace(); } return -1; } }
到這裡我們在專案中的工作完成了,然後需要安裝一下python環境 (安裝過程中有問題的自行百度)
登入CSDN 下載py指令碼 (這個東西也是從別人那弄來的,由於時間長了,找不到來源了。。。所以才有了這篇部落格做筆記) 解壓出來
開啟檔案PythonTool\info\channel.txt,把需要的渠道寫在這裡面,每個渠道名佔一行,就是回車,像這個樣子:
上面說的都弄好之後,就開始打包工作了。
1、先使用android studio 或者 eclipse 打一個正常釋出用的安裝包出來。
2、把上一步的apk包放到PythonTool目錄下(就是MultiChannelBuildTool.py同級目錄)
3、滑鼠雙擊MultiChannelBuildTool.py,呵呵,一眨眼的功夫,完事了
4‘、新生成了一個資料夾,裡面就是所有的渠道包了,拿去釋出吧
有知道以上資源原作者的請告知 ^_^