上一期的組件化以及本次的內(nèi)容
我又來獻(xiàn)丑了。。。。。。。。
這里可以先看看上一篇談?wù)勎依斫獾腁ndroid組件化
在之前的組件化方案中,所有的組件都在同一個(gè)項(xiàng)目中,并且使用implementation project(': xx')依賴,這樣會(huì)有幾個(gè)問題。
- 編譯速度很慢————當(dāng)組件開始變多時(shí),app空殼工程或者其他組件會(huì)直接或者間接的依賴許多組件,當(dāng)運(yùn)行時(shí),需要編譯的時(shí)間就很感人。
- 不利于復(fù)用————當(dāng)其他工程需要使用某個(gè)lib組件時(shí)候,需要copy一份到工程中來使用。當(dāng)該lib組件需要維護(hù)的,不能做到一處修改,處處響應(yīng),無法保證這個(gè)lib組件的唯一性。
那么如何解決這個(gè)問題,大多數(shù)人應(yīng)該是我一樣將lib組件打包發(fā)布到私有倉庫,像引用第三方lib一樣依賴下來
發(fā)布包到本地庫
- 創(chuàng)建一個(gè)module 叫l(wèi)ib_xxx,并在其根目錄創(chuàng)建gradew.properties文件,定義一些屬性,這些屬性是后續(xù)生成pom文件時(shí)使用
#版本號(hào)
versionName=1.0.0
#項(xiàng)目組 id
maven_pom_groupId=com.xxx.xxx
#項(xiàng)目名稱
maven_pom__artifactId=lib_xxx
#打包類型
maven_pom__packaging=aar
maven_pom__description=xxx description
- 在項(xiàng)目根目錄,也可以是發(fā)布中心的根目錄的gradle.properties定義本地倉庫地址
#本地倉庫地址(自定義倉庫地址)
localUrl=file:///C:/Users/admin/Documents/repo/
- 在module的build.gradle中配置maven plugin和如下信息
apply plugin: 'maven'
uploadArchives {
repositories.mavenDeployer {
repository(url: localUrl)
pom.project {
version versionName
artifactId maven_pom__artifactId
groupId maven_pom_groupId
packaging maven_pom__packaging
description maven_pom__description
}
}
}
- 運(yùn)行指令
gradlew -p localrepo clean build uploadArchives --info
等待build successful
- 使用本地倉庫
在項(xiàng)目根目錄的build.gradle文件中添加該maven
allprojects {
repositories {
jcenter()
maven{
url localUrl
}
}
}
在module的build.gradle文件中依賴庫
implementation 'com.xxx.xxx:lib_xxx:1.0.0'
也就是上面maven_pom_groupId:maven_pom__artifactId :versionName
搭建私有倉庫,發(fā)布到私有倉庫中
這里先搭建好nexus,如何搭建,百度一堆。放個(gè)下載鏈接
瀏覽器中http://127.0.0.1:8081/ 默認(rèn)網(wǎng)址可以進(jìn)入管理界面
內(nèi)置賬戶 admin admin123
點(diǎn)擊左上角設(shè)置圖標(biāo),Repository下的repositories,內(nèi)置了一些庫,可以直接使用maven_releases和maven-snapshots
點(diǎn)擊進(jìn)入倉庫,copy里面的url
修改一下lib_xxx下的gradlw.properties配置文件
#正式版本號(hào)
versionName=1.0.2
#快照版本號(hào)
snapshotVersionName=1.0.0-SNAPSHOT
maven_local_username=admin
maven_local_password=admin123
#項(xiàng)目組 id
maven_pom_groupId=com.xxx.xxx
#項(xiàng)目名稱
maven_pom__artifactId=lib_xxx
#打包類型
maven_pom__packaging=aar
maven_pom__description=xxx description
- 修改根目錄的gradle.properties配置文件,將復(fù)制的url替換上去,穩(wěn)定版?zhèn)鞣€(wěn)定的(release),不穩(wěn)定版?zhèn)鞑环€(wěn)定的(snapshot)
#本地倉庫地址(自定義倉庫地址)
localUrl=file:///C:/Users/admin/Documents/repo/
#快照倉庫地址
mavenSnapshotUrl=http://localhost:8081/repository/maven-snapshots/
#發(fā)布倉庫地址
mavenReleasesUrl=http://localhost:8081/repository/maven-releases/
- 修改lib_xxxmodule下的build.gradle文件,帶上賬號(hào)密碼
apply plugin: 'maven'
uploadArchives {
repositories.mavenDeployer {
repository(url: mavenReleasesUrl) {
authentication(userName: maven_local_username, password: maven_local_password)
}
snapshotRepository(url: mavenSnapshotUrl) {
authentication(userName: maven_local_username, password: maven_local_password)
}
pom.project {
// 注意:【這里通過切換 versionName 的賦值來區(qū)分上傳快照包還是正式包(snapshot 版本必須以 -SNAPSHOT 結(jié)尾)】
//version snapshotVersionName
version versionName
artifactId maven_pom__artifactId
groupId maven_pom_groupId
packaging maven_pom__packaging
description maven_pom__description
}
}
}
- 運(yùn)行指令
gradlew uploadArchives
也可以選擇as右側(cè)gradle的功能,選擇該lib_xxx module下的Tasks/upload中的uploadArchives
- 等待發(fā)布成功,使用私有maven倉庫,來獲取lib_xxx
等待build successful
allprojects {
repositories {
jcenter()
maven{
url localUrl
}
maven {
url mavenReleasesUrl
}
maven {
url mavenSnapshotUrl
}
}
}
implementation 'com.xxx.xxx:lib_xxx:1.0.0'
踩坑
- 上傳時(shí)找不到服務(wù)器
上傳時(shí)需關(guān)閉android studio的翻墻代理設(shè)置,且注釋settings.gradle中自動(dòng)生成的代理服務(wù)器相關(guān)配置,否則上傳時(shí)會(huì)報(bào)找不到倉庫服務(wù)器的錯(cuò)誤。
- 包無法更新
有時(shí)上傳了最新的snapshot包,引用的地方也sync、clean了,但引用的還是舊的包,此時(shí)需要?jiǎng)h除“~/.gradle”中的相關(guān)記錄。為方便執(zhí)行
,我們可以在應(yīng)用工程根目錄的build.gradle文件中,采用shell命令刪除,該命令會(huì)在你執(zhí)行clean操作時(shí)先執(zhí)行:
task deleteDescriptors(type: Exec) { //執(zhí)行shell命令
executable "sh"
args "-c", "rm -rf ~/.gradle/caches/modules-2/metadata-2.16/descriptors/com.company.appname"
//此處的“com.company.appname“就是庫的名字
}
task clean(type: Delete, dependsOn: deleteDescriptors) { //clean工程時(shí)順帶執(zhí)行上述任務(wù)
delete rootProject.buildDir
}
以上是網(wǎng)上查到的坑,暫時(shí)還沒遇到
- 無法設(shè)置編譯類型
在lib中無論怎么設(shè)置,打包發(fā)布到maven上后都會(huì)是release版本
所以有一個(gè)問題,如果在lib中需要判斷編譯類型怎么辦??
個(gè)人有兩種方法:
- lib開放一個(gè)入口,由應(yīng)用往lib中提供編譯類型,舉個(gè)簡單的栗子,部分第三方sdk或者工具會(huì)在app啟動(dòng)時(shí)初始化的階段傳入context,所以道理是一樣,將isDebug傳入lib即可
- 由lib本身去獲取當(dāng)前應(yīng)用的編譯類型,這里需要通過反射來獲取BuildConfig類,網(wǎng)上有很多獲取的方法,注意多包共存下,單獨(dú)區(qū)分包名
搭建倉庫的目的
- 提升app編譯性能,提高編譯速度
- 為公司提供一個(gè)高級(jí)可配置的代理和私有發(fā)布中心
- 可維護(hù)可管理,保證唯一性,可復(fù)用性
吐槽一下,最近實(shí)在太忙了,沒有在學(xué)點(diǎn)什么,一直有需求,全是復(fù)雜業(yè)務(wù)或者界面大改。