詳解AndroidStudio中三方庫(kù)的幾種依賴方式碌更。以及對(duì)應(yīng)方式的特點(diǎn)。
依賴方式 | 依賴特點(diǎn) |
---|---|
compile | Gradle3.0棄用洞慎,使用該種依賴方式痛单,依賴可以多級(jí)傳遞,如B依賴A劲腿,C依賴B旭绒,那么C也可以使用A的類和方法。 |
provided | 標(biāo)識(shí)該庫(kù)只是在編譯期使用焦人,但是不會(huì)打包到最終的APK中挥吵,但是需要保證一點(diǎn),如果運(yùn)行時(shí)需要用到該庫(kù)花椭,則需要保證項(xiàng)目中其他地方已導(dǎo)入該庫(kù)忽匈,且是可訪問(wèn)的。否則軟件運(yùn)行會(huì)出現(xiàn)異常 |
implementation | 該種依賴方式導(dǎo)入的依賴不能在編譯期被其他模塊共享矿辽。其他模塊只有在運(yùn)行時(shí)才可以共享此模塊 |
api | 該種依賴方式導(dǎo)入的依賴丹允,可以多級(jí)傳遞,即B依賴A嗦锐,C依賴B嫌松,那么C也可以使用A的類和方法 |
compileOnly | 用來(lái)取代舊版的provided沪曙,標(biāo)識(shí)該庫(kù)只在編譯期間使用奕污,運(yùn)行時(shí)可有可無(wú)。如果運(yùn)行時(shí)有用到液走,需要保證有對(duì)應(yīng)的庫(kù)取代它碳默,這種方法有助于減小APK體積大小,但是要注意運(yùn)行時(shí)依賴是否存在缘眶。 |
runtimeOnly | 編譯期間不參與編譯期嘱根,只會(huì)在構(gòu)建輸出的時(shí)候打包進(jìn)APK中,類似舊版的apk依賴方式 |
annotationProcessor | 主要是用來(lái)標(biāo)識(shí)一些庫(kù)用到的注解器巷懈。 |
Kapt | kotlin注解庫(kù)该抒,兼容java |
Android中常見(jiàn)依賴說(shuō)明
implementation fileTree(include: ['*.jar','*.aar'], dir: 'libs')
本地二進(jìn)制文件依賴:將libs文件夾下后綴為.jar和.aar的包引入到項(xiàng)目中
implementation files('libs/foo.jar', 'libs/bar.jar')
本地二進(jìn)制文件依賴:指定libs文件夾下的指定二進(jìn)制文件
implementation project(":mylibrary")
本地module依賴:引入項(xiàng)目中本地module
遠(yuǎn)程二進(jìn)制文件依賴:兩種寫(xiě)法
簡(jiǎn)單寫(xiě)法
implementation 'com.example.android:app-magic:12.3'
復(fù)雜寫(xiě)法
implementation group: 'com.example.android', name: 'app-magic', version: '12.3'
該依賴聲明了對(duì)com.example.android命名空間組內(nèi)12.3版app-magic的依賴關(guān)系
排除重復(fù)依賴項(xiàng)的幾種解決方式
由于依賴庫(kù)比較多,而有些庫(kù)在引入的時(shí)候也會(huì)用到第三方庫(kù)顶燕,就難免出現(xiàn)同一庫(kù)被多次引入的情況凑保,如果庫(kù)版本不一致還可能導(dǎo)致新的問(wèn)題
implementation('some-library') {
transitive = true,依賴同于沒(méi)有使用 exclude 排除依賴 涌攻,每個(gè)包的依賴項(xiàng)都會(huì)被遞歸分析并添加進(jìn)來(lái)欧引。默認(rèn)為true
transitive = false,則依賴關(guān)系同于用 exclude 排除依賴恳谎。
exclude group: 'com.example.imgtools', module: 'native'
//exclude 會(huì)排除transitive=true的一些庫(kù)芝此,用exclude包含的庫(kù)表示該庫(kù)不需要引入憋肖,直接引入宿主app的該庫(kù)即可
}
1、一次性排除所有重復(fù)依賴項(xiàng)婚苹,使其使用同一版本的該公共庫(kù)
//解決不同依賴庫(kù)support版本不一致警告問(wèn)題
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '27.1.1'
}
}
}
}
2岸更、出現(xiàn)沖突時(shí)強(qiáng)制使用某一個(gè)版本
// 強(qiáng)制使用 support-v4 26.1.0版本
compile('com.android.support:support-v4:26.1.0') {
force = true
}
3、不同庫(kù)使用不同的版本
configurations.all {
// 遍歷所有的依賴膊升,根據(jù) moduleName 使用對(duì)應(yīng)的版本坐慰。確實(shí)可行
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (requested.name.startsWith("multidex")) {
details.useVersion '26.1.0'
} else if (requested.name.startsWith("advrecyclerview")) {
details.useVersion '27.0.0'
} else {
details.useVersion '25.3.0'
}
}
}
}