說說封裝sdk的那些坑(下)

2021-08-03 08:23:15 字數 3721 閱讀 5955

之前介紹了修改sdk後的**大體架構,其實修改**倒不是什麼麻煩的事,無非實現一種新功能,下面說說真正讓人抓狂的事——封裝和整合sdk。

首先要打包,如果是純**的sdk匯出成jar包就行了;像我這樣sdk裡還包含資源要打包aar。編譯成功用gradle直接打包成release包:

模組名稱為downloadsdk,生成的aar就在download/build/output/aar路徑下。

取決與工程的複雜程度,如果只是其中乙個模組需要用到sdk就很簡單,把android studio左邊的工程檢視切換成project files,在那個模組下新建libs資料夾,把aar複製進去,然後在那個模組的build.gradle中新增倉庫路徑如下:

repositories 

}

repositories 要包在android裡面,還要在dependencies增加下面一行:

compile(name:'downloadsdk',ext:'aar')
ext是副檔名的意思,表明需要依賴downloadsdk.aar檔案。在**裡直接呼叫aar裡的類和方法,android studio會自動import aar包裡對應的類和方法。

如果專案由多個模組構成,模組相互之間有依賴關係,並且不止乙個模組需要使用sdk就很麻煩。比如我們專案,一共有6個模組,modulea和moduleb都依賴modulec,modulec又依賴moduled,moduled又依賴modulee和modulef,而modulec和modulea都要使用sdk,一開始的想法是,既然a依賴於c,是不是只在c把上面匯入aar的工作做一遍就行了,試了下,不行,modulea報錯,找不到sdk,然後又在modulea把相同的事做了一遍,編譯,又報錯,moduleb找不到sdk,奇怪了,moduleb只是依賴modulec並沒有使用sdk也會報錯,最後把每個module都加上aar,修改gradle,仍然報錯,報的什麼錯已經記不得了,反正是讓人一頭霧水又很抓狂。

還有個問題,aar中有個類「updateinfo」,本地工程也有乙個一樣名字的「updateinfo」,這個物件是由modulec通過aidl介面傳給modulea和moduleb,整合sdk後modulec得到的是sdk中的「updateinfo」,物件型別不同編譯的時候會報錯,這兩個問題搞得人很煩,一下不知道該怎麼解決。

後來基本上是把用到sdk的**遮蔽了,一切從頭開始,很仔細的修改每個模組的build.gradle,遇到問題逐個解決,到處查資料,發現了這篇文章,裡面介紹多個module相互依賴如何在gradle中設定依賴aar,比如我這個工程,因為modulea和modulec都是要用到sdk的,需要按照正常流程匯入aar;而moduleb中沒有用到sdk只是依賴modulec,不需要引入aar,但是要在gradle中配置aar在其它模組的路徑

repositories 

}

這樣就可以了,其它有依賴關係的module做相同配置就行了。還有一點,當提示找不到sdk路徑時嘗試關閉android studio重新開啟,如果沒有其它問題是可以發現sdk的,自動匯入的類、方法也沒有問題,這也是乙個坑,多次clean、rebuild都沒用,關了重開才能重新整理ide舊的配置。

然後是第二個問題,物件型別不同編譯報錯,首先我忽略了乙個問題,使用aidl介面傳遞資料時,非基本型別的資料都要實現序列化介面,然後重新修改sdk中的「updateinfo」,把**貼出來以加深印象:

ublic class updateinfo implements parcelable

public string getversionname()

public

void

setversionname(string versionname)

public string getserverversion()

public

void

setserverversion(string serverversion)

public string getupgradedetailinfo()

public

void

setupgradedetailinfo(string upgradedetailinfo)

public string getserversupportminver()

public

void

setserversupportminver(string serversupportminver)

public string getapk_download_url()

public

void

setapk_download_url(string apk_download_url)

public string getapk_size()

public

void

setapk_size(string apk_size)

public string getapk_name()

public

void

setapk_name(string apk_name)

public string getapk_icon_url()

public

void

setapk_icon_url(string apk_icon_url)

public string getapk_hashcode()

public

void

setapk_hashcode(string apk_hashcode)

@override

public string tostring() ';

}@override

public

intdescribecontents()

@override

public

void

writetoparcel(parcel dest, int flags)

protected

updateinfo(parcel in)

public

void

readfromparcel(parcel in)

public

static final creatorcreator = new creator()

public updateinfo newarray(int size) };}

就是後面5個方法實現了序列化介面。

實現序列化之後才是物件型別不相容的問題,為了不影響以前的**,寫了個轉換方法,從sdk中得到updateinfo後轉變成舊的updateinfo:

public

static updateinfo conver2updateinfo(context context, acxingyun.cetcs.com.downloadsdk.bean.updateinfo updateinfosdk)

這樣就解決了。

整個過程,從修改到整合,花了我半個月時間,作為程式設計師真是能遇到各種各樣的問題,尤其是沒那麼多資料又無人可問的時候更是考驗乙個人的耐心和智慧型的時候,我也低估了工作量,如果知道有這麼麻煩,說不定就不改別人的**直接合了。趁現在不忙,多多努力提高自己吧。

說說封裝sdk的那些坑(上)

這半個月一直在做一件事,公升級sdk的修改 打包 整合,移交給我的sdk原始碼是個半成品,效率低,邏輯混亂,好多 是直接複製貼上,連空格都沒對齊。強迫症犯了,拿過來直接重新改造。public void onserviceconnected componentname name,ibinder ser...

WebRTC sdk 封裝踩過的那些坑

背景資訊 csdn第一篇部落格 思路 可選方案1 從頂層peerconnection介面啟用,此方案需要涉及大量ice及sdp資訊的交換,理解與流程梳理,成本高,放棄 綜合考慮,選擇方案2.也有從更底層的call層api進行sdk封裝的考慮,可以後續考察,可能靈活性強於mediaenging,工作量...

微信SDK踩過的那些坑。。登入分享支付

1.應用中的包名 mainfext.xml中的package 必須與後台配置的一致。2.應用生成不能是debug包,必須是正式的簽名包。這個簽名必須與後台配置的一致。在第一點上,會出錯的概率還是比較小的。而在後台配置的卻是直接從在eclipse打簽名包時直接複製出來的md5簽名。大寫,並且中間夾雜 ...