我想创建一个计算classes.dex
CRC的Gradle任务,然后将结果值写入资源字符串。将在运行时检查此值以确定APK是否已被篡改。问题是从Gradle插件1.4开始。+不再可以访问dex任务。相反,我们应该使用Transform API。我在Android环境中找到关于Gradle任务的文档很少,所以我会问几个问题:
classes.dex
文件的Gradle任务是什么?我已经看到很多关于这个论点的线索,但这些都没有一个有效的解决方案。提前谢谢!
答案 0 :(得分:0)
根据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