最近,公司有個(gè)做聚合SDK的老鐵要離職了,然后它的鍋就甩給我了,話說(shuō),本來(lái)開會(huì)的時(shí)候說(shuō)和另一個(gè)同事一人負(fù)責(zé)半個(gè)月

那好吧,App這邊目前也沒有啥需求,然后就接手了這位老鐵的聚合SDK的項(xiàng)目,本來(lái)是一個(gè)月的項(xiàng)目交接時(shí)間,非常奇葩的一個(gè)禮拜就走人了,一點(diǎn)都不夸張的,代碼都還沒有看完就已經(jīng)要去和CP對(duì)接游戲了,直接上手開干,啰嗦了這么多,還沒有扯到正題,好吧,我的鍋,必須通過(guò)文字來(lái)小小的抱怨一下。
由于這個(gè)Bug是在對(duì)接聚合SDK時(shí)發(fā)生的,但是很多小伙伴對(duì)SDK其實(shí)接觸的不多,這里就先簡(jiǎn)單的介紹一下什么是SDK,什么是聚合SDK。SDK的英文全名是:software development kit,翻譯成中文的意思就是“軟件開發(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ù)的工作
客戶端解決方案
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)力。渠道的意思就是指可以上線應(yīng)用和游戲的平臺(tái),比如奇虎360、華為、小米、魅族等等。聚合SDK的實(shí)現(xiàn)原理是游戲母包集成一個(gè)抽象的SDK框架,并且把一些常見的動(dòng)作比如初始化、支付、登陸、切換登陸、分享等等實(shí)現(xiàn)放到框架的回調(diào)方法里,然后聚合這邊再寫一個(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寫的腳本來(lái)自動(dòng)化打包,本質(zhì)就是用這些工具去一步步反編譯和回編,避免開發(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介紹到這里,下面開始介紹遇到的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)然我還是不死心,查了一下,果然不出我所料,哈哈,扎心,沒有找到,然后我看了一下奇虎360SDK開發(fā)包下面有一個(gè)常見錯(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再回編即可
然而并沒有什么卵用,我檢查呢這個(gè)配置文件,然后對(duì)比了原來(lái)游戲的配置方式,沒有毛病,此刻Bug陷入了僵局。但是,我馬上想到了一個(gè)問(wèn)題,它提示包名屬性必須為包名+.cx.accounts.syncprovider,那有沒有可能是CP那邊給的包名本身就是錯(cuò)的呢?為什么我會(huì)這么想,原來(lái)就是在對(duì)接過(guò)程中游戲公司的那個(gè)技術(shù)感覺就屬于萌新,遇到了非常多奇葩的問(wèn)題,比如支付參數(shù)傳遞null、在子線程操作UI,然而把錯(cuò)誤的原因告訴他了,依然還是不會(huì)解決,簡(jiǎn)單的問(wèn)題都能卡三四天。話不多說(shuō),然后我對(duì)這個(gè)apk進(jìn)行了反編譯,果然,包名和CP給的不一樣,替換正確的包名重新反編譯回編打包,apk通過(guò)。

相信看到這里的朋友心里肯定也是和我一樣相當(dāng)?shù)臒o(wú)語(yǔ)了,太坑爹了啊,沒帶這么坑人的,解決這個(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ō)這句話或者為什么生氣都不知道原因,那怎么去解決問(wèn)題呢,關(guān)鍵在于讀懂、理解這個(gè)人本身,然后結(jié)合語(yǔ)境去思考,并且對(duì)癥下藥。這里我意識(shí)到原因可能是CP包名給錯(cuò)是因?yàn)樗麄兊募夹g(shù)真的萌新,如果他們一貫給我們的印象是很強(qiáng)很專業(yè),我不太可能會(huì)往這方面去想。
ps(下個(gè)禮拜估計(jì)會(huì)忙死,app要寫,聚合SDK那邊還要對(duì)接游戲,網(wǎng)游SDK的老鐵請(qǐng)假了,然后我需要暫時(shí)對(duì)接下,哎,一份錢三份活)