classes.dex CRC计算的渐变任务



我想创建一个Gradle任务,该任务计算classes.dex CRC,然后将结果值写入资源字符串。该值将在运行时进行检查,以确定APK是否已被篡改。问题是,从Gradle插件1.4.+开始,就不可能再访问dex任务了。相反,我们应该使用Transform API。我在Android环境中发现的关于Gradle任务的文档很少,所以我会问几个问题:

  1. 处理classes.dex文件的Gradle任务是什么
  2. 转换应如何处理此任务

我看过很多关于这个论点的线索,但都没有一个有效的解决方案。提前感谢!

根据Xavier Ducrohet:

你必须建造两次。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与当前文件不同,则构建会中断,迫使您进行第二次构建。这样你就有了两种情况:-CRC32文件丢失或内容不正确。您计算新的CRC32,将其放入文件中,并使构建失败,迫使使用此新值重新构建。-CRC32已经有效,这意味着资源包含正确的值,任务不再执行任何操作,构建继续。

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

最新更新