【问题标题】:Obfuscated interface parameter names in gradle librarygradle 库中的混淆接口参数名称
【发布时间】:2018-10-09 01:25:31
【问题描述】:
我制作了一个带有一些接口的库(github 上的 HybridMediaPlayer)。当我从新项目中的 gradle 导入它并使用这些接口时,我会更改参数名称,例如:
player.setOnPositionDiscontinuityListener(new ExoMediaPlayer.OnPositionDiscontinuityListener() {
@Override
public void onPositionDiscontinuity(int i, int i1) {
}
});
其中“i”是“原因”,“i1”是“currentWindowIndex”。
为什么它在其他项目中发生了变化以及如何解决这个问题? Proguard 被禁用。
【问题讨论】:
标签:
android
gradle
android-gradle-plugin
【解决方案1】:
jitpack 的解决方案是在 lib gradle 构建文件中为接口添加 javadoc:
// build a jar with source files
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadoc(type: Javadoc) {
failOnError false
source = android.sourceSets.main.java.sourceFiles
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
classpath += configurations.compile
}
// build a jar with javadoc
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives sourcesJar
archives javadocJar
}
【解决方案2】:
发生这种情况的原因有两个:
1.您没有在 AAR
中包含任何文档作为工件
如果是这种情况,那么您需要在 AAR 的build.gradle 中添加以下任务,如下所示:
task javadoc(type: Javadoc) {
description "Generates Javadoc for ${archivesBaseName}-${version} API"
group JavaBasePlugin.DOCUMENTATION_GROUP
title = "${archivesBaseName}-${version} API References"
source android.sourceSets.main.java.srcDirs, configurations.doc.collect { zipTree(it) }
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
options {
memberLevel = JavadocMemberLevel.PUBLIC
linksOffline('http://developer.android.com/reference/', "${android.sdkDirectory}/docs/reference");
}
include '<path of your public api>/*.java'
exclude '**/BuildConfig.java'
exclude '**/R.java'
exclude '**/test/**/*.java'
failOnError false
}
task androidJavadocsJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives androidJavadocsJar
}
2。您已经完成了第 1 步
如果是这种情况,您需要通知 android studio 下载javaDoc。将以下代码放入目标应用程序的主 build.gradle
apply plugin: 'idea'
...
idea {
module {
downloadJavadoc = true
downloadSources = true
}
}
或者,您可以按照SO 通过 android studio 进行操作。
注意:您需要在AAR 的用户指南中正确记录Javadoc 下载,以便AAR 的用户知道如何克服障碍
【解决方案3】:
我认为这是因为在 Maven repo 上只存在一个 Android 存档库 (AAR),并且没有源 jar。 AAR 仅包含已编译的类,而在已编译的类中,完整的变量名称不再是已知的。因此,当您的 IDE 实现该方法时,它不再知道名称,因此它默认为基于参数类型的标准命名(因此 i 表示整数)。
如果您想要正确的变量名,您应该将项目的源 jar 以及 Jitpack 存储库发布。 This 答案可能提供了一种在 AAR 旁边发布源 jar 的方法。当源 jar 也发布时,IDE 将使用 Gradle 将源 jar 也拉到项目中,并在实现获取参数名称等方法时使用它。