天天看點

android元件化導入全局aar包,【Android 元件化】從子產品化到元件化

文章目錄

一、從子產品化到元件化

二、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);

}