2016-07-22 2 views
0

Я хотел бы создать задачу Gradle, которая вычисляет CRC classes.dex, а затем записывает полученное значение в строку ресурса. Это значение будет проверяться во время выполнения, чтобы определить, был ли изменен APK или нет. Проблема в том, что начиная с плагина Gradle 1.4. + Больше невозможно получить доступ к задаче dex. Вместо этого мы должны использовать Transform API. Я нашел очень мало документации о задачах Gradle в Android среды, поэтому я хотел бы задать несколько вопросов:Задача градиента для расчета CRC классов.dex

  1. Какая задача Gradle, что имеет дело с файлом classes.dex?
  2. Каким образом Transform будет работать с этой задачей?

Я видел много потоков об этом аргументе, но ни одно из них не имеет рабочего решения. Заранее спасибо!

ответ

0

По Xavier Ducrohet:

Вы должны дважды строить. 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 уже действителен, что означает, что ресурс содержит правильное значение, задача ничего не делает, и сборка продолжается.

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

+0

Вы могли бы просто прокомментировал с этой ссылкой –

+0

я уже видел эту ссылку на группу Google, но это слишком общий характер. Более того, вы больше не можете зависеть от задачи dex: вместо этого вы должны использовать преобразование. – Fabio71