1. 程式人生 > >Android模組化(三)——模組可插拔單獨編譯執行

Android模組化(三)——模組可插拔單獨編譯執行

轉自:

下面主要來講一下單一模組的獨立編譯執行和插拔式的整合。

單一模組的獨立編譯執行

  模組化的好處之一就是單一模組可以獨立的開發編譯執行安裝到使用者的手機上,這樣就方便了對某一模組的單獨開發除錯,單一模組生成的apk體積也小,編譯時間也快,開發效率會高很多。

  比如前面的示例專案中我們的可以把使用者中心這個模組變成可獨立執行的APP,在打包釋出的時候,也不需要改動即可變成library模組整合到我們要釋出的主APP中去,下圖是經過獨立執行的使用者中心模組的APP和主APP,可以同時的安裝在使用者手機上進行分別開發除錯。 
這裡寫圖片描述

  要想實現這樣的目標我們得對使用者中心模組進行專案簡單的改造,下圖是改造之後的專案結構: 
這裡寫圖片描述

   從上圖中我們可以看到有兩個AndroidManifest.xml,一個在app目錄下,一個在module下,主要是做什麼用的呢?下面先看一下在使用者中心模組module_user中的build.gradle中android {}中的一段配置:

sourceSets {
        main {
            if (!isNeedUserModule.toBoolean()) {
                manifest.srcFile 'src/main/app/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/module/AndroidManifest.xml'
            }
        }

    }

 上面的 isNeedUserModule 變數是來自專案根目錄gradle.properties配置檔案中的,

isNeedUserModule=true
#isNeedUserModule=false

   isNeedUserModule變數的作用主要用來配置這個使用者中心模組是不是需要整合到主的APP中去,如果是true則是整合到主APP,這個模組就會變成library庫,如果是false,那麼它就可以當成APP安裝到使用者手機上。這是因為在module_user中的build.gradle檔案中加入了這樣的程式碼來控制此庫是library還是APP:

if (!isNeedUserModule.toBoolean()) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}

  isNeedUserModule是true我們就把這個模組變成:’com.android.application’,清單檔案 manifest使用app目錄下的AndroidManifest :manifest.srcFile ‘src/main/app/AndroidManifest.xml’ ;反之則是:’com.android.library’,清單檔案 manifest使用module目錄下的AndroidManifest :manifest.srcFile ‘src/main/module/AndroidManifest.xml’。app 和module目錄下的AndroidManifest有什麼不一樣呢? 
  app中的AndroidManifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.finddreams.module_user">

    <application>
        <activity
            android:name=".LoginActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

  module目錄下的AndroidManifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.finddreams.module_user" >
    <application>
        <activity android:name=".LoginActivity"></activity>
    </application>

</manifest>

  做Android的都知道一個APP要安裝到使用者的手機上,要有一個啟動的頁面,這個啟動頁的Activity需要配置intent-filter,所以app專案中的AndroidManifest 要多出這個,而module中則不需要配置:

 <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>

另外在主的APP的build檔案中需要加入可動態引入使用者中心模組的配置:

 if (isNeedUserModule.toBoolean()) {
        compile project(':module_user')
    }

  如此我們只需要在根目錄gradle.properties配置檔案中的改動一下isNeedUserModule變數的引數即可實現使用者模組的可插拔形式整合和獨立執行。 
  下一篇將介紹在模組化的過程中遇到的問題和注意事項; 
  文中提到的示例專案地址為:https://github.com/finddreams/AndModulePractice ,參考示例專案加深你對模組化的理解。