Proguard 告诉我“请先更正上述警告。”。如何解决外部 jar 的引用?

Posted

技术标签:

【中文标题】Proguard 告诉我“请先更正上述警告。”。如何解决外部 jar 的引用?【英文标题】:Proguard tells me 'Please correct the above warnings first.'. How to address references of external jars? 【发布时间】:2011-12-25 20:12:15 【问题描述】:

如何解决这些警告?

日志说

 [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 *;

这里是 Android Ant Build with Proguard Enabled 控制台日志。请查看链接 ant build console log

这是我的 build.xml(基本上是 android 原始的 ant 脚本)。请查看链接 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

对于长篇大论,我深表歉意。感谢任何有关正确方向的指导。

更新1 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>

【问题讨论】:

【参考方案1】:

您必须向 ProGuard 保证输入 jar 中的一些可疑结构是正常的。

您的程序代码在 org.xmlpull.v1 包中包含 Android 运行时类的副本或更好版本。如果没问题:

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

您的程序代码在 org.apache.http 中包含 Android 运行时类的副本。如果没问题:

-dontnote org.apache.http.**

您在包示例中的程序代码引用了 AWT,它在 Android 中不存在。如果没问题:

-dontwarn java.awt.**

您的 PostgreSQL 驱动程序引用了许多 Android 中不存在的 javax 类。如果没问题:

-dontwarn org.postgresql.**

等等……

参照。 ProGuard 手册 > Troubleshooting

最后,您的配置指定-keep public class !testAppH23.** *;,它可以防止除testAppH23 中的公共类及其公共/受保护/私有类成员之外的所有公共类被缩小/优化/混淆。这可能会导致一些关于描述符类的(无害的)注释。为保持一致性,您可能希望删除类的“public”,或为类成员添加“public protected”。

【讨论】:

在我添加 Dropbox jars 和 Google Drive jars 的情况下,它仅有助于添加 -dontwarn org.apache.** 和 -dontwarn com.google.android.gms.**(此外到由 Google Eclipse 插件自动添加的 proguard-google-api-client.txt)。无需添加 -dontnote 语句。可能是因为所有警告都消失了,并且没有理由“注意”任何问题。谢谢你的帖子。【参考方案2】:

您可以尝试解决:

-ignorewarnings

【讨论】:

【参考方案3】:

您应该检查您的 strings.xml 资源,如果存在则设置相等或添加 translatable="false"

<string name="my_text" translatable="false">Hello World</string>

【讨论】:

以上是关于Proguard 告诉我“请先更正上述警告。”。如何解决外部 jar 的引用?的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能告诉 proguard 假设一个包没有被使用?

如何告诉 proguard 保留枚举常量和字段

如何告诉 sbt-proguard 包含 java *.jars?

如何告诉 ProGuard 保留用于 onClick 的函数?

如何告诉 ProGuard 保留私有字段而不指定每个字段

如何用 proguard 混淆我的代码?