2016-07-22 88 views
0

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

  1. 那是什么用classes.dex文件涉及的摇篮任务?
  2. 变换应该如何处理这个任务?

我见过很多关于这个参数的线程,但没有一个有工作的解决方案。提前致谢!

回答

0

根据泽维尔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

+0

你可能刚刚与评论我已经看到了在谷歌组链接,链接 –

+0

,但它太普通。而且,你不能依赖dex任务:你必须使用转换。 – Fabio71