コンパイルではない歩哨のためのGradleタスク

トビアス・ライヒ:

私は、解析ツールを追加する必要が歩哨を当社のAndroidプロジェクトに。それは(ProGuardの/ R8から)難読化されたコードのマッピングを作成し、歩哨に後でそれをアップロードする、1つのニーズを動作させるために。

ウェブサイト上https://docs.sentry.io/platforms/android/それもそれを行う方法を説明しています。一つはこのように見ているのGradleタスクを作成する必要があることがあり書かれています:

gradle.projectsEvaluated {
    android.applicationVariants.each { variant ->
        def variantName = variant.name.capitalize();
        def proguardTask = project.tasks.findByName(
            "transformClassesAndResourcesWithProguardFor${variantName}")
        def dexTask = project.tasks.findByName(
            "transformClassesWithDexFor${variantName}")
        def task = project.tasks.create(
                name: "processSentryProguardFor${variantName}",
                type: Exec) {
            workingDir project.rootDir
            commandLine *[
                "sentry-cli",
                "upload-proguard",
                "--write-properties",
                "${project.rootDir.toPath()}/app/build/intermediates/assets" +
                    "/${variant.dirName}/sentry-debug-meta.properties",
                variant.getMappingFile(),
                "--no-upload"
            ]
        }
        dexTask.dependsOn task
        task.dependsOn proguardTask
    }
}

ProGuardのは資産に、このプロパティファイルをコピーするよりも、完了するまで、これが待つものとします。私はアンドロイドのGradleスクリプトにこれを追加するときしかし、私はエラーを取得します:

「:アプリ:processSentryProguardForPlayStoreStagingDebug」タスクを作成できませんでした。

方法のいかなる署名:java.util.ArrayList.multiply()は、引数の型に適用されない:(ArrayListの)値:[セントリー-CLI、アップロード-ProGuardの、--write-特性、{アプリケーションパス} /アプリ/ビルド/intermediates/assets/playStoreStaging/debug/sentry-debug-meta.properties、...]]考えられる解決策:乗算(java.lang.Number型)、乗算(java.lang.Number型)

私は、乗算記号と間違っ*コマンドラインアレイの前に何かがあると仮定します。しかし、私はそれを削除するとき、私はエラーを取得します

「:アプリ:processSentryProguardForPlayStoreStagingDebug」タスクを作成できませんでした。

クラスのint型へのクラス「はjava.lang.String型」でオブジェクトの歩哨-CLI」をキャストすることはできません

私はその行でこれをテストしてみましたので、

commandLine "sentry-cli", ...

私は別のエラーを与えました

何が悪かったのか:ない方法DEPENDSON呼び出すことができます()はnullオブジェクトに

したがって、私はdependendタスクを見つけることができないようですので、何かがそのGradleのスクリプトを使用して、本当に間違っていたと仮定します。誰もがこの問題を解決する(または必要に応じてどのようにProGuardの/ R8が終了すると、別の方法で自分の資産へのsentry-debug-meta.propertiesファイルをコピーするために、他のアイデアを持っている)する方法任意のアイデアを持っていますか?

ありがとう!

-------- -------- EDIT

私は重要な何かに気づきました。Gradleのタスクは手動で定義されたものとは異なる名前で定義されています。私の仕事を見て、私は彼らが持っているという名前の

transformClassesAndResourcesWithR8For...

そして

transformClassesWithDexBuilderFor...

しかし、私はチェックのため、その後variantNameを印刷するが、私のタスクが不完全であると思われます。

自分のタスクリストに存在します

transformClassesAndResourcesWithR8ForPlayStoreStagingDebug

だがしかし

transformClassesAndResourcesWithR8ForPlayStoreStagingRelease

したがって、タスクが見つかりません。私はここで本当の問題だと思います。だからここでこれらのGradleのタスクが定義されていますか?

私のプロジェクトのGradleタスクのリスト

------- EDIT 2 --------

大丈夫私はここで奇妙な何かに気づきました。いくつかの亜種は、タスクを持っていません。これは、DEBUGタスクがR8のタスクを持っていないという意味になりますが、私はここにこれを見つけました:

バリアント:PlayStoreStagingRelease DexTaskがnull

バリアント:PlayStorePreviewRelease DexTaskがnull

バリアント:HockeyAppRelease DexTaskがnull

バリアント:LocalServerRelease DexTaskがnull

バリアント:PlayStoreProductionRelease DexTaskがnull

だから、これはどのようにすることができますか?

マーティンZeitler氏:

java.util.ArrayList.multiply()そのためのヒント*の前で[ ]私には奇妙に見えるリスト、。削除してください*[ ]だけ維持しない、List<String>(何がだArrayListで始まるように、予想されます):

commandLine "sentry-cli", "upload-proguard", "--write-properties", "${project.rootDir.toPath()}/app/build/intermediates/assets/${variant.dirName}/sentry-debug-meta.properties", variant.getMappingFile(), "--no-upload"

あなたは、タスクが実際に呼び出されているか調べる必要があるだろうが、それは似て何かをする必要があります:

def r8Task = project.tasks.findByName("transformClassesAndResourcesWithR8For${variantName}")
def d8Task = project.tasks.findByName("transformClassesWithDexBuilderFor${variantName}")

nullチェックではなく、すべてのバリアントはしている可能性があるためminifyEnabled true設定します。

if(r8Task != null) {
    d8Task.dependsOn task
    task.dependsOn r8Task
}

多分以前nullのでチェックが必要であり、variant.getMappingFile()R8が必要です。

そして、いくつかのフレーバーは何D8のタスクは、コードのない(何もする)に基づいていないかもしれない持っていること。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=7676&siteId=1