【问题标题】: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 也拉到项目中,并在实现获取参数名称等方法时使用它。

        【讨论】:

          猜你喜欢
          • 2013-08-29
          • 2014-05-21
          • 1970-01-01
          • 1970-01-01
          • 2021-09-20
          • 2015-04-28
          • 2018-02-16
          • 2015-10-21
          • 2016-07-18
          相关资源
          最近更新 更多