文檔當前狀態:**beta0.4**
* [x] 選題收集:2017/11/21
* [x] 初稿整理:
* [ ] 補充校對:
* [ ] 入庫存檔:
---
之前已經整體的對組件化框架進行了概述,這篇文章只針對組件化的編譯腳本的配置進行詳述。
在概覽的時候,我們提出了幾個目標:可復用、熱插拔、靈活發布。
那么,如何才能算是可靈活發布呢?
1、組件可以獨立運行
2、組件可以獨立發布
3、組件有獨立的版本
### 組件可以獨立運行
組件可以獨立運行,就是說在有時候 Module 可以以libary運行,有時候可以以application運行,為了實現這些目標,以下的這些使我們需要改動的。
* 自動選擇android plugin——application或libary
* 自動引入ApplicationId
* 自動匹配不同環境時的AndroidMenifest文件
* 代碼隔離:組件在單獨運行時的測試代碼以及資源等應該與核心發布代碼進行隔離
* 自動匹配依賴項
首先,為了區分不同運行環境:Application或Libary,我們需要在build.gradle 引入一個布爾值 **isApp**。
最開始,我們添加了兩個配置文件 config.gradle和configpersonal.gradle:
* **config.gradle**:主要對各個模塊的依賴版本號進行 統一管理,團隊的全體成員應該同一份該文件;
* **configpersonal.gradle**:主要是對不同模塊 進行 模式切換的統一配置文件,方便管理。初始化后,不應再commit該文件的改動,以避免不必要的沖突;
此外,因為settings.gradle 是gradle run最先運行的幾個文件之一,暫時沒有發現可以通過在其他文件中 配置一個布爾值,來自動 include對應的module,只能手動開關注釋來處理。
好啦現在我們通過一份具體的build.gradle 里了解我們所需要的解決的問題。完整版本的build.gradle 可以查看最下面的build.gradle.
為了獲取configpersonal.gradle中 指定module的運行模式,這里定義了 isApp的全局變量,用于獲取configpersonal中的值。后續moudle的build.gradle都會依賴這個布爾值。
~~~
def isApp = rootProject.isApplication_ModuleD
~~~
首先,我們通過isApp 來選擇對應的 android plugin:
~~~
if (isApp) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
~~~
接著處理 在libary中不能使用applicationId的問題:
~~~
...
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
if (isApp) applicationId "com.example.app.moduled"
...
}
}
~~~
再來處理 不同狀態時,AndroidMenifest.xml和java、res的配置:
~~~
//***************************不同build下,Module代碼文件
sourceSets {
main {
if (isApp) {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
java.srcDirs = ['src/main/java', 'src/main/java-debug']
res.srcDirs = ['src/main/res', 'src/main/res-debug']
} else {
manifest.srcFile 'src/main/release/AndroidManifest.xml'
}
}
}
~~~
相關說明:
* java文件夾存放Module的正常源代碼文件
* java-debug存放Module單獨運行時的額外源代碼文件
* res存放Module的正常資源文件
* res-debug存放Module單獨運行時的額外資源文件
* release/AndroidManifest.xml存放Module的正常配置信息
* debug/AndroidManifest.xml存放Module單獨運行的配置信息,要包括AndroidManifest.xml的所有內容。
需要特別注意的地方:
1. java文件夾中的類不能調用java-debug中的類,因為java-debug中的類在作為library發布的時候是非源碼文件夾,不參與編譯,編譯時會報錯。而java-debug文件夾的類可以隨意引用java中的類。java文件夾與java-debug文件夾不能出現重復的類。
2. res文件夾中的資源不能引用res-debug文件夾中的資源,原因同上,并且不能出現重復的資源。
3. debug/AndroidManifest.xml中必須包含所有release/AndroidManifest.xml中的配置信息,并且可以隨意添加其他信息。原因同上。
最后我們在java-debug中添加我們的測試入口類TestActivity.java,在res-debug中添加測試layout文件activity_test.xml,在debug/AndroidManifest.xml中設置TestActivity為Main入口。
最后,不用狀態時,依賴關系也需要分別處理 ,比如Arouter插件的問題:
~~~
if(isApp) compile 'com.alibaba:arouter-api:x.x.x'
annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
~~~
## 參考:
* [組件化開發:build.gradle配置](http://www.jianshu.com/p/9620a40c203f)
* [android模塊化簡單教程](http://www.wxdroid.com/index.php/4048.html)
和java、res的配置:
~~~
~~~
---
## 附件:
settings.gradle
~~~
//根據自己的需要打開/關閉對應的module
//used for team release
//include ':app', ':ModuleA', ':ModuleB', ':ModuleC', ':ModuleD'
// only for ModuleD debug used
include ':ModuleD'
~~~
---
config.gradle
~~~
//公共配置信息,依賴版本,統一管理
ext {
//通用build 版本
android = [
compileSdkVersion: 26,
buildToolsVersion: "26.0.2",
minSdkVersion : 21,
targetSdkVersion : 22,
versionCode : 10,
versionName : "6.0"
]
//公共依賴
supportV4_Ver = "25.2.0"
supportV7_Ver = "25.2.0"
supportV13_Ver = "25.2.0"
constraint_layout_Ver = "1.0.2"
leakcanary_Ver = "1.5"
okhttp3_Ver = "3.8.0"
gson_Ver = "2.3.1"
glide_Ver = "3.7.0"
eventbus_Ver = "3.0.0"
rxjava_Ver = "2.0.8"
rxandroid_Ver = "2.0.1"
retrofit_Ver = "2.2.0"
alibaba_arouter_Ver ="1.2.1.1"
alibaba_arouter_compiler_Ver ="1.1.2.1"
}
~~~
---
configpersonal.gradle
~~~
//個人配置項,用于個人定制項目
ext {
/**
* 移除不必要的gradle task ,加快build速度
*/
isRemoveSomeTask = true
/**
* 本地編譯 配置項目
* isApplication_Main = true 表示 將 main Module 編譯為application
* 1.main 為false時,需要注釋applicationid(調試自己module時,最后setting注釋掉)
* 2.main 為ture時,其依賴的子module 不能為true, 如libary、baseModule(緣由-application 不能依賴 application)
* 3.子module為Application時,最后在setting中把 不必要的給注釋掉
*/
modulesBuildMode = [
isApplication_app = true,
isApplication_ModuleA = false,
isApplication_ModuleB = false,
isApplication_ModuleC = false,
isApplication_ModuleD = false,
]
}
~~~
項目的root build.gradle
~~~
// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply from: "config.gradle"
apply from: "configpersonal.gradle"
buildscript {
repositories {
//maven 私服地址,如不能使用,嘗試切換到maven.aliyun
maven { url 'http://10.10.4.43:8083/repository/maven-public/' }
// maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
}
}
allprojects {
repositories {
//maven 私服地址,如不能使用,嘗試切換到maven.aliyun
maven { url 'http://10.10.4.43:8083/repository/maven-public/' }
// maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
flatDir {
dirs '../Library/libs'
dirs '../FingerPrintModule/libs'
dirs '../UpdateLib/libs'
}
}
//全局配置,移除不必要的gradle task,加快編譯
if (rootProject.ext.isRemoveSomeTask) gradle.taskGraph.whenReady {
tasks.each { task ->
if (task.name.contains("lint")
//如果instant run不生效,把clean這行干掉
//||task.name.equals("clean")
//如果項目中有用到aidl則不可以舍棄這個任務
|| task.name.contains("Aidl")
//用不到測試的時候就可以先關閉
|| task.name.contains("mockableAndroidJar")
|| task.name.contains("UnitTest")
|| task.name.contains("AndroidTest")
//用不到NDK和JNI的也關閉掉
|| task.name.contains("Ndk")
//|| task.name.contains("Jni")
) {
task.enabled = false
}
}
}
}
~~~
ModuleD的build.gradle
~~~
def isApp = rootProject.isApplication_ModuleD
if (isApp) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
if (isApp) applicationId "com.example.app.moduled"
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
//項目只是使用armeabi情況下,為避免產生不必要的.so文件夾
//在gradle.properties中添加 android.useDeprecatedNdk=true,并在defaultConfig中添加以下代碼
// 如支持更多平臺,abiFilters "armeabi", "armeabi-v7a", "x86"
ndk {
abiFilters "armeabi-v7a"
}
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
//自定義BuildConfig,添加一個 字段 IS_DEBUG
//主要是為了處理gradle插件2.x module中的BuildConfig.DEBUG 值異常的bug,3.0修復了這個問題
//gradle插件 2.x使用以下進行依賴
//debugCompile project(path: ':GlxssModule', configuration: 'debug')
//releaseCompile project(path: ':GlxssModule', configuration: 'release')
//gradle插件 3.0 后,僅使用一行即可,implementation或api
//api project(':GlxssModule')
publishNonDefault true
buildTypes {
debug {
minifyEnabled false
buildConfigField "boolean", "IS_DEBUG", "true"
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled false
buildConfigField "boolean", "IS_DEBUG", "false"
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
//***************************不同build下,Module代碼文件
sourceSets {
main {
if (isApp) {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
java.srcDirs = ['src/main/java', 'src/main/java-debug']
res.srcDirs = ['src/main/res', 'src/main/res-debug']
} else {
manifest.srcFile 'src/main/release/AndroidManifest.xml'
}
}
}
//資源文件名前綴約束,避免發布release時可能重名的問題
resourcePrefix "glxss_"
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile "com.android.support:appcompat-v7:$rootProject.ext.supportV7_Ver"
compile "com.android.support.constraint:constraint-layout:$rootProject.ext.constraint_layout_Ver"
compile "org.greenrobot:eventbus:$rootProject.ext.eventbus_Ver"
if(isApp) compile 'com.alibaba:arouter-api:x.x.x'
annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
}
~~~
- 0-發現
- AndroidInterview-Q-A
- Android能讓你少走彎路的干貨整理
- LearningNotes
- temp
- temp11
- 部分地址
- 0-待辦任務
- 待補充列表
- 0-未分類
- AndroidView事件分發與滑動沖突處理
- Spannable
- 事件分發機制詳解
- 1-Java
- 1-Java-01基礎
- 未歸檔
- 你應該知道的JDK知識
- 集合框架
- 1-Java-04合集
- Java之旅0
- Java之旅
- JAVA之旅01
- JAVA之旅02
- JAVA之旅03
- JAVA之旅04
- JAVA之旅05
- JAVA之旅06
- JAVA之旅07
- JAVA之旅08
- JAVA之旅09
- java之旅1
- JAVA之旅10
- JAVA之旅11
- JAVA之旅12
- JAVA之旅13
- JAVA之旅14
- JAVA之旅15
- JAVA之旅16
- JAVA之旅17
- JAVA之旅18
- JAVA之旅19
- java之旅2
- JAVA之旅20
- JAVA之旅21
- JAVA之旅22
- JAVA之旅23
- JAVA之旅24
- JAVA之旅25
- JAVA之旅26
- JAVA之旅27
- JAVA之旅28
- JAVA之旅29
- java之旅3
- JAVA之旅30
- JAVA之旅31
- JAVA之旅32
- JAVA之旅33
- JAVA之旅34
- JAVA之旅35
- 1-Java-05辨析
- HashMapArrayMap
- Java8新特性
- Java8接口默認方法
- 圖解HashMap(1)
- 圖解HashMap(2)
- 2-Android
- 2-Android-1-基礎
- View繪制流程
- 事件分發
- AndroidView的事件分發機制和滑動沖突解決
- 自定義View基礎
- 1-安卓自定義View基礎-坐標系
- 2-安卓自定義View基礎-角度弧度
- 3-安卓自定義View基礎-顏色
- 自定義View進階
- 1-安卓自定義View進階-分類和流程
- 10-安卓自定義View進階-Matrix詳解
- 11-安卓自定義View進階-MatrixCamera
- 12-安卓自定義View進階-事件分發機制原理
- 13-安卓自定義View進階-事件分發機制詳解
- 14-安卓自定義View進階-MotionEvent詳解
- 15-安卓自定義View進階-特殊形狀控件事件處理方案
- 16-安卓自定義View進階-多點觸控詳解
- 17-安卓自定義View進階-手勢檢測GestureDetector
- 2-安卓自定義View進階-繪制基本圖形
- 3-安卓自定義View進階-畫布操作
- 4-安卓自定義View進階-圖片文字
- 5-安卓自定義View進階-Path基本操作
- 6-安卓自定義View進階-貝塞爾曲線
- 7-安卓自定義View進階-Path完結篇偽
- 8-安卓自定義View進階-Path玩出花樣PathMeasure
- 9-安卓自定義View進階-Matrix原理
- 通用類介紹
- Application
- 2-Android-2-使用
- 2-Android-02控件
- ViewGroup
- ConstraintLayout
- CoordinatorLayout
- 2-Android-03三方使用
- Dagger2
- Dagger2圖文完全教程
- Dagger2最清晰的使用教程
- Dagger2讓你愛不釋手-終結篇
- Dagger2讓你愛不釋手-重點概念講解、融合篇
- dagger2讓你愛不釋手:基礎依賴注入框架篇
- 閱讀筆記
- Glide
- Google推薦的圖片加載庫Glide:最新版使用指南(含新特性)
- rxjava
- 這可能是最好的RxJava2.x入門教程完結版
- 這可能是最好的RxJava2.x入門教程(一)
- 這可能是最好的RxJava2.x入門教程(三)
- 這可能是最好的RxJava2.x入門教程(二)
- 這可能是最好的RxJava2.x入門教程(五)
- 這可能是最好的RxJava2.x入門教程(四)
- 2-Android-3-優化
- 優化概況
- 各種優化
- Android端秒開優化
- apk大小優化
- 內存分析
- 混淆
- 2-Android-4-工具
- adb命令
- 一鍵分析Android的BugReport
- 版本控制
- git
- git章節簡述
- 2-Android-5-源碼
- HandlerThread 源碼分析
- IntentService的使用和源碼分析
- 2-Android-9-辨析
- LRU算法
- 什么是Bitmap
- 常見圖片壓縮方式
- 3-Kotlin
- Kotlin使用筆記1-草稿
- Kotlin使用筆記2
- kotlin特性草稿
- Kotlin草稿-Delegation
- Kotlin草稿-Field
- Kotlin草稿-object
- 4-JavaScript
- 5-Python
- 6-Other
- Git
- Gradle
- Android中ProGuard配置和總結
- gradle使用筆記
- Nexus私服搭建
- 編譯提速最佳實踐
- 7-設計模式與架構
- 組件化
- 組件化探索(OKR)
- 1-參考列表
- 2-1-組件化概述
- 2-2-gradle配置
- 2-3-代碼編寫
- 2-4-常見問題
- 2-9-值得一讀
- 8-數據結構與算法
- 0臨時文件
- 漢諾塔
- 8-數據-1數據結構
- HashMap
- HashMap、Hashtable、HashSet 和 ConcurrentHashMap 的比較
- 遲到一年HashMap解讀
- 8-數據-2算法
- 1個就夠了
- Java常用排序算法(必須掌握的8大排序算法)
- 常用排序算法總結(性能+代碼)
- 必須知道的八大種排序算法(java實現)
- 9-職業
- 閱讀
- 書單
- 面試
- 面試-01-java
- Java面試題全集駱昊(上)
- Java面試題全集駱昊(下)
- Java面試題全集駱昊(中)
- 面試-02-android
- 40道Android面試題
- 面試-03-開源源碼
- Android圖片加載框架最全解析(二),從源碼的角度理解Glide的執行流程
- 面試-07-設計模式
- 面試-08-算法
- 面試-09-其他
- SUMMARY
- 版權說明
- temp111