开启ProGuard(R8)混淆后,Maven本地仓库已发布源码在AS中不可见
问题解决:开启混淆后IDE无法查看闭源库的源码文档
当minifyEnabled true时,即使已打包sources.jar并配置ProGuard保留公共API,IDE仍无法显示文档,核心原因是混淆过程丢失了源码关联所需的关键属性,或sources Jar的构建/发布配置存在偏差。以下是针对性修复方案:
1. 补充ProGuard属性保留规则
在ProGuard规则文件中添加以下配置,确保IDE能建立混淆后字节码与原始源码的关联:
// 保留源码文件名和行号信息,用于IDE映射源码 -keepattributes SourceFile,LineNumberTable // 确保公共API的类、构造方法、公共成员完整保留(需覆盖所有目标类) -keep public class com.example.app.MyClass { public <init>(); public <methods>; public <fields>; } -keep public class com.example.app.MyOtherClass { public <init>(); public <methods>; public <fields>; }
2. 固定sources Jar的源码目录
修改androidSourcesJar任务,直接指定原始源码根目录,避免依赖可能被AGP动态修改的sourceSets路径:
def listOfPublicApiFiles = [ '/com/example/app/MyClass.java', '/com/example/app/MyOtherClass.java', ] task androidSourcesJar(type: Jar) { archiveClassifier.set('sources') include(listOfPublicApiFiles) includeEmptyDirs = false // 直接指向原始源码目录,避免AGP混淆后的路径影响 from project.file('src/main/java') // 确保任务在源码编译完成后执行 dependsOn tasks.compileJava }
3. 调整发布配置,确保sources artifact正确关联
修改publishing块,显式绑定sources artifact并确保分类器声明正确:
publishing { publications { standardRelease(MavenPublication) { groupId = 'com.company' artifactId = "myartifact" afterEvaluate { from components.standardRelease // 明确指定sources artifact的分类器,保证POM文件正确识别 artifact androidSourcesJar { classifier 'sources' } } } } // 强制发布任务依赖sources Jar的构建任务 tasks.withType(PublishToMavenRepository) { dependsOn androidSourcesJar } }
验证步骤
- 重新构建并发布库到本地/远程Maven仓库
- 在依赖库的项目中同步Gradle,尝试查看公共API的文档(按F1)
- 检查发布的Maven目录,确认
sources.jar存在且POM文件包含<classifier>sources</classifier>的artifact声明
内容的提问来源于stack exchange,提问作者Carson Holzheimer
相关产品推荐
相关产品推荐

