You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动获取Android项目依赖库的版本、许可证信息并在应用内展示?

解决Android依赖库扫描、版本/许可证展示及自动更新问题

一、修复Google官方play-services-oss-licenses空白页问题

如果坚持使用官方插件,空白页通常是配置遗漏或混淆导致,按以下步骤排查:

  1. 统一插件与依赖版本
    确保项目级build.gradle和app级build.gradle中的版本完全一致,比如:
    项目级:
    buildscript {
        dependencies {
            classpath 'com.google.android.gms:play-services-oss-licenses:17.0.0'
        }
    }
    
    app级:
    apply plugin: 'com.google.android.gms.oss-licenses-plugin'
    
    dependencies {
        implementation 'com.google.android.gms:play-services-oss-licenses:17.0.0'
    }
    
  2. 添加混淆规则
    在proguard-rules.pro中加入,防止许可证相关类被混淆移除:
    -keep class com.google.android.gms.oss.licenses.** { *; }
    -keep class com.google.android.gms.common.** { *; }
    
  3. 验证启动逻辑
    确保启动的是正确的Activity:
    startActivity(new Intent(this, OssLicensesMenuActivity.class));
    
  4. 重新同步与构建
    执行Clean Project→Rebuild Project,确保依赖下载完整,许可证数据生成成功。

二、自定义Gradle任务实现灵活控制

如果需要完全自定义展示格式(包含版本号),并实现依赖变更自动更新,可编写自定义Gradle任务生成依赖数据:

  1. 添加自定义任务到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
    
  2. 应用内解析展示
    在应用中读取raw/dependencies.json,用RecyclerView自定义布局展示:
    • 每个列表项显示groupId:artifactId:version
    • 点击项弹出对话框展示对应许可证详情
      这样每次Gradle依赖变更,构建时都会自动重新生成数据,无需手动操作。

三、第三方库快速实现:LicensesDialog

如果追求快速集成,可使用LicensesDialog库,自动收集许可证并支持自定义展示:

  1. 添加依赖与插件
    项目级build.gradle:
    buildscript {
        dependencies {
            classpath 'de.psdev.licensesdialog:licensesdialog-plugin:2.1.0'
        }
    }
    
    app级build.gradle:
    apply plugin: 'de.psdev.licensesdialog'
    
    dependencies {
        implementation 'de.psdev.licensesdialog:licensesdialog:2.1.0'
    }
    
  2. 自动生成许可证数据
    执行Gradle任务generateLicenses,会在src/main/res/raw下生成notices.xml,包含所有依赖的许可证信息。
  3. 启动展示对话框
    new LicensesDialog.Builder(this)
        .setNotices(R.raw.notices)
        .setTitle("开源许可证")
        .setIncludeOwnLicense(true) // 可选,添加自身项目许可证
        .build()
        .show();
    
    若要实现依赖变更自动更新,可将generateLicenses绑定到构建流程:
    preBuild.dependsOn generateLicenses
    

内容的提问来源于stack exchange,提问作者Swagat Mali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:50:17