關(guān)于作者:CSDN內(nèi)容合伙人、技術(shù)專家, 從零開始做日活千萬級APP。
專注于分享各領(lǐng)域原創(chuàng)系列文章 ,擅長java后端、移動(dòng)開發(fā)、商業(yè)變現(xiàn)、人工智能等,希望大家多多支持。
一、導(dǎo)讀
我們繼續(xù)總結(jié)學(xué)習(xí),溫故知新。
二、概覽
本文講述如何查看 android 依賴庫關(guān)系。
三、查看依賴關(guān)系
3.1 方式一
Tasks->help->dependencies
可以看項(xiàng)目中的依賴庫以及依賴庫的導(dǎo)入關(guān)系
3.2 方式二
Tasks->android->androidDependencies
可以看項(xiàng)目中的依賴庫以及依賴庫的導(dǎo)入關(guān)系
以上兩種方式會輸出如下日志:
_internal-unified-test-platform-android-device-provider-gradle - A configuration to resolve the Unified Test Platform dependencies.
\--- com.android.tools.utp:android-device-provider-gradle:30.2.0
+--- com.android.tools:common:30.2.0
| +--- com.android.tools:annotations:30.2.0
| +--- com.google.guava:guava:30.1-jre
| | +--- com.google.guava:failureaccess:1.0.1
| | +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
| | +--- com.google.code.findbugs:jsr305:3.0.2
| | +--- org.checkerframework:checker-qual:3.5.0
| | +--- com.google.errorprone:error_prone_annotations:2.3.4
| | \--- com.google.j2objc:j2objc-annotations:1.3
| +--- net.java.dev.jna:jna-platform:5.6.0
| | \--- net.java.dev.jna:jna:5.6.0
| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.31
| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.31
| | +--- org.jetbrains:annotations:13.0
| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.31
| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.31
| \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.31 (*)
+--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.31 (*)
+--- com.google.protobuf:protobuf-java:3.10.0
+--- com.android.tools.utp:android-device-provider-gradle-proto:30.2.0
| \--- com.google.protobuf:protobuf-java:3.10.0
\--- com.google.testing.platform:android-device-provider-local:0.0.8-alpha07
3.3 方式三
./gradlew :app:dependencies >log.txt
通過命令行,將輸入保存到日志,更方便查看。
四、移除重復(fù)依賴
項(xiàng)目中使用了很多第三方庫,很容易引入同名不同版本的庫,針對于這種情況,我們需要使用exclude語句在gradle文件里移除指定的依賴庫。
implementation("com.kuaishou.koom:koom-java-leak:2.1.0") {
exclude group: "com.google.android.material"
}
compileOnly ("com.xx:yy:$er_version") {
exclude group:"com.xx", module: "common-x"
}
當(dāng)我們移除之后,就要檢查代碼是否生效,
可在android studio的project項(xiàng)目查看方式下,找到External Libraries目錄。在這個(gè)目錄下查看多余的依賴庫是否已經(jīng)被移除。
如下圖:
強(qiáng)制指定整個(gè)項(xiàng)目依賴固定版本的第三方庫
當(dāng)然上面的寫法可能會比較麻煩,因?yàn)槊總€(gè)相關(guān)的三方庫都要寫一下,所以我們可以強(qiáng)制指定整個(gè)項(xiàng)目依賴固定版本的第三方庫,避免重復(fù)依賴不同版本相同庫。
方法如下:項(xiàng)目build文件下
configurations.all {
resolutionStrategy {
force "com.kuaishou.koom:koom-java-leak:2.2.2"
}
}
另外,直接通過混淆可以使不使用的文件不打包進(jìn)去。
通過 ModuleDependency#transitive 依賴傳遞設(shè)置
在 dependencies 中配置依賴時(shí) , implementation 依賴配置 后 , 可以 在閉包中 使用 transitive 函數(shù) 設(shè)置依賴是否傳遞 ,
如果為 transitive 函數(shù)設(shè)置 true 參數(shù) , 則 包含傳遞依賴 ;
如果為 transitive 函數(shù)設(shè)置 false 參數(shù) , 則 排除傳遞依賴 ;
dependencies {
implementation ('com.kuaishou.koom:koom-java-leak:2.2.2') {
transitive true // 包括傳遞依賴, 如果設(shè)置為 false 則排除傳遞依賴
}
}
五、查找Gradle依賴中不再使用的組件(無用的庫)
隨著android工程的不斷迭代,gradle配置變得越發(fā)臃腫,dependencies中可能存在很多已經(jīng)不使用的公共庫,嚴(yán)重時(shí)可能拖慢編譯速度。
給大家推薦一個(gè)工具,可以幫助我們發(fā)現(xiàn)這些不再使用的組件
工具庫 github
使用方式 1
root build.gradle
plugins {
id 'com.autonomousapps.dependency-analysis' version "${latest_version}"
}
settings.gradle
pluginManagement {
repositories {
mavenCentral()
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
gradlePluginPortal()
}
}
使用方式 2
root build.gradle
buildscript {
repositories {
mavenCentral()
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
}
dependencies {
classpath "com.autonomousapps:dependency-analysis-gradle-plugin:${latest_version}"
}
}
apply plugin: "com.autonomousapps.dependency-analysis"
添加完依賴后,進(jìn)行同步,會出現(xiàn)如下所示的任務(wù):
使用
執(zhí)行buildHealth 或者其他子task,幫助我們從不同維度生成對gradle配置的檢查結(jié)果,包括但不限于:
- 發(fā)現(xiàn)所有依賴的組件,包括直接依賴和傳遞依賴
- 發(fā)現(xiàn)所以不使用的直接依賴組件
- 發(fā)現(xiàn)所有的二進(jìn)制依賴(ABI)
- gradle的優(yōu)化建議,例如依賴方式的修改建議等
假設(shè)我們點(diǎn)擊了 buildHealth任務(wù),在命令行中會有結(jié)果輸出
> Task :buildHealth
There were dependency violations. See report at E:\jnitest1\build\reports\dependency-analysis\build-health-report.txt
內(nèi)容如下:
Advice for :app
Unused dependencies which should be removed:
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.google.code.gson:gson:2.8.9'
These transitive dependencies should be declared directly:
androidTestImplementation 'androidx.test:monitor:1.4.0'
Existing dependencies which should be modified to be as indicated:
androidTestImplementation 'junit:junit:4.12' (was testImplementation)
同時(shí)在每個(gè)module的build目錄下,也會有reports目錄
jnitest1\app\build\reports
如下圖:
原理:
想要查找沒有依賴的組件,自然要從代碼上進(jìn)行靜態(tài)掃描。
插件工具借助ANTLR對編譯后的字節(jié)碼進(jìn)行分析:收集項(xiàng)目中使用到的class以及組件實(shí)際提供的class,通過對比就可以找到不再使用的組件(沒有class被工程使用)
https://dev.to/autonomousapps/dependency-analysis-gradle-plugin-using-bytecode-analysis-to-find-unused-dependencies-509n
參考如何查找Gradle依賴中不再使用的組件
也可以使用lint來檢查,
通過依次選擇 code > Analyze Code > Run Inspection By Name
然后在對話框中輸入 unused library
六、 推薦閱讀
Java 專欄
SQL 專欄
數(shù)據(jù)結(jié)構(gòu)與算法
Android學(xué)習(xí)專欄
文章來源:http://www.zghlxwxcb.cn/news/detail-801288.html
未經(jīng)允許不得轉(zhuǎn)載文章來源地址http://www.zghlxwxcb.cn/news/detail-801288.html
到了這里,關(guān)于如何查看Android 包依賴關(guān)系&gradle依賴管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!