Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Two Android libraries duplicate the same jar - Ant build error

Tags:

android

ant

I have a project that uses two independent Android libraries. Each of them contains Android support package, so that ant build fails on 'dex' step:

   [dx] UNEXPECTED TOP-LEVEL EXCEPTION:
   [dx] java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat;
   [dx]     at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123)
   [dx]     at com.android.dx.dex.file.DexFile.add(DexFile.java:163)
   [dx]     at com.android.dx.command.dexer.Main.processClass(Main.java:486)
   [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:95)
   [dx] 1 error; aborting

What should I do?

I'm going to move one of these jar files out of the libs folder in -post-compile target. And then move it back after dex step is finished. What are your recommendations?

UPDATE: I've tried to move the support package out of one the libraries in -post-compile target but it still fails because of another reason. This jar is already included to the path that is processed by dex task. And dex task cannot open the removed jar.

like image 768
Roman Mazur Avatar asked Mar 20 '12 17:03

Roman Mazur


2 Answers

Fix is already implemented in ADT-r17 preview builds.

More details here: http://tools.android.com/recent/dealingwithdependenciesinandroidprojects

like image 75
kzotin Avatar answered Oct 23 '22 05:10

kzotin


You should avoid having the same library in both. Can't you exclude one support package specifically using wildcards from one of the libraries at compile time of your project? By filtering it out with proguard, for instance:

-libraryjars  ${android.libraryjars}(!org/xmlpull/v1/XmlPullParser.class,!org/xmlpull/v1/XmlPullParserException.class,!META-INF/MANIFEST.MF,!META-INF/NOTICE.txt,!META-INF/LICENSE.txt)
like image 36
pjv Avatar answered Oct 23 '22 04:10

pjv