2016-07-22 17 views
0

classes.dex CRCを計算し、結果の値をリソース文字列に書き込むGradleタスクを作成したいとします。実行時にこの値がチェックされ、APKが改ざんされているかどうかが判断されます。問題は、Gradle Plugin 1.4以降でdexタスクにはもうアクセスできません。代わりに、Transform APIを使用する必要があります。私は、Android環境でのGradleのタスクについてほとんどのドキュメントを見つけたので、私はいくつかの質問を頼む:classes.dex CRC計算のためのGradleタスク

  1. classes.dexファイルを扱うのGradleのタスクは何ですか?
  2. Transformはこのタスクでどのように動作しますか?

私はこの引数について多くのスレッドを見てきましたが、これらのいずれも動作する解決策はありません。前もって感謝します!ザビエルDucrohetによると

答えて

0

あなたが二回構築する必要があります。 classes.dexには、resコンパイルから生成するR.classが含まれています。だからあなたがCRC32を計算しているうちにそれを入れるのは遅すぎます。

一般に、タスクの実行中はモデルを変更しないでください。実際、Gradleは、タスクが実行されているときにモデルに触れないことを本当に必要とするタスクの並列化を導入します。だから我々はこれを不可能にすることによってこれを解決しようとしている(しようとしている)。私はちょうど提出>https://code.google.com/p/android/issues/detail?id=82574

私は次のようにします: - あなたのプロジェクトの評価段階では、CRCを含むファイルを読んで、リソースとして設定してください。 (グアバを使用して)このような何か:

android.applicationVariants.all { variant -> variant.resValue "string", "CRC", com.google.common.io.Files.toString(file("$buildDir/intermediates/checksum/$variant.dirName/classes.crc32"), Charsets.UTF_8) }

  • セットアップCRC32を含むファイルを作成したタスク。

android.applicationVariants.all { variant -> variant,outputs.each { // create the task here. it depends on the dex task, and make the outputs.packageApplication task depend on it. } }

注:これは十分ではありません。あなたがしなければならないことは、新しく計算されたCRC32が現在のファイルと異なる場合、ビルドが壊れて、2回目のビルドを強制することです。このようにして、次の2つの場合があります。 - CRC32ファイルが見つからないか、内容が正しくありません。新しいCRC32を計算してファイルに入れ、ビルドに失敗してこの新しい値で再度ビルドします。 - CRC32はすでに有効です。リソースに正しい値が含まれていることを意味します。タスクはそれ以上何もせず、ビルドは続行されます。

https://groups.google.com/d/msg/adt-dev/W2aYLBSeGUE/fzOqyH8YibQJ

+0

あなたはちょうど私が既にGoogleグループにリンクしているページを見てきましたそのリンク –

+0

とコメントしていたかもしれないが、それはあまりにも一般的なのです。さらに、dexタスクにもう依存することはできません。代わりに変換を使用する必要があります。 – Fabio71

関連する問題