AdMob’s Unfriendly JAR on Android

One of our team members (thanks Shalin!) recently discovered that our Android library didn’t play well with AdMob. As soon as our library and AdMob’s library were added to the same project, this error showed up:

———————————————————————————

UNEXPECTED TOP-LEVEL EXCEPTION:

java.lang.IllegalArgumentException: already added:

….

Conversion to Dalvik format failed with error 1

———————————————————————————

Here is a stack overflow post that describes other users experiencing similar issues with other jar files. There are many suggested solutions, but none of them worked. After I poked around the AdMob Android library, the real issue became clear — AdMob’s library uses ProGuard to obfuscate its classes, but fails to declare a custom package name. Proguard will change your classes and its imports to look something like:

import A;
import B;
import C
etc

This means if you add other external libraries that are also guilty of this (like ours!), the classes will have conflicting names and you won’t be build your project. We have since fixed our Android library with one line of (configuration) code, and we invite Google to do the same.

If you are developing a library, and use ProGuard to obfuscate your classes, then

Add this line to your proguard.cfg file:

-repackageclasses ‘custom.package.here’

This will change your classes to custom.package.here.A, custom.package.here.B, etc. Now they’ll no longer conflict!

 

Leave a comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: