Android 將application改造成library的方法

有時候我們要把一個app的核心代碼作爲一個公共的庫,用在公司的各種不同的app中,最笨的方式可能就是把當前的代碼copy一份,然後在此基礎上做業務修改,但是爲了更好的拓展和保持原有業務不變,可以將application改造成library,library編譯後的產物.aar可以發佈到倉庫供多個項目使用,下面我們就說一下簡單的改造


一般我們改造分爲四個步驟


  1. 打開app目錄下 build.gradle 文件,注意不是項目全局的build.gradle,我發現好多人對這個區分不開,大概是沒有學習過gralde的項目管理基礎吧
  2. 找到defaultConfig 刪除 applicationId 。只有 Android 應用才能定義 applicationId ,不然編譯會報錯的
  3. 在文件的頂部(一般都是第一行)將 apply plugin: 'com.android.application' 修改爲 apply plugin: 'com.android.library'
  4. 保存文件,然後依次點擊 File > Sync Project with Gradle Files。大功告成。模塊的整個結構仍然相同,但是現在它會作爲 Android library運行,編譯現在也會創建 AAR 文件,而不是 APK。如果您想要編譯 AAR 文件,請在 Project 窗口中選擇要編譯的庫模塊,然後依次點擊 Build >Make Module my-library-module或者用gradle生成aar

特殊注意事項

  • 在將將application改成library後,如果涉及到ViewonClick 事件多分支選擇的,不能使用 switch (view.getId()){...} 作爲邏輯處理,必須使用if--else if---else的形式,不然編譯會報錯

將庫添加爲依賴項


方法一、圖形界面操作

  • 添加已編譯的 AAR(或 JAR)文件到項目(庫必須已編譯):
    a. 依次點擊 File > New > New Module
    b. 點擊 Import .JAR/.AAR Package,然後點擊 Next
    c. 輸入已編譯的 AAR 或 JAR 文件的路勁位置,然後點擊 Finish
  • library Module 導入到您的項目(庫源代碼會成爲項目的一部分):
    a. 依次點擊 File > New > Import Module
    b. 輸入庫模塊目錄的位置,然後點擊 Finish

方法二、Gradle腳本導入(個人喜歡這個)

  • 添加已編譯的 AAR(或 JAR)文件到項目(庫必須已編譯):
    a、一般都是將生成的AAR(或 JAR)放到 libs目錄下 ,如:lib/my-library-module-release.aar
    b、在gradle的dependencies{...}節點下配置
dependencies { implementation(name: 'my-library-module-release', ext: 'aar')}

如果是jar包就直接 implementation fileTree(dir: 'libs', include: ['*.jar']) ,這行配置可以引入libs下所有的jar包,當然你也可以引入個別的jarimplementation file('libs/my-lib-module-release.jar');

  • library Module 導入到您的項目(庫源代碼會成爲項目的一部分):
    a. 確保 my-library-module和 app在同一級目錄
    b. 然後在 settings.gradle 中進行配置 include ':app', ':my-library-module'
    c. 打開app的 build.gradle 文件,然後添加dependencies
    d.點擊 Sync Project with Gradle Files
 dependencies {implementation project(":my-library-module") }

以上爲基本用法,要是有定製化的變體,可以使用 buildVariantName+Implementation的形式,而不是 implementation。例如,如果只想在“pro”產品中包含此庫,其他項目中用不到這個庫裏面的內容,避免影響打包的編譯速度

   android{
     ...
    productFlavors {
        pro { ... }
        other{...}
    }
    
   }
    dependencies {
        proImplementation project(":my-library-module")
    }
    

我們也可以在app目錄下創建一個專門存放aar文件的目錄,如aars

  • 這樣我們需要在gradle中通過以下腳本進行指定該目錄才能使用
repositories { flatDir { dirs 'aars' } }

將庫添加爲依賴項後在打包的時候經常會出現資源合併衝突

1、資源id經可能用該庫爲前綴或者後綴,有一定特色的命名,避免在values.xml合併的時候報錯
2、AndroidManifest.xml合併的時候也會報錯,比如android:name,android:icon,android:label,android:theme 等屬性衝突,可以在應用的AndroidManifest.xmlapplication節點加入以下代碼解決,多個屬性之間用逗號隔開

<application tools:replace="android:theme,android:label,android:allowBackup,android:icon">

查看AndroidManifest.xml報錯日誌可以參考 Android studio各種gradle報錯解決方案彙總

學習更多的合併衝突請看官方文檔 合併多個清單文件


最後建議大家學習一下gralde 基礎語法,弄清楚projecttast的;不要只知道在 dependencies {...}加入依賴,結果gradle一報錯自己就慌了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章