Proguard:找不到引用的类
Posted
技术标签:
【中文标题】Proguard:找不到引用的类【英文标题】:Proguard: can't find referenced class 【发布时间】:2012-09-16 23:34:23 【问题描述】:周围有一些问题,但没有适合我的解决方案。我认为它应该很容易使用。
我刚刚得到一个控制台,里面装满了can't find referenced class
这是我的 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: can't find referenced class com.google.android.gms.R的可能重复 【参考方案1】:添加到您的配置中:
-libraryjars org.apache.jar // name of your jars.
-libraryjars org.w3c.jar
如果没有帮助添加:
-dontwarn org.apache.** tag
或者只是忽略警告(强烈不推荐,因为它可能导致您的应用在运行时因不满足的依赖关系而崩溃):
-ignorewarnings
此文档将帮助您:http://proguard.sourceforge.net/manual/troubleshooting.html
【讨论】:
我已经读过了。它说除非您知道自己在做什么,否则不要使用忽略警告。又名,你知道它指的是什么,它很好。但暗示事情可能会破坏这样做。所以我宁愿正确链接它们而不是忽略警告 如果您不想使用 -ignore 标签,那么只需将带有警告的类复制到您的 src(source) 文件夹,它应该可以工作 +1 表示帮助,但这些不是我的课程。我只是要放弃Pro-guard。太匆忙了。 你可以在 apache 网站上找到这些类 我也有很多问题。在 ProGuard 上花了整整 2 天,太复杂了。【参考方案2】:如果出现错误如:
Warning: com.package...: can't find referenced class com.secondpackage....Classname
只需添加到您的文件 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'
或者如果你想添加很多文件,例如使用the following repo 并添加所有文件:
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
【讨论】:
为什么要保留而不警告?【参考方案3】:据我所知,这意味着您以错误的方式引用了 Jar 文件。
另外,如果您的用户名 (ME) 包含空格 C:/Users/ME/android-sdks/tools/proguard/proguard-android.txt:proguard-project.txt
Proguard 将以“有趣”的方式中断。将 android-sdk 移至 C:\android-sdk
并免去您的头疼。
【讨论】:
我的用户名是 'ME' :) 你能否详细说明我是如何错误地引用它们的,以及如何解决它。谢谢 我想他的意思是如果你的用户名是“ME”,有任何空格。【参考方案4】:如果您正在使用库项目,那么您应该将 -libraryjars 添加到您的库 proguard 配置中
【讨论】:
能否举个例子。【参考方案5】:在我的情况下,Android Studio 在发布构建时执行 ProGuard 时冻结了。我杀了它。重新启动后,我开始看到“找不到引用的类”警告。
解决方案:我关闭了 Android Studio,从我的项目文件夹中删除了 .gradle 文件夹,然后删除了 gradle 全局缓存 (%USER_HOME%.gradle/caches)。 重新打开项目后,缓存被重建并一切又开始工作了。
【讨论】:
以上是关于Proguard:找不到引用的类的主要内容,如果未能解决你的问题,请参考以下文章
Proguard 导致 100 个“找不到引用的类”警告,忽略 springframework 和 jackson 的保留规则