Android SDK開發技術分享
最近在工作中負責統一支付平臺的SDK開發部分,就此總結下SDK開發的技術點、注意事項、與普通app開發的差別,作為自我總結,也作為公司內部互相學習的分享,希望有Android開發需求或者對Android有興趣的同學(互相學習稱為同學),多多關注,多多回復。
一、SDK開發的概念
Android SDK開發,指為第三方app開發提供功能性封裝,提供文件(doc),例項(demo),封裝包(jar/aar)等,目前網際網路公司提供了許多功能性SDK接入,比如騰訊的QQ登入微信登入、廣點通聯盟、QQ地圖接入,阿里的支付寶支付,百度的百度牆廣告等等。
圖1 釋出包
二、jar包和aar包
SDK開發目標是為了提供開發包給第三方app的開發者,常見情況下,提供jar包或者aar包。jar包可以包括程式碼、資原始檔(包括圖片、xml檔案、動態連結庫等,需要二次打包),jar由於不能直接引用xml頁面佈局,難以實現介面佈局,必須用java實現所有介面,實現起來麻煩,一個簡單的介面要寫很多的程式碼,維護起來也比較麻煩,但是通過aapt編譯xml頁面佈局,使其成為另外一種Android的佈局系統更容易解析的一種格式(Compiled xml),在程式碼中通過反射使用XmlPullParser,inflate出xml中的佈局,也可以得到頁面。aar包可以包括許多資源(程式碼、資原始檔、配置檔案等等,既包含class又包含了res資源下的所有內容),使用常用的app開發方式進行開發,自動會把所有的資原始檔、配置檔案(甚至是app整體配置檔案AndroidManifest.xml)全部引入aar包中,不需要開發人員進行其他工作,相對jar,aar的使用方便許多,但是由於許多開發者依然使用的IDE是Eclipse,在aar接入方面不便,jar接入使用依然較多,在google推薦的IDE Android Studio中,aar的打包和接入就十分方便。
圖2 jar包的引入
圖3 aar包的引入
三、sdk開發的原則
sdk編寫的原則,可以總結為幾點:
1.內容封閉,只開放少數介面,最大程度減少sdk接入方需要了解的細節。
2.包儘可能小,儘可能壓縮圖片和動態連結庫
3.統一介面呼叫方式,比如:ComPayPlatform.init(context,key); ComPayPlatform.pay(context,key,listener);
四、aar包開發
AS(Android Studio)中Module以庫的形式使用,編譯後自動生成aar檔案,檔案包括了Module庫的所有有用內容(AndroidMenifest.xml,res資料夾中的所有資原始檔,libs中引用的jar和.so的動態連結庫,java程式碼等)。Module可以依次依賴,Module1引用Module2,Module2引用Module3,但是Module1無法直接使用Module3中的內容,Module也可以進行平行依賴,Module1即引用了Module2,也引用了Module3,在sdk開發中也需要注意,儘快不要使用Module依賴,多Module無法打包為一個aar,也要避免依次依賴造成的可能bug。
sdk開發中res資料夾中,資源和id的字首問題。sdk開發中,res資料夾中的所有資源(圖片名,xml檢視名,values資料夾下的定義屬性名等)建議都加上字首(比如我加上公司的字首 bs_***.png),是因為作為aar包被其他app引用後,資源名使用時可能與原程式衝突,原程式名為back.png的圖片與sdk中back.png的圖片衝突造成bug.
圖4 字首
sdk結果的出口,一般使用一個介面,在介面的回撥函式返回結果。
/**
*@author張新錦
*/
public interfaceOnPayResultListener {
public voidOnSuccess(String platFormNo);
public voidOnFail();
}
ComPayPlatform.pay(MainActivity.this,"001",fixPlatFormNo,"1000001","00101","222222",
"測試111", 0.01,getCurrentTimeFormatyyyyMMdd(),getCurrentTimeFormathhmmss(),"remark1","",
newOnPayResultListener() {
@Override
public voidOnSuccess(String platFormNo) {
textView.append("支付成功 , 返回資料: platformNo :"+platFormNo+"\n");
}
@Override
public voidOnFail() {
textView.append("支付失敗\n");
}
});
五、釋出前的工作
5.1 sdk的程式碼混淆
sdk程式碼混淆與app不同的地方,除了普通app的混淆機制外,sdk特別注意開放介面和內部引用包的不混淆。
5.2 sdk包內容的釋出
編寫sdk程式碼、並且測試通過後,sdk開發的工作才進行一半,另外一半的工作在寫出demo程式和接入文件。sdk的最終目的是為了其他開發者接入,不止在編碼是注意接入的程式碼要簡潔、明瞭,更要在接入文件中詳細寫出方法、引數的意義,最好直接在文件中給出事例。文件最好也寫清楚開發環境要求,jdk要求和引用aar檔案的詳解。demo程式也十分重要,demo程式簡潔,註釋詳細,使用sdk介面的程式碼進行詳細註釋,讓接入sdk的開發人員明白每段程式碼的含義。