最近,公司有個(gè)做聚合SDK的老鐵要離職了韩脏,然后它的鍋就甩給我了,話(huà)說(shuō)铸磅,本來(lái)開(kāi)會(huì)的時(shí)候說(shuō)和另一個(gè)同事一人負(fù)責(zé)半個(gè)月
那好吧,App這邊目前也沒(méi)有啥需求阅仔,然后就接手了這位老鐵的聚合SDK的項(xiàng)目吹散,本來(lái)是一個(gè)月的項(xiàng)目交接時(shí)間,非常奇葩的一個(gè)禮拜就走人了八酒,一點(diǎn)都不夸張的空民,代碼都還沒(méi)有看完就已經(jīng)要去和CP對(duì)接游戲了,直接上手開(kāi)干羞迷,啰嗦了這么多界轩,還沒(méi)有扯到正題,好吧衔瓮,我的鍋浊猾,必須通過(guò)文字來(lái)小小的抱怨一下。
由于這個(gè)Bug是在對(duì)接聚合SDK時(shí)發(fā)生的热鞍,但是很多小伙伴對(duì)SDK其實(shí)接觸的不多与殃,這里就先簡(jiǎn)單的介紹一下什么是SDK,什么是聚合SDK碍现。SDK的英文全名是:software development kit幅疼,翻譯成中文的意思就是“軟件開(kāi)發(fā)工具包”。SDK通俗點(diǎn)說(shuō)就是第三方提供了一個(gè)實(shí)現(xiàn)了某些功能的工具包提供給你調(diào)用這里面的代碼昼接,然后就可以實(shí)現(xiàn)功能爽篷,以下是傳統(tǒng)的接入SDK的缺點(diǎn)。
1慢睡,已經(jīng)接入的渠道不定期的升級(jí)逐工、更新
2,和其他公司的技術(shù)漂辐、商務(wù)的溝通協(xié)調(diào)
3泪喊,重復(fù)的動(dòng)作,無(wú)限循環(huán)
主流渠道SDK有 AnySDK髓涯、易接袒啼、棱鏡,這些SDK已經(jīng)接入了主流的幾十家SDK,但是缺陷也很大蚓再。他們的技術(shù)原理就是安卓反編譯滑肉、回編,利用apktool.jar
1摘仅,收費(fèi)靶庙,渠道一方要收大頭,第三方也要收娃属,那么留給游戲公司的利潤(rùn)就非常低了
2六荒,安全,數(shù)據(jù)要通過(guò)第三方SDK的服務(wù)器
3矾端,死板不自由恬吕,他們只接入了主流的,如果游戲公司和一些小的渠道有合作须床,這就需要重復(fù)的工作
客戶(hù)端解決方案
1铐料,一個(gè)抽象的SDK接入層
2,一鍵自動(dòng)化打包工具
3豺旬,多個(gè)平臺(tái)支持钠惩,Java、Unity3D族阅、Cocos2D
服務(wù)器解決方案
1篓跛,統(tǒng)一的登陸認(rèn)證中心
2,統(tǒng)一的支付中心
3坦刀,支持多款游戲
聚合SDK就相當(dāng)于一個(gè)工具愧沟,通過(guò)這個(gè)工具可以一次性批量接入大量游戲,然后快速分發(fā)給更多渠道鲤遥,比一款一款游戲接入渠道沐寺,省去了大量時(shí)間、人力盖奈、財(cái)力混坞。渠道的意思就是指可以上線(xiàn)應(yīng)用和游戲的平臺(tái),比如奇虎360钢坦、華為究孕、小米、魅族等等爹凹。聚合SDK的實(shí)現(xiàn)原理是游戲母包集成一個(gè)抽象的SDK框架厨诸,并且把一些常見(jiàn)的動(dòng)作比如初始化、支付禾酱、登陸微酬、切換登陸绘趋、分享等等實(shí)現(xiàn)放到框架的回調(diào)方法里,然后聚合這邊再寫(xiě)一個(gè)AndroidLib項(xiàng)目得封,它實(shí)現(xiàn)了這個(gè)抽象框架,在這個(gè)抽象框架內(nèi)實(shí)現(xiàn)具體的渠道SDK所需要去實(shí)現(xiàn)的方法指郁。但是CP那邊集成實(shí)現(xiàn)抽象框架后生成的apk文件怎么和渠道的資源進(jìn)行合并呢忙上,答案就是反編譯和匯編原理,這里簡(jiǎn)單的說(shuō)下會(huì)用到的一些技術(shù)闲坎。
1疫粥,apktool.jar
編譯和反編譯的工具
apktool d -f <file.apk> <dir>
--->將apk文件反編譯到指定文件夾
apktool b -f <dir> <newFile.apk>
--->將修改后的反編譯資源文件夾編譯成新的apk文件
2,dx.bat
將class文件轉(zhuǎn)換成dex文件
3腰懂,smali.jar
用apktool.jar對(duì)apk文件進(jìn)行反編譯的時(shí)候會(huì)生成一個(gè)smali目錄梗逮,smali是安卓虛擬機(jī)Dalvik所使用的一種.dex文件的匯編和反匯編器
baksmaki 可以將dex文件轉(zhuǎn)換成smali的形式
4,java運(yùn)行環(huán)境
5绣溜,python2.7
用py寫(xiě)的腳本來(lái)自動(dòng)化打包慷彤,本質(zhì)就是用這些工具去一步步反編譯和回編,避免開(kāi)發(fā)人員去敲命令行
6,aapt.exe
可以對(duì)壓縮文件內(nèi)的資源進(jìn)行操作
7怖喻,jarsigner
簽名工具
8底哗,zipalign
對(duì)安卓項(xiàng)目中的資源進(jìn)行優(yōu)化讀取,將項(xiàng)目資源映射成4個(gè)字節(jié)方便讀取锚沸,避免顯式讀取跋选。
好的,關(guān)于SDK介紹到這里哗蜈,下面開(kāi)始介紹遇到的Bug前标。
天啟 2018/06/21 15:18:34
qihoo360_{buildNum}.apk
2,檢測(cè)出SDK錯(cuò)誤,請(qǐng)修正后重新提交距潘。
sdk幫助文檔和自檢工具炼列,點(diǎn)擊查看。
錯(cuò)誤信息:
(文件 qihoo_game_sdk_sync_adapter.xml中的android:contentAuthority屬性必須為包名+.cx.accounts.syncprovider
-- c523227b8455779fd82e745bb575a2c6.apk中缺少文件:lib/arm64-v8a/
liblegend.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件:lib/arm64-v8a/
libonlywechat_plugin.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件:lib/arm64-v8a/
libqhsdk.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件:lib/
mips64/liblegend.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件:lib/
mips64/libonlywechat_plugin.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件:lib/
mips64/libqhsdk.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件:lib/
x86_64/liblegend.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件:lib/
x86_64/libonlywechat_plugin.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件:lib/x86_64/libqhsdk.so)
正常情況下像這種渠道SDK的Bug百度和谷歌是找不到的音比,當(dāng)然我還是不死心唯鸭,查了一下,果然不出我所料硅确,哈哈目溉,扎心,沒(méi)有找到菱农,然后我看了一下奇虎360SDK開(kāi)發(fā)包下面有一個(gè)常見(jiàn)錯(cuò)誤文檔缭付,果然,找到了循未,根據(jù)文檔所說(shuō)陷猫。
10.Wrong com.qihoo.gamecenter.sdk.activity.ContainerActivity
qihoo_game_sdk_sync_adapter.xml中的android:contentAuthority屬性必須為包名+.cx.accounts.syncprovider
1)配置錯(cuò)誤
編譯之后變成了n1秫舌,反編譯之后,把n1改成android再回編即可
然而并沒(méi)有什么卵用绣檬,我檢查呢這個(gè)配置文件足陨,然后對(duì)比了原來(lái)游戲的配置方式,沒(méi)有毛病娇未,此刻Bug陷入了僵局墨缘。但是,我馬上想到了一個(gè)問(wèn)題零抬,它提示包名屬性必須為包名+.cx.accounts.syncprovider镊讼,那有沒(méi)有可能是CP那邊給的包名本身就是錯(cuò)的呢?為什么我會(huì)這么想平夜,原來(lái)就是在對(duì)接過(guò)程中游戲公司的那個(gè)技術(shù)感覺(jué)就屬于萌新蝶棋,遇到了非常多奇葩的問(wèn)題,比如支付參數(shù)傳遞null忽妒、在子線(xiàn)程操作UI玩裙,然而把錯(cuò)誤的原因告訴他了,依然還是不會(huì)解決段直,簡(jiǎn)單的問(wèn)題都能卡三四天献酗。話(huà)不多說(shuō),然后我對(duì)這個(gè)apk進(jìn)行了反編譯坷牛,果然罕偎,包名和CP給的不一樣,替換正確的包名重新反編譯回編打包京闰,apk通過(guò)颜及。
相信看到這里的朋友心里肯定也是和我一樣相當(dāng)?shù)臒o(wú)語(yǔ)了,太坑爹了啊蹂楣,沒(méi)帶這么坑人的俏站,解決這個(gè)Bug的思路首先肯定是包名配置錯(cuò)誤,根據(jù)平臺(tái)返回的數(shù)據(jù)提示痊土,但是如何定位到問(wèn)題的關(guān)鍵就在于你對(duì)整個(gè)項(xiàng)目的理解肄扎,錯(cuò)誤不可能和游戲母包有關(guān)系,問(wèn)題出在聚合SDK的配置文件里面赁酝。要想解決問(wèn)題犯祠,就必須足夠了解整個(gè)過(guò)程,然后才能定位到問(wèn)題并解決酌呆。就像生活中衡载,你連別人為什么說(shuō)這句話(huà)或者為什么生氣都不知道原因,那怎么去解決問(wèn)題呢隙袁,關(guān)鍵在于讀懂痰娱、理解這個(gè)人本身弃榨,然后結(jié)合語(yǔ)境去思考,并且對(duì)癥下藥梨睁。這里我意識(shí)到原因可能是CP包名給錯(cuò)是因?yàn)樗麄兊募夹g(shù)真的萌新鲸睛,如果他們一貫給我們的印象是很強(qiáng)很專(zhuān)業(yè),我不太可能會(huì)往這方面去想坡贺。
ps(下個(gè)禮拜估計(jì)會(huì)忙死官辈,app要寫(xiě),聚合SDK那邊還要對(duì)接游戲拴念,網(wǎng)游SDK的老鐵請(qǐng)假了钧萍,然后我需要暫時(shí)對(duì)接下褐缠,哎政鼠,一份錢(qián)三份活)