我們的APP開發(fā)結(jié)束后,接下來的工作就是上線不同的應(yīng)用市場(chǎng)庇配。不同的應(yīng)用市場(chǎng)對(duì)于上線的apk文件可能會(huì)有不同的要求斩跌,所以我們要針對(duì)不同的應(yīng)用市場(chǎng)來分別打包。這就是多渠道打包捞慌。
另一方面耀鸦,我們可能要獲取不同應(yīng)用市場(chǎng)的下活躍用戶的數(shù)量,以及不同應(yīng)用市場(chǎng)下apk的運(yùn)行情況卿闹。這時(shí)候就需要在代碼里加入上傳這個(gè)apk的應(yīng)用市場(chǎng)信息揭糕。再比如需要在不同渠道發(fā)布的apk里面,指定不同的啟動(dòng)Activity锻霎,或者根據(jù)不同的應(yīng)用市場(chǎng)來執(zhí)行不同的代碼片段著角。那么你更應(yīng)該看下本文了。
一旋恼、多渠道打包
使用Gradle多渠道打包有很多種吏口,下面介紹一種我經(jīng)常使用到的。
- 在AndroidManifest中使用manifestPlaceholders占位符
<meta-data
android:name="CHANNEL_NAME"
android:value="${CHANNEL_NAME}" />
- 在build.gradle中的android根節(jié)點(diǎn)下加入
productFlavors {
_360 {
manifestPlaceholders = [ CHANNEL_NAME:"360"]
}
xiaomi {
manifestPlaceholders = [ CHANNEL_NAME:"xiaomi"]
}
umeng {
manifestPlaceholders = [ CHANNEL_NAME:"UMENG" ]
}
wandoujia {
manifestPlaceholders = [ CHANNEL_NAME:"WANDOUJIA" ]
}
}
注意
①這里的CHANNEL_NAME要與AndroidManifest中的${CHANNEL_NAME}對(duì)應(yīng)冰更。
②渠道名不能是純數(shù)字产徊,比如360,會(huì)編譯不過的蜀细。要適當(dāng)?shù)男薷囊幌隆?/p>
-
完成了這些之后舟铜,同步一下。然后進(jìn)行打包:Build->Generate Signed APK奠衔,然后選擇簽名文件谆刨,這時(shí)候的flavors就會(huì)顯示我們定義的渠道名稱塘娶。按住ctrl選擇要打包的市場(chǎng),然后進(jìn)行打包痊夭,就可以生成對(duì)應(yīng)的apk了刁岸。
多渠道打包 -
打完包,會(huì)一下打出多個(gè)包她我。如下圖:
多渠道打包 - 至此虹曙,多渠道打包完成。
二番舆、多渠道定制
有時(shí)候我們希望apk在執(zhí)行同一功能是根據(jù)市場(chǎng)不同酝碳,去執(zhí)行不同的代碼。比如需要在不同渠道發(fā)布的apk里面合蔽,指定不同的啟動(dòng)Activity击敌。比如在豌豆莢里面發(fā)布的,啟動(dòng)的Activity顯示的是豌豆莢首發(fā)的界面拴事,應(yīng)用寶里面啟動(dòng)的是應(yīng)用寶首發(fā)的界面沃斤。再比如,不同市場(chǎng)的apk版本號(hào)要分開刃宵,小米應(yīng)用市場(chǎng)的apk是1.0.1衡瓶,豌豆莢的是1.0.3,應(yīng)用寶的是1.1.0牲证。
那么你可以按照下面這么做哮针,打包apk的時(shí)候,根據(jù)渠道不同分別打包對(duì)應(yīng)渠道下的代碼坦袍。
舉個(gè)例子十厢,我有一個(gè)類AndFixActivity。這個(gè)類中有一個(gè)顯示渠道名稱的TextView捂齐。這個(gè)TextView通過獲取strings中的channel_name來顯示當(dāng)前的渠道名稱蛮放。但是,我希望在打包小米和豌豆莢這兩個(gè)渠道的時(shí)候奠宜,分別顯示小米和豌豆莢包颁,其他渠道保持默認(rèn)值。來看下步驟:
- 在src下新建與main同級(jí)的目錄压真,比如xiaomi娩嚼、wandoujia。這個(gè)目錄名要和productFlavor下的渠道名相同滴肿。
-
保持和main中目錄結(jié)構(gòu)一致的情況下岳悟,分別復(fù)制一個(gè)res/values/strings.xml類到xiaomi和wandoujia目錄下。然后把這個(gè)strings.xml下的channel_name的值分別改為“小米”和“豌豆莢”泼差。
小米
豌豆莢 - 剩下的就和多渠道打包一樣了竿音。在build.gradle中android根節(jié)點(diǎn)上加入productFlavor和屎,加入wandoujia和xiaomi的flavor,然后打包春瞬。就可以了。
注意
可以防止java代碼套啤、res資源和AndroidManifest到flavor下宽气。flavor跟main的文件是會(huì)合并的,但是合并存在一定的規(guī)則潜沦。
①java中代碼合并萄涯,如果有相同的文件是會(huì)報(bào)錯(cuò)重復(fù)錯(cuò)誤的,所以main文件夾中唆鸡,應(yīng)該存放共有的代碼涝影,而flavor文件夾中存放自己所需要的獨(dú)立的代碼。
②res中資源的合并争占,優(yōu)先級(jí)是flavor高于main燃逻,即flavor中資源會(huì)加入或覆蓋main中資源。如果special渠道要求指定的icon和appName臂痕,則在special中res中替換到默認(rèn)的icon伯襟,在string.xml中改正相應(yīng)的appName即可。
③AndroidManifest.xml合并握童,其實(shí)也是增加和覆蓋.
三姆怪、應(yīng)用多開
實(shí)現(xiàn)在一臺(tái)設(shè)備上同時(shí)安裝多個(gè)相同包名的apk。
一般我們?cè)谝慌_(tái)設(shè)備上安裝了一個(gè)apk澡绩,如果再安裝一個(gè)相同包名的apk稽揭,就會(huì)提示覆蓋安裝。這是因?yàn)槊總€(gè)apk在編譯的時(shí)候有一個(gè)applicationId肥卡。如果你第二次安裝apk的時(shí)候溪掀,設(shè)備上已經(jīng)有這個(gè)applicationId的APP了,你再安裝相同applicationId的APP召调,就會(huì)提示覆蓋安裝膨桥。
但是,有時(shí)候我們要對(duì)比一下不同渠道下的APP唠叛。簡(jiǎn)單粗暴地用兩臺(tái)設(shè)備只嚣,來回切換調(diào)試都想到麻煩。我們完全可以通過多渠道來配置不同的applicationId從而實(shí)現(xiàn)應(yīng)用多開艺沼。
通常在build.gradle中android->defaultConfig下就配置了applicationId册舞,一般會(huì)和包名相同。
要實(shí)現(xiàn)應(yīng)用多開障般,就可以在procutFlavor中分別配置這個(gè)applicationId调鲸。
然后再多渠道打包盛杰,就可以在一臺(tái)設(shè)備上同時(shí)安裝兩個(gè)相同的APP。