Java 混淆android jar会引发未引用的android.R$布局错误

Java 混淆android jar会引发未引用的android.R$布局错误,java,android,proguard,Java,Android,Proguard,我有一个Android库项目,我想在发布之前对其jar进行模糊处理。 该库支持视图和布局,因此,当我使用Proguard模糊处理jar文件时,它会对所有支持UI创建且模糊处理失败的类发出警告。以下是一个此类文件的警告: 警告:com.event.android.eventui:找不到引用的类com.event.android.R$layout 警告:com.event.android.eventui:找不到引用的类com.event.android.R$id 警告:com.event.andro

我有一个Android库项目,我想在发布之前对其jar进行模糊处理。 该库支持视图和布局,因此,当我使用Proguard模糊处理jar文件时,它会对所有支持UI创建且模糊处理失败的类发出警告。以下是一个此类文件的警告:

警告:com.event.android.eventui:找不到引用的类com.event.android.R$layout 警告:com.event.android.eventui:找不到引用的类com.event.android.R$id 警告:com.event.android.eventui:找不到引用的类com.event.android.R$string 警告:com.event.android.eventui:找不到引用的类com.event.android.R

我使用过proguard GUI工具(\android sdk\tools\proguard\bin)。 我得到的库混淆的参考和解决方案没有ui角度,因此还没有找到任何解决方案

以下是proguard配置文件:

-outjars 'C:\Projects\event\eventpro.jar'
-injars 'C:\Projects\event\event.jar'

-libraryjars 'C:\android\android-sdk\platforms\android-19\android.jar'
-libraryjars 'C:\android\android-sdk\extras\android\support\v4\android-support-v4.jar'

-dontskipnonpubliclibraryclassmembers
-dontshrink
-dontoptimize
-verbose


-keep class  public class **.R { *; }

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

# Keep - Applications. Keep all application classes, along with their 'main'
# methods.
-keepclasseswithmembers public class * {
    public static void main(java.lang.String[]);
}

# Keep - Library. Keep all public and protected classes, fields, and methods.
-keep public class * {
    public protected <fields>;
    public protected <methods>;
}

# Also keep - Enumerations. Keep the special static methods that are required in
# enumeration classes.
-keepclassmembers enum  * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

# Also keep - Serialization code. Keep all fields and methods that are used for
# serialization.
-keepclassmembers class * extends java.io.Serializable {
    static final long serialVersionUID;
    static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

# Keep names - Native method names. Keep all native class/method names.
-keepclasseswithmembers,allowshrinking class * {
    native <methods>;
}

# Keep names - _class method names. Keep all .class method names. This may be
# useful for libraries that will be obfuscated again with different obfuscators.
-keepclassmembers,allowshrinking class * {
    java.lang.Class class$(java.lang.String);
    java.lang.Class class$(java.lang.String,boolean);
}
-outjars'C:\Projects\event\eventpro.jar'
-injars'C:\Projects\event\event.jar'
-libraryjars'C:\android\android sdk\platforms\android-19\android.jar'
-libraryjars'C:\android\android sdk\extras\android\support\v4\android-support-v4.jar'
-dontskipnonpubliclibraryclassmembers
-dontshrink
-dontoptimize
-冗长的
-保持类为公共类**.R{*;}
-keepclassmembers类**.R$*{
公共静态;
}
#保留应用程序。保留所有应用程序类及其“main”
#方法。
-keepclassswithmembers公共类*{
公共静态void main(java.lang.String[]);
}
#保留-图书馆。保留所有公共和受保护的类、字段和方法。
-保持公开课*{
受公众保护;
受公众保护;
}
#还保留-枚举。保留中所需的特殊静态方法
#枚举类。
-keepclassmembers枚举*{
公共静态**[]值();
公共静态**valueOf(java.lang.String);
}
#还要保留序列化代码。保留用于的所有字段和方法
#序列化。
-keepclassmembers类*扩展了java.io.Serializable{
静态最终长SerialVersionId;
静态final java.io.ObjectStreamField[]serialPersistentFields;
私有void writeObject(java.io.ObjectOutputStream);
私有void readObject(java.io.ObjectInputStream);
java.lang.Object WriterReplace();
java.lang.Object readResolve();
}
#保留名称-本机方法名称。保留所有本机类/方法名称。
-保留类成员,允许收缩类*{
出生地的
}
#保留名称-\类方法名称。保留所有.class方法名称。这可能是
#对于将使用不同模糊器再次进行模糊处理的库非常有用。
-keepclassmembers,允许收缩类*{
java.lang.Class类$(java.lang.String);
java.lang.Class类$(java.lang.String,布尔值);
}

首先,当您更新lib-jar文件的progaurd设置时,您需要确保从lib-jar文件中使用的类的根包名称是什么

到目前为止,我不知道您在lib-jar文件中使用的类是什么(您可以在项目导入语句中检查)

示例:我在项目中使用Twitter4J库,我知道所有类的roote包名称(Twitter4J.*) 我正在导入到我的项目中,所以在下面两行添加到我的progaurd字符串配置文件中,并且工作正常

-keep class twitter4j.** { *; }
-dontwarn twitter4j.**

如果你愿意的话,我有一个模糊的脚本。但您需要对它做一些更改。@Pratik将它处理R类。我相信如果我从jar中删除UI类,错误就会消失。R文件不会被混淆,也不需要它。那么我该如何解决这些警告呢?你能复制粘贴你的脚本作为答案吗。为什么它只是抱怨R类接口?我不知道,你的脚本有什么问题,但我做过一次,它对我有效。如果是这个问题,它也应该抱怨其他android接口/类。在这种情况下,它只对R类抛出警告。