Сообщение «Метод превышает лимит команд компилятора» на скважине при методе 64 КБ - PullRequest
0 голосов
/ 02 марта 2019

Я часто вижу в своем журнале повторяющиеся сообщения, подобные этому:

Method exceeds compiler instruction limit: 29278 in void com.xxxxxxapp.xxxxxx.MyGLRenderer.onDrawFrame(javax.microedition.khronos.opengles.GL10)
Method exceeds compiler instruction limit: 29278 in void com.xxxxxxapp.xxxxxx.MyGLRenderer.onDrawFrame(javax.microedition.khronos.opengles.GL10)
Method exceeds compiler instruction limit: 29278 in void com.xxxxxxapp.xxxxxx.MyGLRenderer.onDrawFrame(javax.microedition.khronos.opengles.GL10)

При разборе кода обычно выдается то же сообщение с меньшим номером:

Method exceeds compiler instruction limit: 22400 in void com.xxxxxxapp.xxxxxx.MyGLRenderer.onDrawFrame(javax.microedition.khronos.opengles.GL10)

Я думал, что 64000 быломагическое число, чтобы держать под здесь.Мой игровой код всегда работал нормально, несмотря на такие неприятные сообщения, как это, и дело не только в методе opengl onDrawFrame.Я получил похожие сообщения в моем методе обновления для более чем 64 КБ, хотя код обновления проще разбить, чем код рисования.

Поиски «Метод превышает лимит инструкций компилятора» только что дали мне ссылки на страшныеОшибка «Предел компилятора Dalvik для методов 64K».Должен ли я продолжать игнорировать это?

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

, чтобы пропустить эту ошибку, вы можете использовать параметр proGaurd minify Enabled как для вашей версии, так и для версии отладки.если это не помогает, используйте приложение MultiDex.Для получения дополнительной информации обратитесь к этой документации. MultiDex

0 голосов
/ 02 марта 2019

это происходит из-за Compiler::IsPathologicalCase:

Пропускать компиляцию для патологически больших методов - либо по количеству инструкций, либо по num vregs.

Dalvik использует 16-битные uints для инструкций ирегистр имеет значение.Мы ограничимся четвертью этого, что также гарантирует, что мы не сможем переполнить наше 16-разрядное внутреннее пространство имен Quick SSA.

source: compiler.cc .

16-бит uint может представлять максимальное значение 65535, деленное на 4, равное 16383.75.

повышение целевого уровня с Dalvik до ART может обойти его;потому что Dalvik и javax.microedition.khronos.opengles.GL10 кажутся несовместимыми из-за количества команд.

после этого проверяется количество регистров, поэтому это неКажется, проблема здесь.

исправление compiler.cc также будет вариант, несмотря на не очень хороший.

  • , когда 4 будет 2,это позволило бы удвоить сумму.

  • , если не return true, также следует продолжить компиляцию.

это проверка, котораявиноват:

if (accessor.InsnsSizeInCodeUnits() >= UINT16_MAX / 4) {
  LOG(INFO) << "Method exceeds compiler instruction limit: "
            << accessor.InsnsSizeInCodeUnits()
            << " in " << dex_file.PrettyMethod(method_idx);
  return true;
}

отказ от ответственности: без малейшей гарантии отсутствия побочных эффектов.

...