關(guān)于Android Studio封裝SDK的那些事兒
前言
首先SDK是提供給別人調(diào)用的工具。所以常見(jiàn)的SDK都是以jar包,so庫(kù),aar包等方式導(dǎo)入APP項(xiàng)目中。然后提供一些公開(kāi)的API供接入方調(diào)用。所以在Androidstudio中如果需要生成jar或者aar,就需要將module變成library。
1、AndroidStudio生成library
在這里介紹AndroidStudio兩種生成library的方式。
1.1、兩種生成library的方式
新建library module。

這種會(huì)直接生成可編譯成jar和aar的module。
新建Android項(xiàng)目,然后修改app下的build.gradle

將 apply plugin: 'com.android.application'修改成apply plugin: 'com.android.library'
然后去掉applicationId "com.mg.axe.helloworld"就把可運(yùn)行的Android module變成了一個(gè)library module。
注意:這種方式在編譯前一定要做以下事情
- 刪除自定義的Application和在AndroidManifest.xml的配置。
- 去點(diǎn)入口的Activity,否則在Android Studio接入時(shí)會(huì)生成兩個(gè)圖標(biāo)入口。
1.1、使用gradle所帶的命令編譯
這些命令可以自己在控制臺(tái)使用,可以直接點(diǎn)開(kāi)右上角的Gradle直接使用。

assembleRelease&assembleDebug

在build下的assembleRelease和assembleDebug都可以生成aar包。這邊和APP開(kāi)發(fā)很相似,可以在buildTypes下對(duì)release包做混淆等等操作。
如果編譯的命令執(zhí)行完畢,可以在當(dāng)前module下的build文件下找到編譯好的.aar文件。

如果需要jar包,則只需將這個(gè)aar文件解壓即可。

classes.jar就是編譯成jar的class文件。
1.2、aar和jar
- .aar是適用于AndroidStudio的接入方式,不需要過(guò)多的考慮當(dāng)SDK存在界面,圖片等資源文件的情況。解壓aar也可以看到,aar是一個(gè)將源碼(jar)和資源文件都打包好的文件。當(dāng)然也可以在eclipse中使用,前提是eclipse需要安裝gradle編譯環(huán)境。
- jar只包含編譯好的源代碼,如果SDK包含資源文件,則需要額外導(dǎo)入,適用于eclipse導(dǎo)入;AndroidStudio也同樣適用,不過(guò)當(dāng)SDK包含資源文件時(shí),導(dǎo)入aar將會(huì)更方便。
2、兩種接入方式
一般情況接入方式為AndroidStudio和Eclipse。其他的接入方式就不考慮了,可能大同小異,最主要的是其他的接入方式我也不會(huì)。

手動(dòng)滑稽
2.1、AndroidStudio接入方式
這里只介紹.aar的接入方式,AndroidStudio接入jar方式就不做介紹。
將.aar文件復(fù)制到項(xiàng)目的libs中。
并在app下的build.gradle中的android中添加如下代碼
repositories{
flatDir {
dirs 'libs'
}
}
在dependencies中添加依賴(lài)的代碼
// implementation(name: 'aar包的名字', ext: 'aar') implementation(name: 'game_sdk', ext: 'aar')
然后點(diǎn)擊同步(Sync Now),就成功的將.arr導(dǎo)入項(xiàng)目了。
可以在External Libraries中找到導(dǎo)入的aar依賴(lài)。


點(diǎn)開(kāi)aar,可以看(源代碼)jar和(資源文件)res。
2.2、Eclipse接入方式
eclipse一般是接入jar包的方式接入SDK,當(dāng)SDK存在界面、資源文件時(shí),接入方式比AndroidStudio接入aar稍微麻煩點(diǎn),需要將jar包和資源文件分開(kāi)導(dǎo)入。
- 解壓aar文件。
- 將jar包復(fù)制到libs文件加下,并添加依賴(lài)(add to path) 。
- 如果有資源文件,則需要將res下的資源文件復(fù)制到項(xiàng)目對(duì)應(yīng)的位置。
- 如果SDK用到了Activity等組件,還需去注冊(cè)等,這些都應(yīng)在SDK接入文檔中指明清楚。
2.3、兩種接入方式都需要注意的問(wèn)題
在SDK中聲明的權(quán)限,制定的Android版本范圍等都要在SDK接入文檔中指明清楚。
3、可能踩的坑
3.1、資源文件無(wú)法獲取的問(wèn)題。
如果編譯好的jar中使用了資源文件,然后使用了R.xx.xx這樣的代碼,可能會(huì)出現(xiàn)這樣的異常。
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/ysyc/axechen/R$id
找不到id。最后是參照開(kāi)源的TypeSDK才解決了這個(gè)問(wèn)題。通過(guò)如下的方法去尋找id。
public class GetResId {
public static int getId(Context context, String paramString1, String paramString2) {
return context.getResources().getIdentifier(paramString2, paramString1, context.getPackageName());
}
}
加載布局和控件的方法:
// 獲取布局id GetResId.getId(this, "layout", "activity_main") // 獲取控件id GetResId.getId(this, "id", "login")
3.2、三方包沖突問(wèn)題
如果SDK用到了三方庫(kù),然后接入方的項(xiàng)目中也用到了同樣的三方庫(kù),那么當(dāng)編譯的時(shí)候就會(huì)出現(xiàn)類(lèi)沖突,無(wú)法編譯通過(guò)。這個(gè)時(shí)候就要求在編譯SDK時(shí)不要將三方的依賴(lài)編譯到SDK的jar中。那么在添加依賴(lài)時(shí)需要使用compileOnly關(guān)鍵字。
compileOnly files('libs/gson-2.8.5.jar')
或者
compileOnly 'com.google.code.gson:gson:2.8.5'
這樣才不會(huì)將引入的依賴(lài)編譯到SDK的jar中,這個(gè)時(shí)候需要接入方導(dǎo)入這些依賴(lài),當(dāng)然SDK的接入文檔要詳細(xì)說(shuō)明。
3.3、請(qǐng)使用最平常的api和習(xí)慣
最好不去使用一些新的特性。如果接入方?jīng)]有使用到這些特性,可能編譯無(wú)法通過(guò),尤其是eclipse接入時(shí)會(huì)出現(xiàn)更多問(wèn)題。我遇到的問(wèn)題:我在編譯SDK時(shí)就是因?yàn)槭褂昧薼amada表達(dá)式導(dǎo)致eclipse無(wú)法編譯通過(guò)。
4、混淆
SDK的混淆和做app的混淆是一樣的。
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
在混淆的時(shí)候,如果使用了三方庫(kù),三方庫(kù)混淆的要求同樣需要加上混淆。
如果接入方需要做混淆,請(qǐng)記住加上SDK的混淆要求和三方庫(kù)的混淆要求。免得SDK的代碼混淆之后又被接入方混淆導(dǎo)致出錯(cuò)。
5、關(guān)于SDK的其他解決方案
實(shí)際上,用原生的界面做SDK并不是非常好的解決方案,主要是不利于SDK的更新和跨平臺(tái)。最好的方式是加載H5,更新起來(lái)更方便,SDK實(shí)現(xiàn)起來(lái)更簡(jiǎn)單。
6、一些開(kāi)源的SDK
https://github.com/typesdk/TypeSDK
https://github.com/zuowutan/ShareGameSdk
注意事項(xiàng):
1.所有的內(nèi)容都需要依賴(lài)這個(gè)acitivity.他是sdk上下文.
2.Sdk的所有內(nèi)容圍繞著這個(gè)activity來(lái)寫(xiě)就行了
3.把這個(gè)activity當(dāng)成一個(gè)普通類(lèi)使用
4.Sdk最大的問(wèn)題就是它里面的所有內(nèi)容都是沒(méi)有生命周期的.
5.只有之前創(chuàng)建聲明過(guò)的那個(gè)activity 有生命周期.原理大概是這樣的,其他的自己查資料.
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Android?LineChart繪制折線(xiàn)圖的示例詳解
這篇文章主要為大家想想介紹了Android?RecyclerLineChart實(shí)現(xiàn)繪制折線(xiàn)圖的相關(guān)資料,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-03-03
Android kotlin+協(xié)程+Room數(shù)據(jù)庫(kù)的簡(jiǎn)單使用
這篇文章主要介紹了Android kotlin+協(xié)程+Room數(shù)據(jù)庫(kù)的簡(jiǎn)單使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Android利用Theme自定義Activity間的切換動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了Android利用Theme自定義Activity間的切換動(dòng)畫(huà),感興趣的小伙伴們可以參考一下2016-09-09
Android 圖片保存到相冊(cè)不顯示的解決方案(兼容Android 10及更高版本)
這篇文章主要介紹了Android 圖片保存到系統(tǒng)相冊(cè)不顯示的解決方案,幫助大家更好的理解和學(xué)習(xí)使用Android開(kāi)發(fā),感興趣的朋友可以了解下2021-04-04
Android實(shí)現(xiàn)伸縮彈力分布菜單效果的示例
本文介紹下在Android中實(shí)現(xiàn)伸縮彈力分布菜單效果。這種效果比較炫酷,有需要的朋友可以參考一下。2016-10-10

