App 多渠道打包及重簽名方案

歡迎訪問我的博客原文

眾所周知侧啼,渠道包是國內(nèi) Android 應(yīng)用市場中常用的分發(fā)方式牛柒。渠道包中會包含不同的渠道信息,方便我們后續(xù)統(tǒng)計 App 在各分發(fā)渠道的下載量痊乾、用戶量皮壁、留存率等,有針對地調(diào)整應(yīng)用內(nèi)容或是推廣方案等哪审。隨著國內(nèi) iOS 應(yīng)用上架越來越難蛾魄,衍生出了很多企業(yè)包,為了方便采集數(shù)據(jù)湿滓,也會用多渠道的方案滴须。

另外,項目進(jìn)展過程中叽奥,可能會出現(xiàn)一些臨時新增渠道的需求扔水,這時回到工程中重新打包是比較費(fèi)時的,有沒有辦法加快打包速度呢朝氓?下文中分享了一些方案魔市。

iOS 多渠道打包方案

iOS 打渠道包目前想到的就只有兩種方式,一種是通過多 target 方式赵哲,另一種是修改 plist 文件方式待德。

多 target 方式

點(diǎn)擊項目中的 target,右鍵選擇 Duplicate枫夺〗埽可以修改下圖標(biāo)紅框的三處:target 名稱、plist 名稱和 scheme 名稱橡庞。

image

判斷當(dāng)前是哪個 target较坛,可以通過添加宏定義實現(xiàn),方式就是在 Build Settings 找到 Preprocessor Macros毙死,填入宏定義名。

代碼中這樣判斷:

#ifdef  TARGET1MACROS
    // target1
#elif defined TARGET2MACROS
    // target2
#endif

具體打包腳本就不介紹了喻鳄,讀者可以自行網(wǎng)上搜索扼倘,這種方式的缺點(diǎn)是一個渠道打一次,效率較低除呵。下面著重分享修改 plist 的批量打包方式再菊。

修改 plist 方式

下面用一個簡單的 Demo 演示一下:

第一步:創(chuàng)建工程名為 MultiChannelDemo 的項目,并在項目中新建一個 Channel.plist 文件颜曾,plist 中設(shè)置 Channel 字段纠拔,值為 channel01。然后在頁面上設(shè)置一個 label 標(biāo)簽用于顯示當(dāng)前的渠道名稱泛豪,渠道名可以通過下面的代碼獲取到:

NSDictionary *channelDic = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Channel" ofType:@"plist"]];
NSString *channel = channelDic[@"Channel"];

第二步:把這個項目用可用的證書正常打一個母包稠诲,解壓這個 ipa 包可以獲得一個名為 Payload 的文件夾侦鹏,里面是一個 .app 文件,右鍵顯示其包內(nèi)容臀叙,內(nèi)容如下:

├── Base.lproj
├── Channel.plist
├── Info.plist
├── MultiChannelDemo
├── PkgInfo
├── _CodeSignature
└── embedded.mobileprovision

可以看到略水,里面的 Channel.plist 也就是在前面工程中新建的存儲渠道信息的 plist,我們會修改里面的 Channel 再生成新的渠道包劝萤。

第三步:提取描述文件用于重簽名渊涝,上一步中 Payload 的文件夾里有一個 embedded.mobileprovision 文件,這就是我們需要的文件床嫌。

第四步:新建一個純文本跨释,里面輸入你要新增的渠道號,如:

image

第五步:寫一個腳本文件 ChannelPackage.sh厌处,內(nèi)容如下:

#!/bin/bash

# 輸入的包名

name="MultiChannelDemo"

echo "------SDK渠道包----------"

appName="${name}.app"

plistBuddy="/usr/libexec/PlistBuddy"

configName="Payload/${appName}/Channel.plist"

ipa="${name}.ipa"

# 輸出的新包所在的文件夾名

outUpdateAppDir="ChannelPackages"

# entitlements.plist路徑

entitlementsDir="entitlements.plist"

# 切換到當(dāng)前目錄

currDir=${PWD}

cd ${currDir}

echo "-----${currDir}"

rm -rf Payload

# 解壓縮-o:覆蓋文件 -q:不顯示解壓過程

unzip -o -q ${ipa}

# 刪除舊的文件夾鳖谈,重新生成

rm -rf ${outUpdateAppDir}

mkdir ${outUpdateAppDir}

# 刪除舊的 entitlements.plist,重新生成

rm -rf ${entitlementsDir}

/usr/libexec/PlistBuddy -x -c "print :Entitlements " /dev/stdin <<< $(security cms -D -i Payload/${appName}/embedded.mobileprovision) > entitlements.plist

echo "------------------------開始打包程序------------------------"

# 渠道列表文件開始打包

for line in $(cat ChannelList.txt)

# 循環(huán)數(shù)組嘱蛋,修改渠道信息

do

# 修改 plist 中的 Channel 值

$plistBuddy -c "Set :Channel $line" ${configName}

# app 重簽名

rm -rf Payload/${appName}/_CodeSignature

cp embedded.mobileprovision "Payload/${appName}/embedded.mobileprovision"

# 填入可用的證書 ID

codesign -f -s "iPhone Distribution: XXXXXX." Payload/${appName}  --entitlements ${entitlementsDir}

# 若輸出 Payload/MultiChannelDemo.app: replacing existing signature 說明重簽名完成

# 壓縮 -r:遞歸處理蚯姆,將指定目錄下的所有文件和子目錄一并處理 -q:不顯示處理過程

zip -rq "${outUpdateAppDir}/$line.ipa" Payload

echo "........渠道${line}打包已完成"

done

腳本里的信息請根據(jù)你實際情況修改。到這里準(zhǔn)備工作都完成了洒敏,需要的文件如下:

├── ChannelList.txt
├── ChannelPackage.sh
├── MultiChannelDemo.ipa
└── embedded.mobileprovision

第六步:在當(dāng)前目錄下執(zhí)行腳本文件:

sh ChannelPackage.sh

打包完成后生成的 ChannelPackages 文件夾下龄恋,就是我們需要的渠道包:

├── ChannelList.txt
├── ChannelPackage.sh
├── ChannelPackages
│   ├── channel02.ipa
│   ├── channel03.ipa
│   └── channel04.ipa
├── MultiChannelDemo.ipa
├── Payload
│   └── MultiChannelDemo.app
├── embedded.mobileprovision
└── entitlements.plist

這種自動化打包的方式就斤,可以規(guī)避掉 Xcode 本身打包編譯的部分時間矮燎,快速出包腔剂。

Android 多渠道打包方案

下文介紹的是美團(tuán)技術(shù)團(tuán)隊開源的 Walle叨恨,它有 Gradle 插件和命令行兩種使用方式陨舱,前者快速集成绢记,后者滿足自定義需求柳洋。

Gladle 插件方式

配置 build.gradle

在項目根目錄下的 build.gradle 文件中添加 Walle 插件依賴:

buildscript {
    dependencies {
        classpath 'com.meituan.android.walle:plugin:1.1.6'
    }
}

在 app 目錄下的 build.gradle 文件中 apply 插件:

apply plugin: 'walle'

dependencies {
    compile 'com.meituan.android.walle:library:1.1.6'
}

配置插件

在 app 目錄下的 build.gradle 文件中進(jìn)行渠道配置:

walle {
    // 指定渠道包的輸出路徑
    apkOutputFolder = new File("${project.buildDir}/outputs/channels");
    // 定制渠道包的APK的文件名稱
    apkFileNameFormat = '${appName}_v${versionName}_${channel}.apk';
    // 渠道配置文件
    channelFile = new File("${project.getProjectDir()}/channel")
}

渠道配置文件里的內(nèi)容格式詳見:渠道配置文件示例叔汁。

如何獲取渠道信息

在需要填寫渠道信息的地方引用這段代碼:

String channel = WalleChannelReader.getChannel(this.getApplicationContext());

如何生成渠道包

assemble${variantName}Channels 指令傻挂,導(dǎo)出 apk 包乘碑。

命令行方式

通過命令行方式,可以不打開 IDE金拒,直接導(dǎo)出新渠道的 apk兽肤。步驟如下:

首先,新建一個文件夾绪抛,取用一個上面步驟導(dǎo)出的 apk 包资铡,再下載 walle-cli-all.jar,兩者都放置在這個文件夾目錄下幢码。

然后笤休,在文件夾目錄下執(zhí)行命令:

java -jar walle-cli-all.jar put -c ${channelName} ${apkName}.apk

若上面的命令執(zhí)行成功,會在當(dāng)前目錄下生成新的渠道包症副,名稱為 ${apkName}_${channelName}.apk

如果要批量寫入渠道店雅,可以這樣政基,渠道之間用逗號隔開:

java -jar walle-cli-all.jar batch -c ${channelName0},${channelName1},${channelName2} ${apkName}.apk

或者指定渠道配置文件:

java -jar walle-cli-all.jar batch -c ${channelFile} ${apkName}.apk

如果要寫入額外信息,參考官方文檔底洗。

如果要檢查/顯示渠道腋么,命令為:

java -jar walle-cli-all.jar show ${apkName}.apk

Walle 現(xiàn)在既能滿足新應(yīng)用簽名方案對安全性的要求,也能滿足對渠道包打包時間的要求亥揖,有需要的可以嘗試珊擂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市费变,隨后出現(xiàn)的幾起案子摧扇,更是在濱河造成了極大的恐慌,老刑警劉巖挚歧,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扛稽,死亡現(xiàn)場離奇詭異,居然都是意外死亡滑负,警方通過查閱死者的電腦和手機(jī)在张,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矮慕,“玉大人帮匾,你說我怎么就攤上這事〕睁” “怎么了瘟斜?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長痪寻。 經(jīng)常有香客問我螺句,道長,這世上最難降的妖魔是什么橡类? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任蛇尚,我火速辦了婚禮,結(jié)果婚禮上顾画,老公的妹妹穿的比我還像新娘取劫。我一直安慰自己,他們只是感情好亲雪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布勇凭。 她就那樣靜靜地躺著疚膊,像睡著了一般义辕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寓盗,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天灌砖,我揣著相機(jī)與錄音璧函,去河邊找鬼。 笑死基显,一個胖子當(dāng)著我的面吹牛蘸吓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撩幽,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼库继,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了窜醉?” 一聲冷哼從身側(cè)響起宪萄,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎榨惰,沒想到半個月后拜英,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡琅催,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年居凶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藤抡。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡侠碧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杰捂,到底是詐尸還是另有隱情舆床,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布嫁佳,位于F島的核電站挨队,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蒿往。R本人自食惡果不足惜盛垦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓤漏。 院中可真熱鬧腾夯,春花似錦、人聲如沸蔬充。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饥漫。三九已至榨呆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間庸队,已是汗流浹背积蜻。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工闯割, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人竿拆。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓宙拉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丙笋。 傳聞我的和親對象是個殘疾皇子谢澈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容