Proguard: 找不到引用的类

11

有一些问题,但没有适合我的解决方案。我认为应该很容易使用。 我只得到一个充满找不到引用类的控制台

这是我的proguard-project.txt文件

-injars      bin/classes
-injars      libs
-outjars     bin/classes-processed.jar
-libraryjars C:/Users/ME/android-sdks/platforms/android-10/android.jar

-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*

-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.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

-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.content.Context {
   public void *(android.view.View);
   public void *(android.view.MenuItem);
}

-keepclassmembers class * implements android.os.Parcelable {
    static android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

和project.properties文件

#Proguard enabled
proguard.config=C:/Users/ME/android-sdks/tools/proguard/proguard-android.txt:proguard-project.txt

一些带有警告的类包括:

org.apache.avalon.framework.logger.Logger
org.apache.log4j.Category
org.apache.log4j.Priority
org.apache.log4j.Logger
...
javax.servlet.ServletContextListener
javax.servlet.ServletContextEvent
org.w3c.dom.html.HTMLAnchorElement
org.w3c.dom.html.HTMLObjectElement
org.w3c.dom.html.HTMLTableSectionElement
org.w3c.dom.html.HTMLFrameSetElement
...
org.w3c.dom.events.DocumentEvent
org.w3c.dom.traversal.NodeFilter
...
org.w3c.dom.ranges.Range
org.w3c.dom.ranges.RangeException
...
org.w3c.dom.html.HTMLDocument

可能是ProGuard:找不到引用类com.google.android.gms.R的重复问题。 - Yuliia Ashomok
5个回答

10

添加到您的配置文件中:

-libraryjars org.apache.jar // name of your jars.
-libraryjars org.w3c.jar

如果这没有帮助,请尝试添加以下内容:
-dontwarn org.apache.** tag

或者忽略警告(强烈不建议,因为这可能会导致应用程序在运行时由于未满足的依赖项而崩溃):
-ignorewarnings 

这份文档将会为您提供帮助:http://proguard.sourceforge.net/manual/troubleshooting.html


3
我已经阅读过了。它说不要使用 ignorewarnings,除非你知道自己在做什么。也就是说,你知道它指的是什么,并且可以正确处理。但这也意味着这样做可能会导致一些问题。因此,我宁愿正确链接它们,而不是忽略警告。 - IAmGroot
如果您不想使用“-ignore”标记,则只需将带有警告的类复制到src(源)文件夹中,它就应该可以工作。 - Yahor10
1
谢谢你的帮助,但这些不是我的类。我打算放弃Pro-guard了,太麻烦了。 - IAmGroot
你可以在 Apache 网站上找到这些类。 - Yahor10
1
我也遇到了很多问题。花了整整2天的时间来处理ProGuard,它实在太过复杂了。 - Oliver Dixon
“-ignorewarnings” 参数对 Proguard 的结果有任何不良影响吗? - IgorGanapolsky

6

If you have an error such as:

Warning: com.package...: can't find referenced class com.secondpackage....Classname

只需将以下内容添加到您的Proguard文件proguard-android.txt中:
#if it is class:
-keep class com.package.*{ *; }
#or if it is interface:
-keep interface com.package.*{ *; }
#or if it is a class that extends from any other
-keep class * extends com.example.Model
#or if you know only and of className
-keep class **Starter { *; }
#or if you want to keep only fields of classes
-keepclassmembers class com.package.** {
   *;
}

另外,如果您不想在日志中看到所有的注释,请使用以下命令:

-dontnote com.package.**

这个文件名写在build Gradle里面。

buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-android.txt'
        }
    } 

如果您想添加多个文件,例如使用以下存储库 要添加所有文件:

 buildTypes {
        release {
            minifyEnabled true

            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            proguardFiles fileTree(include: ['*.pro'], dir: '../libraries').asList().toArray()
        }

libraries文件夹应该位于D:\workspace\MyProject\libraries目录下。


8
为什么要保留而不是警告? - deadfish

1
据我所记,这意味着您以错误的方式引用了Jar文件。
此外,如果您的用户名(ME)包含空格C:/Users/ME/android-sdks/tools/proguard/proguard-android.txt:proguard-project.txt,Proguard将以“有趣”的方式中断。将android-sdk移动到C:\android-sdk,避免头疼。

2
我的用户名是'ME' :) 你能否详细说明我引用他们的方式有误,并指导如何修正。谢谢。 - IAmGroot
我认为他的意思是,如果你的用户名是"M E",其中包含任何空格。 - Erik B

0
如果您正在使用库项目,则应将-libraryjars添加到您的库Proguard配置中。

1
请您举个例子。 - Clive Jefferies

0
在我的情况下,当我在发布版本上执行ProGuard时,Android Studio卡住了。我强制关闭了它。重启后,我开始看到“找不到引用类”的警告。
解决方案:我关闭了Android Studio,从我的项目文件夹中删除了.gradle文件夹,然后删除了gradle全局缓存(%USER_HOME%.gradle / caches)。重新打开项目后,缓存被重建,一切都重新开始工作了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接