私は、解析ツールを追加する必要が歩哨を当社の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のタスクが定義されていますか?
------- EDIT 2 --------
大丈夫私はここで奇妙な何かに気づきました。いくつかの亜種は、タスクを持っていません。これは、DEBUGタスクがR8のタスクを持っていないという意味になりますが、私はここにこれを見つけました:
バリアント:PlayStoreStagingRelease DexTaskがnull
バリアント:PlayStorePreviewRelease DexTaskがnull
バリアント:HockeyAppRelease DexTaskがnull
バリアント:LocalServerRelease DexTaskがnull
バリアント:PlayStoreProductionRelease DexTaskがnull
だから、これはどのようにすることができますか?
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のタスクは、コードのない(何もする)に基づいていないかもしれない持っていること。