Вы должны дважды строить. classes.dex содержит R.class, который генерируется из компиляции res. Таким образом, к тому времени, когда вы вычисляете CRC32, его слишком поздно вставлять.
В общем, вы действительно не должны изменять модель во время выполнения задачи. Фактически, Gradle представит распараллеливание задач, которое действительно потребует не касаться модели при запуске задачи. Поэтому мы собираемся (попытаемся) исправить это, сделав это невозможным. Я только что подал заявку>https://code.google.com/p/android/issues/detail?id=82574
Поэтому я бы сделал следующее: - на этапе оценки вашего проекта прочитайте файл, содержащий CRC, и установите его как ресурсы. Нечто подобное (с использованием Guava):
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 уже действителен, что означает, что ресурс содержит правильное значение, задача ничего не делает, и сборка продолжается.
Вы могли бы просто прокомментировал с этой ссылкой –
я уже видел эту ссылку на группу Google, но это слишком общий характер. Более того, вы больше не можете зависеть от задачи dex: вместо этого вы должны использовать преобразование. – Fabio71