為Android應(yīng)用增加渠道信息 自動(dòng)化不同渠道的打包過程的使用詳解
為什么需要在應(yīng)用程序中增加渠道信息?
Android應(yīng)用的發(fā)布需要面對(duì)各種各樣的市場(chǎng),我們稱之為渠道。有的時(shí)候,我們需要知道應(yīng)用是從哪個(gè)渠道下載的。比如,我們可能需要統(tǒng)計(jì)哪些市場(chǎng)帶來的用戶量比較大。再比如,我們可能有一些盈利需要和具體的渠道進(jìn)行分成。這些都是統(tǒng)計(jì)渠道的信息。
一般如何在應(yīng)用中加入渠道信息?
為了統(tǒng)計(jì)渠道信息,就不得不在程序的某個(gè)地方加入渠道的信息,然后針對(duì)不同的渠道打不同的包。一般可以在Manifest文件中加入渠道編號(hào),而不直接寫在代碼中。這樣做的好處是,可以針對(duì)不同渠道,自動(dòng)化去修改Manifest文件中的渠道編號(hào),然后自動(dòng)為該渠道打包。
Manifest文件支持Meta Data標(biāo)簽,建議使用這種自定義標(biāo)簽。例如下面的文件片段。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="X"
android:versionName="X.X.X"
package="com.XXX">
……
<application android:icon="@drawable/icon"
android:label="@string/app_name">
……
<meta-data android:name="CHANNEL" android:value="C_001" />
</application>
</manifest>
在這段代碼示例中,我們?cè)贏pplication節(jié)點(diǎn)下增加了一個(gè)meta-data標(biāo)簽,名稱是CHANNEL,值是C_001,是我們規(guī)定的一個(gè)渠道的編號(hào)。
為不同的渠道打包,就要手工或者自動(dòng)化修改C_001成為C_002、C_003等等其它我們定義的渠道編號(hào),然后再打不同的包。
程序如何讀取打包的渠道編號(hào)?
在程序代碼中,可以讀取Manifest文件中定義的meta-data。以下為代碼實(shí)例。
public static String getChannelCode(Context context) {
String code = getMetaData(context, "CHANNEL");
if (code != null) {
return code;
}
return "C_000";
}
private static String getMetaData(Context context, String key) {
try {
ApplicationInfo ai = context.getPackageManager().getApplicationInfo(
context.getPackageName(), PackageManager.GET_META_DATA);
Object value = ai.metaData.get(key);
if (value != null) {
return value.toString();
}
} catch (Exception e) {
//
}
return null;
}
如何自動(dòng)化打包過程?
我們想要自動(dòng)化針對(duì)不同渠道打不同包的過程,有兩種情況。一種是有源代碼的情況,一種是沒有源代碼只有APK文件的情況。
有源代碼的情況。
有源代碼的情況比較簡(jiǎn)單。我們可以使用自動(dòng)化腳本工具進(jìn)行打包,比如使用Ant。
使用Ant打包,有兩個(gè)關(guān)鍵問題:一個(gè)是要在Ant中支持For循環(huán),以自動(dòng)做多次打包動(dòng)作;一個(gè)是如何能夠在Ant中修改Manifest文件,以支持不同的市場(chǎng)。只要解決了這兩個(gè)關(guān)鍵問題,配合Ant的基本功能,就能實(shí)現(xiàn)我們的要求了。
在Ant中支持循環(huán)
在Ant的核心包里沒有相關(guān)的For循環(huán)的Task,要下載相應(yīng)的擴(kuò)展包。可以使用開源的Ant-contrib包。
下載地址:http://ant-contrib.sourceforge.net/
下載完成后,把a(bǔ)nt-contrib里的lib包復(fù)制到安裝好的Ant庫apache-ant-XXX\lib下面,就可以使用了。
具體如何使用,可以參考ant-contrib的官方網(wǎng)站。
在Ant中修改Manifest文件
利用 Ant 擴(kuò)展任務(wù)所提供的 <replaceRegExp> 任務(wù),還可以實(shí)現(xiàn)基于正則表達(dá)式的替換。
例如,要將AndroidManifest.xml文件中的行首“C_001”字符串替換為“C_002”,可以使用如下Ant腳本:
<replaceregexp
file="AndroidManifest.xml"
byline="true"
match="C_001 "
replace="C_002"
/>
<replaceRegExp> 任務(wù)很強(qiáng)大,這只是一個(gè)簡(jiǎn)單的例子。
只有APK文件的情況。
如果沒有源代碼,只有APK文件,事情相對(duì)就稍微復(fù)雜一些了。我們知道有一個(gè)開源的APKTOOL,可以對(duì)APK文件進(jìn)行反編譯,或者重新打包。具體的請(qǐng)參考APKTOOL的官方文件。
有了APKTOOL的幫助,就可以有一個(gè)基本思路。
先使用APKTOOL對(duì)APK文件進(jìn)行反編譯,反編譯出來資源文件和AndroidManifest.xml文件。
使用腳本代碼修改AndroidManifest.xml文件中的渠道ID文本。
使用APKTOOL重新打包成APK文件。
使用jarsigner工具為APK文件簽名。
只要反復(fù)重復(fù)2-4步驟,即可對(duì)不同的渠道打出不同的APK安裝包。
根據(jù)這個(gè)思路,具體的實(shí)現(xiàn)就相對(duì)簡(jiǎn)單了??梢詫懗梢粋€(gè)BAT腳本文件,也可以寫成Java應(yīng)用程序。
相關(guān)文章
android調(diào)用web service(cxf)實(shí)例應(yīng)用詳解
Google為ndroid平臺(tái)開發(fā)Web Service提供了支持,提供了Ksoap2-android相關(guān)架包接下來介紹android調(diào)用web service(cxf),感興趣的朋友可以了解下2013-01-01Android React Native原生模塊與JS模塊通信的方法總結(jié)
這篇文章主要介紹了Android React Native原生模塊與JS模塊通信的方法總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-02-02Android 軟鍵盤彈出隱藏?cái)D壓界面等各種問題小結(jié)
這篇文章主要介紹了Android 軟鍵盤彈出隱藏?cái)D壓界面等各種問題的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-11-11Android實(shí)現(xiàn)史上最簡(jiǎn)單自定義開關(guān)按鈕的方法
在平常的開發(fā)中按鈕是經(jīng)常使用到的控件之一,下面這篇文章主要給大家介紹了關(guān)于Android實(shí)現(xiàn)史上最簡(jiǎn)單自定義開關(guān)按鈕的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04flutter自定義InheritedProvider實(shí)現(xiàn)狀態(tài)管理詳解
這篇文章主要為大家介紹了flutter自定義InheritedProvider實(shí)現(xiàn)狀態(tài)管理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11解析后臺(tái)進(jìn)程對(duì)Android性能影響的詳解
本篇文章是對(duì)Android中后臺(tái)進(jìn)程對(duì)Android性能的影響進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05