文章目錄
一、從子產品化到元件化
二、build.gradle 建構腳本分析
一、從子產品化到元件化
Android 應用項目 , 都存在一個應用子產品 ( Application Module ) , 在 build.gradle 建構腳本中 , 第一個插件配置 com.android.application , 表明 該 Module 編譯打包後的輸出是 APK 安裝包 ; 該項目可以直接運作 ;
plugins {
id 'com.android.application'
id 'kotlin-android'
}
如果在 build.gradle 配置的是 com.android.library 插件 , 那麼 編譯 Module 打包後輸出的是 aar 依賴庫 ; 該項目不能直接運作 ;
plugins {
id 'com.android.library'
id 'kotlin-android'
}
子產品化 :
随着應用業務增加 , 功能變得越來越複雜 , 不能将所有的功能放在一個 Application 子產品中 ;
大型項目的開發不能隻有一個 Module , 大多數情況下 , Android 工程中 , 除了有一個 Application 子產品外 , 還有若幹 Library 子產品提供給應用子產品引用 ;
應用中還可能存在一個基礎的 SDK 依賴庫 , 提供給 Library 子產品引用 , Application 再引用這些 Library 子產品 ;
子產品化的缺點 :
Library 子產品中實作了一個功能 , 如果要運作的話 , 需要借助 Application 子產品 , 這就需要将整個項目全部編譯一遍 , 如果項目有幾百個子產品 ,調試運作就很困難 ;
單個開發者可能隻負責幾個子產品 , 還涉及了與其它子產品開發人者進行協作 ;
元件化 :
元件化是在子產品化的基礎上 , 可以 動态切換其子產品類型 , 将 Library 子產品切換成 Application 子產品 , 這樣獨立的子產品可以直接運作 ;
在進行 元件模式 開發時 , 将其變成 Application 子產品 , 在 內建模式 開發時 , 将其變成 Library 子產品 ;
元件開發時 , 單個 Library 子產品變成 Application 子產品 , 可以生成獨立運作的 APK 安裝包 ;
二、build.gradle 建構腳本分析
元件化實作需要依賴 Gradle ;
build.gradle 腳本都是使用 Groovy 語言編寫的代碼 , Groovy 也是 JVM 上語言 , 與 Java 語言完全相容 , 其調用的 api 都是 Java 語言的 ;
Android Studio 中的 Android 工程 , 在 Project 層級下有一個 build.gradle 建構腳本 , 在 Application 子產品 和 Library 子產品 中 , 也都各自存在一個 Module 級别的 build.gradle 建構腳本 ;
Project 下的 build.gradle 編譯時會被翻譯成 Project.java 類對象 , 該類路徑是 gradle-6.5srccore-apiorggradleapiProject.java ;
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = "1.4.31"
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.2"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
其中的 buildscript , allprojects 等都是 Project.java 中的函數 ;
@HasInternalProtocol
public interface Project extends Comparable, ExtensionAware, PluginAware {
void buildscript(Closure configureClosure);
void allprojects(Closure configureClosure);
}