Android — обработка ошибок dx — неразумное или ошибочное использование основного класса 2012, обновление Android 4

Когда я получил сообщение об ошибке «Опрометчивое или ошибочное использование основного класса» при попытке создать свое приложение, я провел поиск в Stackoverflow и, как некоторые предлагали, использовал ant и jarjar для сборки приложения.

Сбой сборки ant на шаге dx с ошибкой, о которой сообщается ниже.

Я искал в Интернете предложения о том, как исправить ошибку «не могу принудить» (см. Ниже), и не нашел ничего, что помогло бы.

Обратите внимание, что шаг jarjar в сборке ant работал. Когда я проверил содержимое каталогов java в bin/repackagedclasses.jar, они были пусты, и все их содержимое было перенесено в эквивалентные переименованные каталоги (/java).

Также обратите внимание, что предложения, которым я следовал (используя ant и jarjar), были старше двух лет и применялись к Android 2.x. Возможно (вероятно?), что с андроидом 4 и сопутствующей инфраструктурой они работать не будут, просто предположение.

Последний пункт. Я изменил dx в sdk/platform-tools следующим образом:

exec java $javaOpts -jar "$jarpath" "$@"
exec java $javaOpts -jar "$jarpath" --core-library "$@"

С вышеуказанным изменением или без него это не имело никакого значения для сборки ant или сборки Eclipse.

-dex:
      [dex] Converting compiled files and external libraries into /home/adonnini/workspace3/CommManagerN6/bin/classes.dex...
       [dx] 
       [dx] UNEXPECTED TOP-LEVEL EXCEPTION:
       [dx] com.android.dx.util.ExceptionWithContext: can't coerce string{"android.permission.ACCESS_CACHE_FILESYSTEM"} to Lcommmanager/java/lang/String;
       [dx]     at com.android.dx.util.ExceptionWithContext.withContext(ExceptionWithContext.java:46)
       [dx]     at com.android.dx.dex.cf.CfTranslator.processFields(CfTranslator.java:176)
       [dx]     at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:133)
       [dx]     at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:87)
       [dx]     at com.android.dx.command.dexer.Main.processClass(Main.java:483)
       [dx]     at com.android.dx.command.dexer.Main.processFileBytes(Main.java:455)
       [dx]     at com.android.dx.command.dexer.Main.access$400(Main.java:67)
       [dx]     at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:394)
       [dx]     at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245)
       [dx]     at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131)
       [dx]     at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109)
       [dx]     at com.android.dx.command.dexer.Main.processOne(Main.java:418)
       [dx]     at com.android.dx.command.dexer.Main.processAllFiles(Main.java:329)
       [dx]     at com.android.dx.command.dexer.Main.run(Main.java:206)
       [dx]     at com.android.dx.command.dexer.Main.main(Main.java:174)
       [dx]     at com.android.dx.command.Main.main(Main.java:91)
       [dx] Caused by: java.lang.UnsupportedOperationException: can't coerce string{"android.permission.ACCESS_CACHE_FILESYSTEM"} to Lcommmanager/java/lang/String;
       [dx]     at com.android.dx.dex.cf.CfTranslator.coerceConstant(CfTranslator.java:210)
       [dx]     at com.android.dx.dex.cf.CfTranslator.processFields(CfTranslator.java:160)
       [dx]     ... 14 more
       [dx] ...while processing ACCESS_CACHE_FILESYSTEM Lcommmanager/java/lang/String;
       [dx] ...while processing android/commmanager/Manifest$permission.class
       [dx] 
       [dx] 1 error; aborting

BUILD FAILED
/home/adonnini/workspace3/CommManagerN6/build.xml:964: The following error occurred while executing this line:
/home/adonnini/workspace3/CommManagerN6/build.xml:376: null returned: 1

person user1673603    schedule 15.09.2012    source источник


Ответы (1)


Вы не сказали, какие аргументы вы передали jarjar, но, судя по всему, вы, возможно, сказали ему изменить все ссылки на классы в java.lang, чтобы вместо этого они находились в пространстве имен вашего пакета. Если это то, что вы сделали, это определенно не сработает, и ошибка, которую вы получаете, — это только вершина айсберга.

Вот грубый перевод ошибки: объявлено, что какой-то фрагмент кода принимает экземпляр класса commmanager.java.lang.String, но ему передается экземпляр класса java.lang.String (то есть класса, экземпляром которого является любая нормальная строковая константа). Между этими двумя классами нет отношения наследования, поэтому код недействителен.

Как минимум, вы, вероятно, захотите сделать вызов jarjar более конкретным в отношении имен классов, которые он искажает.

person danfuzz    schedule 16.09.2012
comment
Привет, danfuzz, Извините, что не включил мой build.xml. Соответствующий параметр jarjar: - person user1673603; 17.09.2012
comment
Привет Данфуз. Ваше предположение было правильным. Я пытался следовать предложению в сообщении об ошибке... самая простая безопасная альтернатива, которая у вас есть, - это переупаковать этот код. То есть переместите рассматриваемые классы в собственное пространство имен пакетов. Это означает, что они никогда не будут конфликтовать с базовыми системными классами. JarJar — это инструмент, который может помочь вам в этом начинании… Как вы видели, он не сработал. Я провожу эксперимент, в котором мне нужно иметь класс java.lang в моем пакете. Любые идеи? - person user1673603; 17.09.2012
comment
Любые идеи? Ну, вы знаете, как это сообщение об ошибке говорит… не рекомендуется… Я почти уверен, что вы находитесь на этой территории. :) - person danfuzz; 18.09.2012