談?wù)勎业睦斫獾腁ndroid組件化——2

上一期的組件化以及本次的內(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ù)或者界面大改。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 今天來回味下組件化和模塊化,這2種說法時(shí)一回事,當(dāng)然還是有區(qū)別的,下面再詳細(xì)說,其實(shí)很簡單,只是設(shè)計(jì)范圍的不同,也...
    前行的烏龜閱讀 49,474評(píng)論 6 94
  • LLDebugTool是一款針對(duì)開發(fā)者和測試者的調(diào)試工具,它可以幫助你在非Xcode的情況下,進(jìn)行數(shù)據(jù)分析和操作。...
    HDB_Li閱讀 4,390評(píng)論 6 13
  • 久違的晴天,家長會(huì)。 家長大會(huì)開好到教室時(shí),離放學(xué)已經(jīng)沒多少時(shí)間了。班主任說已經(jīng)安排了三個(gè)家長分享經(jīng)驗(yàn)。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,788評(píng)論 16 22
  • 創(chuàng)業(yè)是很多人的夢想,多少人為了理想和不甘選擇了創(chuàng)業(yè)來實(shí)現(xiàn)自我價(jià)值,我就是其中一個(gè)。 創(chuàng)業(yè)后,我由女人變成了超人,什...
    亦寶寶閱讀 1,982評(píng)論 4 1
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    余生動(dòng)聽閱讀 10,798評(píng)論 0 11

友情鏈接更多精彩內(nèi)容