Android幾種常見的多渠道(批量)打包方式介紹
2018.05.18編輯,由於谷歌對v2簽名方式的要求,所以現在用新一代打包方式比較方便:
-------------------------------------------------------------------------------------------
多渠道打包,主要是為了統計不同的渠道上包的下載數量,渠道越多,我們需要打的包數量越多,這個時候,我們沒法去使用單純的手動打包去一個一個的生成不同的渠道包,我們需要更高效的打包方式。
宣告渠道方式一:
通常我們區分渠道都是在我們manifest 檔案的 application 用這樣來定義渠道資訊:
<meta-data android:name="UMENG_CHANNEL" android:value="360"/>
然後在我們的Java 程式碼中,我們通過以下方法來獲取渠道號:
/** * 獲取Umeng渠道號 * * @param context * @return 渠道號 */ public static String getChannel(Context context) { String channel = "bbliveBYD"; try { ApplicationInfo info = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); if (info != null && info.metaData != null) { String metaData = info.metaData.getString("UMENG_CHANNEL"); if (!StringUtil.isBlank(metaData)) { channel = metaData; } } } catch (NameNotFoundException e) { e.printStackTrace(); } return channel; }
可以使用這種宣告渠道號方式的打包方法有以下幾種:
1.友盟的打包工具:
使用方式比較簡單,首先按照普通的方式單獨打一個簽名包,然後開啟我們下載的打包工具,建議使用最新的v3.2 (修復了一些前面低版本的Bug)
點選扳手的地方,進行我們應用簽名的配置
最下面給我的配置檔案取個名字。然後儲存。
接下來,將我們前面打的簽名包拖進 友盟打包工具的 加號這裡,等分析結束,點選 一鍵打包即可。 這種方式 有的問題,可以看git上面的說明。
2 藍貝殼兒Eclipse外掛打包。
還有一種打包方式,是 外掛的形式 放在Eclipse 裡面的,叫 藍貝殼兒,是一個jar包,使用也相當方便,早期公司,多渠道的時候,我也是使用這種方式,優點是:安裝該外掛後,只需要簡單配置,既可批量打包。
需要下載一個200kb的Eclipse外掛。
Android 開發輔助工具 — “蘭貝殼兒” Eclipse外掛 使用指南
1. 下載蘭貝殼兒Eclipse外掛
2. 安裝蘭貝殼兒外掛,建立Android工程
3. 使用配置檔案、預設配置檔案
4. 使用”在資源管理器中開啟”功能
5. 使用”依賴更新”功能
6. 使用”打包釋出”功能
1. 下載蘭貝殼兒Eclipse外掛
下載後解壓縮OrchidShell.rar
確認資料夾路徑為OrchidShell---eclipse---plugins
2. 安裝蘭貝殼兒外掛,建立Android工程
安裝Eclipse外掛,將OrchidShell資料夾拷貝到Eclipse的dropins資料夾下後,啟動(重啟)Eclipse
建立Android工程
在工程上點選右鍵可看到選單 “蘭貝殼兒”,說明安裝成功
3. 使用”在資源管理器中開啟”功能
點選蘭貝殼兒選單中的在資源管理器中開啟選單,可以將當前選中的資源所在的資料夾開啟。
如果選中的資源是一個資料夾,那麼外掛會直接開啟這個資料夾
如果選中的資源是一個檔案,那麼外掛會開啟檔案的父資料夾,並且選中該檔案
4. 使用配置檔案、預設配置檔案
蘭貝殼兒使用xml作為外掛配置檔案,當工程中不存在配置檔案,而外掛的某些功能需要用到配置檔案的時候,外掛會新建一個預設的配置檔案。
該配置檔案引用了一個通用的安卓開發工具包。配置了一個簽名用的金鑰庫。你需要根據自己的實際情況修改這個配置檔案。在下面兩個功能中,有詳細介紹。
5. 使用”依賴更新”功能
點選外掛右鍵中的“依賴更新”選單,可以對工程的第三方依賴jar包進行更新管理。
這裡使用的第三方jar包,使用maven管理jar包的組織形式
需要指出的是,這裡的jar包必須有一個統一的下載網站。該網站可以是任何一家maven庫或者maven庫映象。如果您自己有Team的伺服器,當然也可以自己建一個Maven庫來管理常用的通用元件。
點選選單之後,會在Eclipse的控制檯打出更新的過程。
注意,如果配置檔案配置不正確,可能會報出一些錯誤提示,根據錯誤提示進行修改配置檔案即可。
6. 使用”打包釋出”功能
點選蘭貝殼兒選單中的“打包釋出”選單,可以對工程按渠道分別打包,打包的過程中可以對apk檔案進行自動簽名。
注意打包釋出前,需要修改配置檔案中對應的專案:
其中channels 的keyname=””是指在你的AndroidManifest.xml檔案中配置的Application級的<Meta-data>的名稱。例如:
<meta-data android:value="andao007.com" android:name="UMENG_CHANNEL"/>
<meta-data android:value="andao007.com" android:name="gfan_cpid"/>
這裡使用的是友盟的統計SDK和機鋒網的統計SDK,所以名稱為“UMENG_CHANNEL,gfan_cpid”,你可以修改為你自己應用的統計SDK的渠道專案識別符號,如果有多個,使用半形逗號隔開即可。
<channel value=”andao007.com”/>
是對應於你要打包的每個渠道名稱,也就是統計SDK中渠道的識別符號。對於寫在這裡的每個渠道,外掛會自動為其修改meta-data中的value值,並且打包為一個apk檔案。然後為這個apk檔案進行簽名。
<keystore path="F:\Repos\android\keystore\common\common.key" passwd="123456">
<alias name="marsor_common" passwd="123456" />
</keystore>
這裡的keystore就是你對apk檔案進行簽名時使用的個人金鑰。需要你將path修改為你的金鑰庫路徑,passwd為金鑰庫的密碼。
下面的alias是指每個金鑰對應的別名,以及對應的密碼。如果你有多個alias,可以在這裡指定,外掛會選取第一個可用的alias以及密碼對應的金鑰Key對你的apk檔案進行簽名。
<outpath value="F:\Repos\android\keystore\output\" />
這個路徑就是你的apk檔案自動打包生成出來以後的存放路徑。注意外掛會在這個路徑下建立以你的工程名為名稱的資料夾。
3. Gradle 多渠道打包 ,比較新,使用比較簡單
暫未使用Android studio 打過簽名包,故先貼上 生成簽名方法:
點選Android Studio的 Build ,選擇 generate Signed APK。
選擇 create new key store:
j填完 點選OK
然後next 選擇輸出apk 位置。
接下來講一下gradle 多渠道打包
1. 在AndroidManifest.xml中定義佔位符
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}"/>
2. 在module的gradle指令碼中替換佔位符
productFlavors {
wangdoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wangdoujia"]
}
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
anzhi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "anzhi"]
}
}
更多渠道 的話 就按上面的 格式新增, 新增完畢後點擊build----->generate signed apk 即可。
宣告渠道方式二:
最後一種打包方式,在網上也有很多資料,就是根據美團的打包原理,製作的打包工具。
可以參看這邊文章
普通打包方式 時間比較長,是以為需要修改manifest 檔案中
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}"/>
的value, 然後繼續簽名 ,因此耗時。
如果能直接修改apk的渠道號,而不需要再重新簽名能節省不少打包的時間。幸運的是我們找到了這種方法。直接解壓apk,解壓後的根目錄會有一個META-INF目錄,如下圖所示:
如果在META-INF目錄內新增空檔案,可以不用重新簽名應用。因此,通過為不同渠道的應用新增不同的空檔案,可以唯一標識一個渠道。
新增完空渠道檔案後的目錄,META-INFO
目錄多了一個名為mtchannel_meituan
的空檔案:
接下來就可以在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 "";
}
}
這樣,每打一個渠道包只需複製一個apk,在META-INF
中新增一個使用渠道號命名的空檔案即可。這種打包方式速度非常快,900多個渠道不到一分鐘就能打完。
根據美團提供的思路, 在META-INFO中新增一個空的檔案 作為 channel,可以滿足一般我們的渠道要求,那麼不需要簽名,則大大減少了打包時間
因此有了 Android批量打包提速 - 1分鐘900個市場不是夢 這邊文章。
下面是具體步驟:
準備
下載python: https://www.python.org
下載別人寫好的指令碼: https://github.com/GavinCT/AndroidMultiChannelBuildTool
####步驟
1. 拷貝`ChannelUtil.java`到專案中。
2. 程式碼中通過 ChannelUtil.getChannel(this)方法獲取渠道號。
3. 安裝Python。
4. `..PythonTool\info\channel.txt`,裡面去新增自己想要的渠道。
5. 放置apk到`MultiChannelBuildTool.py`所在目錄,雙擊`MultiChannelBuildTool.py`執行指令碼,完成多渠道打包。
下面演示一下 打包
我這裡配置了65個包,一瞬間就打完了。
並且渠道配置也很方便,在專門的 channel.txt 中配置即可。
總結
各種打包方式的比較:
速度上來說,最後一種方式 是無敵的快,並且使用很方便,只需要我們手動打一個簽名包,隨後只需要指令碼去執行即可。
Umeng 打包工具,普通包也可以,但是渠道多了的話,配置麻煩,並且含有so 動態連結庫的 apk 打包可能會出問題
藍貝殼兒 Eclipse打包外掛, 我以前一直用的打包方式,速度比起 美團的打包思路慢,但是一般不會出錯。
資料都是收集與網際網路上的,大家如果有好的思路也多多分享。
謝謝認真觀讀本文的每一位小夥伴,衷心歡迎小夥伴給我指出文中的錯誤,也歡迎小夥伴與我交流學習。歡迎愛學習的小夥伴加群一起進步:230274309 。