【问题标题】:Java resource files are missing when I build my android library with gradle and proguard当我使用 gradle 和 proguard 构建我的 android 库时,Java 资源文件丢失
【发布时间】:2014-09-12 12:00:51
【问题描述】:

当我进行调试构建时,java 资源被打包到 jar 中没有任何问题。但是,它不适用于发布版本。我注意到 gradle 任务 processReleaseJavaRes 仅针对调试版本执行。我搜索了android gradle代码,发现如下lines of code:

if (variantConfig.buildType.runProguard) {
    // run proguard on output of compile task
    createProguardTasks(variantData, null)
    // hack since bundle can't depend on variantData.proguardTask
    mergeProGuardFileTask.dependsOn variantData.proguardTask
    bundle.dependsOn packageRes, packageAidl, packageRenderscript, mergeProGuardFileTask, lintCopy, variantData.ndkCompileTask
} else {
    Sync packageLocalJar = project.tasks.create("package${variantData.variantConfiguration.fullName.capitalize()}LocalJar",Sync)
    packageLocalJar.from(getLocalJarFileList(variantData.variantDependency))
    packageLocalJar.into(project.file("$project.buildDir/$DIR_BUNDLES/${variantData.variantConfiguration.dirName}/$SdkConstants.LIBS_FOLDER"))
    // jar the classes.
    Jar jar = project.tasks.create("package${buildType.name.capitalize()}Jar", Jar);
    jar.dependsOn variantData.javaCompileTask, variantData.processJavaResourcesTask
    jar.from(variantData.javaCompileTask.outputs);
    jar.from(variantData.processJavaResourcesTask.destinationDir)
    ...
    bundle.dependsOn packageRes, jar, packageAidl, packageRenderscript, packageLocalJar, mergeProGuardFileTask, lintCopy, variantData.ndkCompileTask
    ...
}

然后我尝试将任务添加为 proguardRelease 的依赖项:

tasks.whenTaskAdded { task ->
    if (task.name.matches("proguardRelease")) {
        task.dependsOn('processReleaseJavaRes')
    }
}

这很好用,并且 java 资源是在 build/intermediates/javaResources/ 中创建的 - 但随后出现了下一个问题。我如何告诉 proguard 它应该使用 build/intermediates/classes 中的类构建 jar,并且还包括 build/intermediates/javaResources 中的资源?我尝试使用 -injars 设置 javaResources 路径。现在它们已添加到 proguard(请参阅下面的日志输出),但未添加到 build/intermediate/bundles/release/classes.jar 中的 classes.jar。

13:32:30.731 [INFO] [system.out] Reading program directory [/path/to/my/project/build/intermediates/classes/release] (filtered)
13:32:30.913 [INFO] [system.out] Reading program directory [/path/to/my/project/build/intermediates/javaResources/release]

提前致谢, 罗曼斯基

【问题讨论】:

    标签: android gradle proguard aar


    【解决方案1】:

    我也遇到了同样的问题,filed an issue for the project

    与此同时,我使用了以下 sn-p 来解决此问题:

    android.libraryVariants.all { variant ->
    
        def proguardTask = variant.obfuscation
            if (proguardTask != null) {
                proguardTask.doFirst {
                    copy {
                        from variant.processJavaResources.destinationDir
                        into variant.javaCompile.destinationDir
                    }
                }
            }
    }
    

    它将java res文件夹复制到classes文件夹中,并包含在最终的jar中。

    【讨论】:

      【解决方案2】:

      我还没有找到解决方案,但我为这个问题做了一个解决方法:我只是手动运行任务,然后从 java 资源和混淆的 jar 文件创建一个 jar:

      android.libraryVariants.all { variant ->
          variant.outputFile = file("${project.buildDir}/outputs/aar/${project.archivesBaseName}-${variant.baseName}.aar");
      
          if(variant.buildType.name.matches("release")) {
              tasks.create(name: "enriched${variant.name.capitalize()}Jar", type:Jar, dependsOn:variant.processJavaResources) {
                  from zipTree("${project.buildDir}/intermediates/bundles/${variant.dirName}/classes.jar") // add original content
                  from fileTree("${project.buildDir}/intermediates/javaResources/${variant.dirName}/")
                  destinationDir(file("${project.buildDir}/intermediates/bundles/${variant.dirName}/"))
                  includeEmptyDirs false
                  archiveName 'classes_full.jar'
              }
      
              tasks.create(name: "fix${variant.name.capitalize()}Files", type:Delete, dependsOn:"enriched${variant.name.capitalize()}Jar") {
                  delete "${project.buildDir}/intermediates/bundles/${variant.dirName}/classes.jar"
                  doLast{
                      file("${project.buildDir}/intermediates/bundles/${variant.dirName}/classes_full.jar").renameTo(file("${project.buildDir}/intermediates/bundles/${variant.dirName}/classes.jar"))
                  }
              }
      
              variant.packageLibrary.dependsOn "fix${variant.name.capitalize()}Files"
              tasks["fix${variant.name.capitalize()}Files"].mustRunAfter variant.obfuscation
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-04
        • 1970-01-01
        • 2013-08-31
        • 1970-01-01
        • 2018-05-12
        • 1970-01-01
        • 2013-09-20
        • 2019-03-13
        相关资源
        最近更新 更多