Включение классов с одинаковым именем пакета и именем в APK

При создании APK для Android инструмент DX не работает, если вы дважды пытаетесь добавить одну и ту же библиотеку с такой ошибкой:

НЕОЖИДАННОЕ ИСКЛЮЧЕНИЕ НА ВЕРХНЕМ УРОВНЕ: java.lang.IllegalArgumentException: уже добавлено: Lcom / google / ads / AdRequest $ Gender; в com.android.dx.dex.file.ClassDefsSection.add (ClassDefsSection.java:122) в com.android.dx.dex.file.DexFile.add (DexFile.java:161) в com.android.dx.command .dexer.Main.processClass (Main.java:685) в com.android.dx.command.dexer.Main.processFileBytes (Main.java:634) в com.android.dx.command.dexer.Main.access $ 600 ( Main.java:78) в com.android.dx.command.dexer.Main $ 1.processFileBytes (Main.java:572) в com.android.dx.cf.direct.ClassPathOpener.processArchive (ClassPathOpener.java:284) в com.android.dx.cf.direct.ClassPathOpener.processOne (ClassPathOpener.java:166) в com.android.dx.cf.direct.ClassPathOpener.processDirectory (ClassPathOpener.java:229) в com.android.dx.cf. direct.ClassPathOpener.processOne (ClassPathOpener.java:158) в com.android.dx.cf.direct.ClassPathOpener.process (ClassPathOpener.java:144) в com.android.dx.command.dexer.Main.processOne (Main. java: 596) в com.android.dx.command.dexer.Main.processAllFiles (M ain.java:498) на com.android.dx.command.dexer.Main.runMonoDex (Main.java:264) на com.android.dx.command.dexer.Main.run (Main.java:230) на com .android.dx.command.dexer.Main.main (Main.java:199) в com.android.dx.command.Main.main (Main.java:103) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.Method.Method. main (SDKMain.java:129) 1 ошибка; прерывание

Что делать, если у меня есть 2 разные библиотеки (jar-файлы), содержащие классы с одинаковым именем и именем пакета?

Как я могу добавить их в свой APK? Есть какой-либо способ сделать это ?


person lysergic-acid    schedule 03.07.2014    source источник


Ответы (1)


Во-первых, обратите внимание, что может появиться сообщение об ошибке «уже добавлено», даже если два jar-файла не находятся в одном проекте. Например: привязка вашего проекта к проекту библиотеки, содержащему банку с такими же классами.

Secondly: if you do have two jars with the same class file the build system will simply use the first one that it sees. So, if you know which of them you want your runtime to use, the solution is simple: just place it earlier in the classpath. Or visually speaking - place it higher in the Order and Export list:

введите описание изображения здесь


В-третьих: если у вас действительно нет другого пути, вы всегда можете открыть файл jar (например, используя WinRAR) и удалите некоторые из его файлов классов.

person Gilad Haimov    schedule 03.07.2014
comment
Как это связано с моим вопросом? Я хочу создать APK, содержащий мой код + 2 внешние библиотеки. В каждой библиотеке есть класс, определенный с тем же именем (и пакетом). Во время DX это не удастся (с ошибкой, которую я опубликовал). Как это преодолеть? - person lysergic-acid; 05.07.2014