1. 程式人生 > >jar、aar、sdk打包以及app module生成 Library Module

jar、aar、sdk打包以及app module生成 Library Module

jar、aar、sdk打包以及app module生成 Library Module

module打包成jar:
1 將要打成jar包的 module 設定為 android-library模式

2 在主module中 用compile project(‘:要打成jar包的 module’)

3 你編譯完工程後 所有java檔案會在build/bundle/release或者debug目錄下會生成classes.jar包

4 在 要打成jar包的 module 的 build.gradle中加入 將classes.jar 匯出到library的build/libs/下,並修改名字為mysdk.jar(自定義名字)

//Copy型別
task makeJar(type: Copy) {
    //刪除存在的
    delete 'build/libs/mysdk.jar'
    //設定拷貝的檔案
    from('build/intermediates/bundles/release/')
    //打進jar包後的檔案目錄
    into('build/libs/')
    //將classes.jar放入build/libs/目錄下
    //include ,exclude引數來設定過濾
    //(我們只關心classes.jar這個檔案)
    include('classes.jar')
    //重新命名
rename ('classes.jar', 'mysdk.jar') } makeJar.dependsOn(build)

可能會遇到:

com.android.dex.DexException: Multiple dex files define

因此可以在上方的gradle中 過濾掉一些類

task makeJar(type: Jar) {
    from file('build/intermediates/classes/release')
    archiveName = 'sdk.jar'
    destinationDir = file
('build/libs') //過濾不需要的class exclude "**/**/BuildConfig.class" exclude "**/**/BuildConfig\$*.class" exclude "**/R.class" exclude "**/R\$*.class" //指定打包的class include "com/test/**/*.class" }

java檔案打包為jar

task makeJar(type: Jar) {
    baseName 'test_interface'
    from('src/main/java')

}
makeJar.dependsOn(build)

只對TestInterface.java檔案打包為jar (帶上包名路徑)
點選as右側的gradle 相應的module下 的Tasks 中的 others 看到 makeJar 雙擊執行
即可在 build/libs下 檢視生成的test_interface.jar包


打包aar:
1 將要打成aar包的 module 設定為 android-library模式

2 在主module中 用compile project(‘:要打成aar包的 module’)

3 編譯工程完 會在 build/output/aar目錄下 生成.aar包

使用 aar:
4 將aar檔案拷貝到app/libs目錄下
在 module的 build.gradle中加入

repositories {
    flatDir {
        dirs 'libs', '../模組名/libs'
    }
}

compile fileTree(dir: 'libs', include: ['*.jar'])

最後

compile(name:'aar名字', ext:'aar')

這裡的aar名字 不能帶 aar字尾

問題:
1 有時 aar上面有個?號 aar中的檔案還是用不了
則刪掉 再匯入一次 然後點選 sync project 按鈕


app module生成 Library Module

library module和app module的區別是:
apply plugin: 'com.android.library'apply plugin: 'com.android.application'

1 直接建立 module的時候選擇library

2 或者將現有app module轉換成 library module
因此直接將 apply plugin: ‘com.android.application’改成 apply plugin: ‘com.android.library’ 即可

當然 最好將 module 名字改成 XXlib
然後包名 目錄結構改改 也改改 再改成 lib

1 project的 settings.gradle 引入 include ‘:xxx’ 即可
要使用該 library 則 compile project(':XXXLib')/implements 'xxxlib即可

2 刪掉library build.gradle的 applicationId
applicationId 是指定程序名
packageName 是用於四大元件等的包名
預設applicationId 為 packageName

3 manifest 的配置 (如底層用的一些程式碼涉及到許可權申請)
都放在app module層中

4 build.sh 或者其他配置檔案是否有一些路徑需要修改

常見修改:
一、一個lib中 設定 Activity 上層不同的app module 設定不同的 資源 如圖片 string color等

自定義ids.xml 去找資源
可以 在 lib中的value 設定 id
然後 app module層 設定資源

R.drawable.xxx 會通過 id 與具體的資源相連

二、 上層app module 定不同的值 而底層根據這個值去設定
用繼承的思想
上層繼承lib層 去override 這些屬性 以及 override一些輕量級的方法


app module可以完全是一個空殼的
app module的 mainfest配置 lib中的activity配置 lib中的application

也可以上層 application 進行初始化 傳入一些配置資訊給底層
然後Activity還是底層 只是 圖片 顏色等資源是上層
但是若涉及到 佈局的變化較大 則最好還是把Activity抽出來


常見問題:
1 Resource IDs cannot be used in a switch statement in Android library modules. Constant expression required.
將switch換成 if else