美團多渠道打包原理以及使用

美團多渠道打包原理以及使用

2016-08-10 14:50 1048人閱讀 評論(0) 收藏 舉報java

 分類:python

Android(8) git

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。github

目錄(?)[+]app

傳統打包方法原理

  • 傳統的打包方法都是在AndroidManifest添加渠道標示,每打一次包修改一次標示的名稱。效率特別的低,一個稍微大一點的項目打上幾十個渠道包可能須要幾個小時半天的時間。

 

美團打包方法原理

  • 因爲傳統的打包方式每次修改渠道都須要從新的構建項目,時間都浪費構建上面了,美團提供了一種新的打包方案,將APK直接當作zip解壓目錄裏會有一個META-INF目錄而此目錄是不參與簽名校驗的。所以在META-INF目錄內添加不一樣的空文件,能夠惟一標識一個渠道。採用這種方式,每打一個渠道包只需複製一個apk,在META-INF中添加一個使用渠道號命名的空文件便可。

 

  • 因此打包能夠分紅兩大步。 第一步在META-INF目錄內添加不一樣的空文件,用於標識渠道。(不會寫? 不用擔憂, 已經有大神給咱們寫好了。: https://github.com/GavinCT/AndroidMultiChannelBuildTool 下載便可。Python 寫的)
  •     

 

  • 第二步: 在咱們的代碼中獲取到META-INF目錄中的渠道文件名稱

[java] view plain copy工具

 在CODE上查看代碼片派生到個人代碼片

  1. /** 
  2.  * 從apk中獲取版本信息 
  3.  * @param context 
  4.  * @param channelKey 
  5.  * @return 
  6.  */  
  7. private static String getChannelFromApk(Context context, String channelKey) {  
  8.     //從apk包中獲取  
  9.     ApplicationInfo appinfo = context.getApplicationInfo();  
  10.     String sourceDir = appinfo.sourceDir;  
  11.     //注意這裏:默認放在meta-inf/裏, 因此須要再拼接一下  
  12.     String key = "META-INF/" + channelKey;  
  13.     String ret = "";  
  14.     ZipFile zipfile = null;  
  15.     try {  
  16.         zipfile = new ZipFile(sourceDir);  
  17.         Enumeration<?> entries = zipfile.entries();  
  18.         while (entries.hasMoreElements()) {  
  19.             ZipEntry entry = ((ZipEntry) entries.nextElement());  
  20.             String entryName = entry.getName();  
  21.             if (entryName.startsWith(key)) {  
  22.                 ret = entryName;  
  23.                 break;  
  24.             }  
  25.         }  
  26.     } catch (IOException e) {  
  27.         e.printStackTrace();  
  28.     } finally {  
  29.         if (zipfile != null) {  
  30.             try {  
  31.                 zipfile.close();  
  32.             } catch (IOException e) {  
  33.                 e.printStackTrace();  
  34.             }  
  35.         }  
  36.     }  
  37.     String[] split = ret.split("_");  
  38.     String channel = "";  
  39.     if (split != null && split.length >= 2) {  
  40.         channel = ret.substring(split[0].length() + 1);  
  41.     }  
  42.     return channel;  
  43. }  


 

實踐使用:

  • 第一步:配置python環境:

                咱們既然須要使用腳本打包,那麼相應的電腦上必須有能夠運行python腳本的運行環境。因此咱們第一步是要配置python運行環境。
                本身去官網下載安裝便可,很是簡單。官網地址:https://www.python.org/ui

 

  • 第二步:編寫python腳本:

                好心人已經把運行的打包腳本寫好了,而且也封裝了讀取渠道號的實體工具類。你們只須要去github上下載便可。this

                地址:https://github.com/GavinCT/AndroidMultiChannelBuildTool固然在github上也有相關的使用介紹,很是簡單,一看就懂。這裏簡單說下,spa

                下載下來有個ChannelUtil.java類,裏面封裝好了獲取渠道號的方法,只須要在啓動應用程序的地方調用友盟的設置代碼便可,.net

                好比:AnalyticsConfig.setChannel(ChannelUtil.getChannel(this))。

  • 第三步:配置渠道列表

                咱們在github上把python腳本下載下來以後,解壓文件,在PythonTool/Info/channel.txt中編輯渠道列表,沒寫一個渠道名,換行便可。

 

  • 第四步:運行腳本

                把已經簽名打包好的apk文件,複製到PythonTool目錄下和MultiChannelBuildTool.py這個腳本同級,直接雙擊點擊MultiChannelBuildTool.py

                便可完成打包。

相關文章
相關標籤/搜索