1. 程式人生 > >Android幾種常見的多渠道(批量)打包方式介紹

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 。