android中多渠道打包的三种方式
轉(zhuǎn)載至:一片楓葉的專欄
國內(nèi)的Android開發(fā)者還是很苦逼的,由于眾所周知的原因,google play無法在國內(nèi)打開(翻墻的就不在考慮之內(nèi)了),所以Android系的應(yīng)用市場,群雄爭霸。后果就是國內(nèi)存在著有眾多的應(yīng)用市場,產(chǎn)品在不同的渠道可能有這不同的統(tǒng)計(jì)需求,為此Android開發(fā)人員需要為每個(gè)應(yīng)用市場發(fā)布一個(gè)安裝包,這里就引出了Android的多渠道打包。
首先我們說明一下什么是多渠道打包?
國內(nèi)存在著眾多的Android應(yīng)用市場,為了統(tǒng)計(jì)不同安卓應(yīng)用市場的下載量一個(gè)個(gè)性化統(tǒng)計(jì)需求,需要為每個(gè)應(yīng)用市場的Android包設(shè)定一個(gè)可以區(qū)分應(yīng)用市場的標(biāo)識(shí),這個(gè)為Android包設(shè)定應(yīng)用市場標(biāo)識(shí)的過程就是多渠道打包。
幾種主流的多渠道打包方式,以及其優(yōu)劣勢
- 通過配置gradle腳本實(shí)現(xiàn)多渠道打包
這種打包方式是使用Android Studio的編譯工具gradle配合使用的,其核心原理就是通過腳本修改AndroidManifest.xml中的mate-date內(nèi)容,執(zhí)行N次打包簽名操作實(shí)現(xiàn)多渠道打包的需求,具體實(shí)現(xiàn)如下。
(一)在Androidmanifest.xml中定義mate-data標(biāo)簽
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android" package="your.package.name"> <application> <meta-data Android:name="UMENG_CHANNEL" Android:value="{UMENG}"/> </application> </manifest>- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
這里需要注意的是:上面的value的值要和渠道名所對(duì)應(yīng),比如wandoujia里面要對(duì)應(yīng)為你豌豆莢的渠道名稱
(二)在build.gradle下的productFlavors定義渠道號(hào):
productFlavors { internal {} /*InHouse {} pcguanwang {} h5guanwang {} hiapk {} m91 {} appchina {} baidu {} qq {} jifeng {} anzhi {} mumayi {} m360 {} youyi {} wandoujia {} xiaomi {} sougou {} leshangdian {} huawei {} uc {} oppo {} flyme {} jinli {} letv {}*/ productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] } }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
同時(shí)需要注意的是,這里需要在defaultConfig中配置一個(gè)默認(rèn)的渠道名稱
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "channel_name"]- 1
- 1
實(shí)現(xiàn)多渠道打包更換mate-data標(biāo)簽中的內(nèi)容
優(yōu)勢:方便靈活,可以根據(jù)自身的需求配置不同的渠道執(zhí)行不同的邏輯;?
劣勢:打包速度過慢;
- 使用第三方打包工具
這種方式就是使用第三方的服務(wù),比如360,百度,友盟等,其原理也是通過修改AndroidManifest.xml中的mate-data標(biāo)簽內(nèi)容,然后執(zhí)行N次打包簽名的操作實(shí)現(xiàn)多渠道打包的。這里就不在做具體解釋說明,免得又做廣告的嫌疑,O(∩_∩)O哈哈~。
優(yōu)勢:簡單方便,幾乎不用自身做什么工作;?
劣勢:打包速度過慢;
- 使用美團(tuán)多渠道打包方式
而這里主要是根據(jù)美團(tuán)客戶端打包經(jīng)驗(yàn)(詳見:美團(tuán)Android自動(dòng)化之旅—生成渠道包)?
主要是介紹利用在META-INF目錄內(nèi)添加空文件的方式,實(shí)現(xiàn)批量快速打包Android應(yīng)用。
實(shí)現(xiàn)原理
Android應(yīng)用安裝包apk文件其實(shí)是一個(gè)壓縮文件,可以將后綴修改為zip直接解壓。解壓安裝文件后會(huì)發(fā)現(xiàn)在根目錄有一個(gè)META-INF目錄。如果在META-INF目錄內(nèi)添加空文件,可以不用重新簽名應(yīng)用。因此,通過為不同渠道的應(yīng)用添加不同的空文件,可以唯一標(biāo)識(shí)一個(gè)渠道。?
“采用這種方式,每打一個(gè)渠道包只需復(fù)制一個(gè)apk,在META-INF中添加一個(gè)使用渠道號(hào)命名的空文件即可。這種打包方式速度非常快,900多個(gè)渠道不到一分鐘就能打完。”
實(shí)現(xiàn)步驟
(一)編寫渠道號(hào)文件
(二)編寫Python腳本,實(shí)現(xiàn)解壓縮apk文件,為META-INF目錄添加文件,重新壓縮apk文件等邏輯:
# coding=utf-8 import zipfile import shutil import osdef delete_file_folder(src): '''delete files and folders''' if os.path.isfile(src): try: os.remove(src) except: pass elif os.path.isdir(src): for item in os.listdir(src): itemsrc=os.path.join(src,item) delete_file_folder(itemsrc) try: os.rmdir(src) except: pass# 創(chuàng)建一個(gè)空文件,此文件作為apk包中的空文件 src_empty_file = 'info/empty.txt' f = open(src_empty_file,'w') f.close()# 在渠道號(hào)配置文件中,獲取指定的渠道號(hào) channelFile = open('./info/channel.txt','r') channels = channelFile.readlines() channelFile.close() print('-'*20,'all channels','-'*20) print(channels) print('-'*50)# 獲取當(dāng)前目錄下所有的apk文件 src_apks = []; for file in os.listdir('.'):if os.path.isfile(file):extension = os.path.splitext(file)[1][1:]if extension in 'apk':src_apks.append(file)# 遍歷所以的apk文件,向其壓縮文件中添加渠道號(hào)文件 for src_apk in src_apks:src_apk_file_name = os.path.basename(src_apk)print('current apk name:',src_apk_file_name)temp_list = os.path.splitext(src_apk_file_name)src_apk_name = temp_list[0]src_apk_extension = temp_list[1]apk_names = src_apk_name.split('-');output_dir = 'outputDir'+'/'if os.path.exists(output_dir):delete_file_folder(output_dir)if not os.path.exists(output_dir):os.mkdir(output_dir)# 遍歷從文件中獲得的所以渠道號(hào),將其寫入APK包中for line in channels:target_channel = line.strip()target_apk = output_dir + apk_names[0] + "-" + target_channel+"-"+apk_names[2] + src_apk_extensionshutil.copy(src_apk, target_apk)zipped = zipfile.ZipFile(target_apk, 'a', zipfile.ZIP_DEFLATED)empty_channel_file = "META-INF/uuchannel_{channel}".format(channel = target_channel)zipped.write(src_empty_file, empty_channel_file)zipped.close()print('-'*50) print('repackaging is over ,total package: ',len(channels)) input('\npackage over...')- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
(三)打包一個(gè)正常的apk包?
(四)執(zhí)行python腳本,多渠道打包?
(五)Android代碼中獲取渠道號(hào)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
整個(gè)打包的流程就是這樣了,打工工具可參考github上的項(xiàng)目:多渠道打包實(shí)現(xiàn)
優(yōu)勢:打包速度很快,很方便;?
劣勢:不夠靈活,不能靈活的配置不同的渠道不同的業(yè)務(wù)邏輯;
問題:?
項(xiàng)目中由于使用了友盟統(tǒng)計(jì),以前是在meta-data中保存渠道信息,現(xiàn)在更改了方式之后需要手動(dòng)執(zhí)行渠道號(hào)的設(shè)置代碼:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
通過這種打包方式以前需要一個(gè)小時(shí)的打包工作現(xiàn)在只需要一分鐘即可,極大的提高了效率,目前在實(shí)際的應(yīng)用中尚未發(fā)現(xiàn)有什么問題,有這種需求的童鞋可以嘗試一下。
總結(jié)
雖說我們總結(jié)了三種打包方式,但是其實(shí)通過gradle打包和使用第三方服務(wù)打包都是執(zhí)行了N次的打包簽名操作,時(shí)間上耗費(fèi)太多,因此不太推薦,而美團(tuán)的方式在效率上提高了很多,但是對(duì)于那種不同的渠道包執(zhí)行不同的業(yè)務(wù)邏輯的需求就無能為例了,只能通過gradle配置,因此大家在選擇多渠道打包方式的時(shí)候可以根據(jù)自身的需求來選擇。
總結(jié)
以上是生活随笔為你收集整理的android中多渠道打包的三种方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LTK5135M MSOP-8封装 耐压
- 下一篇: flutter实战!一个Android应