天天看點

AndroidStudio封裝SDK的那些事

首先SDK是提供給别人調用的工具。是以常見的SDK都是以jar包,so庫,aar包等方式導入APP項目中。然後提供一些公開的API供接入方調用。是以在Androidstudio中如果需要生成jar或者aar,就需要将module變成library。

1、AndroidStudio生成library

在這裡介紹AndroidStudio兩種生成library的方式。

1.1、兩種生成library的方式

建立library module。

image.png

這種會直接生成可編譯成jar和aar的module。

建立Android項目,然後修改app下的build.gradle

apply plugin: 'com.android.application'

修改成

apply plugin: 'com.android.library'

然後去掉

applicationId "com.mg.axe.helloworld"

就把可運作的Android module變成了一個library module。

注意:這種方式在編譯前一定要做以下事情

  • 删除自定義的Application和在AndroidManifest.xml的配置。
  • 去點入口的Activity,否則在Android Studio接入時會生成兩個圖示入口。
1.1、使用gradle所帶的指令編譯

這些指令可以自己在控制台使用,可以直接點開右上角的Gradle直接使用。

  • assembleRelease&assembleDebug

在build下的assembleRelease和assembleDebug都可以生成aar包。這邊和APP開發很相似,可以在buildTypes下對release包做混淆等等操作。

如果編譯的指令執行完畢,可以在目前module下的build檔案下找到編譯好的.aar檔案。

如果需要jar包,則隻需将這個aar檔案解壓即可。

classes.jar就是編譯成jar的class檔案。

1.2、aar和jar
  • .aar是适用于AndroidStudio的接入方式,不需要過多的考慮當SDK存在界面,圖檔等資源檔案的情況。解壓aar也可以看到,aar是一個将源碼(jar)和資源檔案都打包好的檔案。當然也可以在eclipse中使用,前提是eclipse需要安裝gradle編譯環境。
  • jar隻包含編譯好的源代碼,如果SDK包含資源檔案,則需要額外導入,适用于eclipse導入;AndroidStudio也同樣适用,不過當SDK包含資源檔案時,導入aar将會更友善。

2、兩種接入方式

一般情況接入方式為AndroidStudio和Eclipse。其他的接入方式就不考慮了,可能大同小異,最主要的是其他的接入方式我也不會。

手動滑稽

2.1、AndroidStudio接入方式

這裡隻介紹.aar的接入方式,AndroidStudio接入jar方式就不做介紹。

  • 将.aar檔案複制到項目的libs中。
  • 并在app下的build.gradle中的android中添加如下代碼
repositories{
        flatDir {
            dirs 'libs'
        }
    }
           
  • 在dependencies中添加依賴的代碼
// implementation(name: 'aar包的名字', ext: 'aar')
  implementation(name: 'game_sdk', ext: 'aar')
           

然後點選同步(Sync Now),就成功的将.arr導入項目了。

可以在External Libraries中找到導入的aar依賴。

點開aar,可以看(源代碼)jar和(資源檔案)res。

2.2、Eclipse接入方式

eclipse一般是接入jar包的方式接入SDK,當SDK存在界面、資源檔案時,接入方式比AndroidStudio接入aar稍微麻煩點,需要将jar包和資源檔案分開導入。

  • 解壓aar檔案。
  • 将jar包複制到libs檔案加下,并添加依賴(add to path) 。
  • 如果有資源檔案,則需要将res下的資源檔案複制到項目對應的位置。
  • 如果SDK用到了Activity等元件,還需去注冊等,這些都應在SDK接入文檔中指明清楚。
2.3、兩種接入方式都需要注意的問題

在SDK中聲明的權限,制定的Android版本範圍等都要在SDK接入文檔中指明清楚。

3、可能踩的坑

3.1、資源檔案無法擷取的問題。

如果編譯好的jar中使用了資源檔案,然後使用了R.xx.xx這樣的代碼,可能會出現這樣的異常。

java.lang.NoClassDefFoundError: Failed resolution of: Lcom/ysyc/axechen/R$id
           

找不到id。最後是參照開源的TypeSDK才解決了這個問題。通過如下的方法去尋找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、三方包沖突問題

如果SDK用到了三方庫,然後接入方的項目中也用到了同樣的三方庫,那麼當編譯的時候就會出現類沖突,無法編譯通過。這個時候就要求在編譯SDK時不要将三方的依賴編譯到SDK的jar中。那麼在添加依賴時需要使用compileOnly關鍵字。

compileOnly files('libs/gson-2.8.5.jar')
           

或者

compileOnly 'com.google.code.gson:gson:2.8.5'
           

這樣才不會将引入的依賴編譯到SDK的jar中,這個時候需要接入方導入這些依賴,當然SDK的接入文檔要詳細說明。

3.3、請使用最平常的api和習慣

最好不去使用一些新的特性。如果接入方沒有使用到這些特性,可能編譯無法通過,尤其是eclipse接入時會出現更多問題。我遇到的問題:我在編譯SDK時就是因為使用了lamada表達式導緻eclipse無法編譯通過。

4、混淆

SDK的混淆和做app的混淆是一樣的。

buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
           

在混淆的時候,如果使用了三方庫,三方庫混淆的要求同樣需要加上混淆。

如果接入方需要做混淆,請記住加上SDK的混淆要求和三方庫的混淆要求。免得SDK的代碼混淆之後又被接入方混淆導緻出錯。

5、關于SDK的其他解決方案

實際上,用原生的界面做SDK并不是非常好的解決方案,主要是不利于SDK的更新和跨平台。最好的方式是加載H5,更新起來更友善,SDK實作起來更簡單。

6、一些開源的SDK

https://github.com/typesdk/TypeSDK

https://github.com/zuowutan/ShareGameSdk

如果這篇文章對你有幫助,還請點個贊再走吧:)

通路我

AndroidStudio封裝SDK的那些事
AndroidStudio封裝SDK的那些事

關注天雲

定期福利