2014-09-12 1 views
0

디버그 빌드를 수행 할 때 java 리소스가 아무 문제없이 jar로 압축됩니다. 그러나 릴리스 빌드에서는 작동하지 않습니다. 나는 gradle task processReleaseJavaRes가 디버그 빌드를 위해서만 실행된다는 것을 알아 차렸다. 나는 안드로이드 Gradle을 코드를 검색하고 볼 수있는 그때 proguardRelease의 실행 종속으로 작업을 추가하려고 lines of code:gradle 및 proguard로 안드로이드 라이브러리를 빌드하면 자바 리소스 파일이 누락됩니다.

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 
    ... 
} 

다음

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

이 잘 작동하고 자바 자원이 빌드에서 만든/중간체/javaResources/-하지만 다음 문제가 발생했습니다. proguard에게 빌드/중간체/클래스의 클래스로 jar 파일을 빌드하고 build/intermediate/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] 

감사합니다, Romanski

답변

0

내가 해결책을 발견하지 않은,하지만 난이 문제에 대한 해결 방법을 만들어 : 난 그냥 자바 자원에서 항아리를 만드는 수동으로 작업을 실행하고 모호한 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 
    } 
} 
1
저도 같은 문제로 실행

하고, 한편 filed an issue for the project

, 나는 다음을 사용

android.libraryVariants.all { variant -> 

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

는 그것은 classes 폴더에 자바 고해상도 폴더를 복사합니다, 그것은 최종 항아리에 포함됩니다 : 조각은 문제를 해결합니다.

+0

그것은 내 목숨을 구하기위한 것입니다. 많은 감사합니다. –