1

デバッグ ビルドを実行すると、Java リソースは問題なく jar にパックされます。ただし、リリース ビルドでは機能しません。gradle タスク processReleaseJavaRes はデバッグ ビルドに対してのみ実行されることに気付きました。Android gradle コードを検索したところ、次のコード行が見つかりました。

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/ に作成されましたが、次の問題が発生しました。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]

前もって感謝します、ロマンスキー

4

2 に答える 2

0

解決策は見つかりませんでしたが、問題の回避策を作成しました。タスクを手動で実行し、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
    }
}
于 2014-09-23T13:18:49.593 に答える