如何自动获取Android项目依赖库的版本、许可证信息并在应用内展示?
解决Android依赖库扫描、版本/许可证展示及自动更新问题
一、修复Google官方play-services-oss-licenses空白页问题
如果坚持使用官方插件,空白页通常是配置遗漏或混淆导致,按以下步骤排查:
- 统一插件与依赖版本
确保项目级build.gradle和app级build.gradle中的版本完全一致,比如:
项目级:
app级:buildscript { dependencies { classpath 'com.google.android.gms:play-services-oss-licenses:17.0.0' } }apply plugin: 'com.google.android.gms.oss-licenses-plugin' dependencies { implementation 'com.google.android.gms:play-services-oss-licenses:17.0.0' } - 添加混淆规则
在proguard-rules.pro中加入,防止许可证相关类被混淆移除:-keep class com.google.android.gms.oss.licenses.** { *; } -keep class com.google.android.gms.common.** { *; } - 验证启动逻辑
确保启动的是正确的Activity:startActivity(new Intent(this, OssLicensesMenuActivity.class)); - 重新同步与构建
执行Clean Project→Rebuild Project,确保依赖下载完整,许可证数据生成成功。
二、自定义Gradle任务实现灵活控制
如果需要完全自定义展示格式(包含版本号),并实现依赖变更自动更新,可编写自定义Gradle任务生成依赖数据:
- 添加自定义任务到app/build.gradle
该任务会扫描所有运行时依赖,提取groupId、artifactId、版本、许可证信息,生成JSON文件到raw目录:task generateDependencyReport { doLast { def outputFile = file("$projectDir/src/main/res/raw/dependencies.json") def dependencyList = [] // 扫描release环境的运行时依赖 configurations.releaseRuntimeClasspath.allDependencies.each { dep -> if (dep instanceof ExternalModuleDependency && dep.group != null) { try { def pom = dep.module.pom pom.withXml { xmlNode -> def licenseNodes = xmlNode.asNode().licenses.license def licenses = licenseNodes.collect { [name: it.name.text(), url: it.url.text()] } dependencyList.add([ groupId: dep.group, artifactId: dep.name, version: dep.version, licenses: licenses ]) } } catch (Exception e) { // 处理无法获取POM的依赖,比如本地aar dependencyList.add([ groupId: dep.group, artifactId: dep.name, version: dep.version, licenses: [["name": "Unknown License", "url": ""]] ]) } } } // 生成格式化JSON outputFile.text = new groovy.json.JsonBuilder(dependencyList).toPrettyString() } } // 绑定到构建流程,每次构建自动更新 preBuild.dependsOn generateDependencyReport - 应用内解析展示
在应用中读取raw/dependencies.json,用RecyclerView自定义布局展示:- 每个列表项显示
groupId:artifactId:version - 点击项弹出对话框展示对应许可证详情
这样每次Gradle依赖变更,构建时都会自动重新生成数据,无需手动操作。
- 每个列表项显示
三、第三方库快速实现:LicensesDialog
如果追求快速集成,可使用LicensesDialog库,自动收集许可证并支持自定义展示:
- 添加依赖与插件
项目级build.gradle:
app级buildscript { dependencies { classpath 'de.psdev.licensesdialog:licensesdialog-plugin:2.1.0' } }build.gradle:apply plugin: 'de.psdev.licensesdialog' dependencies { implementation 'de.psdev.licensesdialog:licensesdialog:2.1.0' } - 自动生成许可证数据
执行Gradle任务generateLicenses,会在src/main/res/raw下生成notices.xml,包含所有依赖的许可证信息。 - 启动展示对话框
若要实现依赖变更自动更新,可将new LicensesDialog.Builder(this) .setNotices(R.raw.notices) .setTitle("开源许可证") .setIncludeOwnLicense(true) // 可选,添加自身项目许可证 .build() .show();generateLicenses绑定到构建流程:preBuild.dependsOn generateLicenses
内容的提问来源于stack exchange,提问作者Swagat Mali
相关产品推荐
相关产品推荐

