Proguard tells me 'Please correct the above warnings first.'. How to address references of external jars?

eros picture eros · Nov 10, 2011 · Viewed 29.9k times · Source

How can I address the warnings?

Log says

 [proguard] Note: duplicate definition of library class...
 ...
 [proguard] Note: there were 370 duplicate class definitions.
 [proguard] Initializing...
 [proguard] Warning: abc.cba..: can't find superclass or interface xyz.zyx....
 ...
 [proguard] Note: the configuration refers to the unknown class 'android.app.backup.BackupAgentHelper'...
 ...
 [proguard] Warning: library class android.content.IntentFilter depends on program class org.xmlpull.v1.XmlSerializer...
 ...

proguard.cfg

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep public class !testAppH23.** { *; }

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

Here is the Android Ant Build with Proguard Enabled console log. Please see the link ant build console log

Here is my build.xml (basically its the android original ant script). Please see the link TestAppH23 Android Ant Build With Proguard Enabled

local.properties

sdk.dir=C:\\androiddev\\android-sdk-windows

build.properties

proguard.config=proguard.cfg
key.store=testapph23-release.keystore
key.alias=alisname
key.store.password=storepassword
key.alias.password=aliaspassword

default.properties

target=android-7

My apology for long post. Any guidance on the right direction is appreciated.

UPDATES1 AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="testAppH23.activity"
      android:versionCode="1"
      android:versionName="1.0">
    <application
        android:icon="@drawable/home"
        android:theme="@android:style/Theme.NoTitleBar"
        android:label="@string/app_name"
        >
        <activity
            android:name=".start.StartActivity"
            android:label="@string/app_name"
            android:theme="@style/Theme.Translucent"
            android:screenOrientation="portrait"
            android:launchMode="singleTask"
            >
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN"
                    >
                </action>
                <category
                    android:name="android.intent.category.LAUNCHER"
                    >
                </category>
            </intent-filter>
        </activity>
        .....
        <service android:name="com.abc.myjar.papi.PIntentService"></service>

        <service android:name=".service.XyzService"></service>

    </application>


    <uses-library android:name="org.apache.http.entity"/>
    <uses-library android:name="org.apache.http.james.mime4j"/>

    <uses-permission android:name="android.permission...."/>

    <uses-sdk android:minSdkVersion="7" />

</manifest>

Answer

Eric Lafortune picture Eric Lafortune · Nov 11, 2011

You have to reassure ProGuard that some suspicious constructs in the input jars are ok.

Your program code contains copies or better versions of Android runtime classes in the package org.xmlpull.v1. If that's ok:

-dontwarn org.xmlpull.v1.**
-dontnote org.xmlpull.v1.**

Your program code contains copies of Android runtime classes in org.apache.http. If that's ok:

-dontnote org.apache.http.**

Your program code in the package examples refers to AWT, which doesn't exist in Android. If that's ok:

-dontwarn java.awt.**

Your PostgreSQL driver refers to many javax classes that don't exist in Android. If that's ok:

-dontwarn org.postgresql.**

And so on...

Cfr. ProGuard manual > Troubleshooting

Finally, your configuration specifies -keep public class !testAppH23.** { *;}, which keeps all public classes except those in testAppH23, and their public/protected/private class members, from being shrunk/optimized/obfuscated. This may cause some (harmless) notes about descriptor classes. For consistency, you may want to remove "public" for the classes, or add "public protected" for the class members.