android 支持库的推荐混淆器设置是什么?
What are the recommended proguard settings for android support library?
我在我的项目中使用 android-support-library-v7,当然我想使用 progurad 来最小化和混淆我的代码。
问题是,如果我使用混淆器,我会得到类似这样的错误:
FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{org.example.project/org.example.project.ActivityMain}: android.view.InflateException: Binary XML file line #12: Error inflating class android.support.v7.preference.PreferenceCategory
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
at android.app.ActivityThread.access0(ActivityThread.java:140)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4921)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
at dalvik.system.NativeStart.main(Native Method) Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class android.support.v7.preference.PreferenceCategory
at android.support.v7.preference.g.a(Unknown Source)
at android.support.v7.preference.g.a(Unknown Source)
at android.support.v7.preference.g.a(Unknown Source)
at android.support.v7.preference.g.a(Unknown Source)
at android.support.v7.preference.g.a(Unknown Source)
at android.support.v7.preference.h.a(Unknown Source)
at android.support.v7.preference.h.b(Unknown Source)
at org.exampple.project.ActivityMain.onCreate(Unknown Source)
at android.app.Activity.performCreate(Activity.java:5206)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
... 11 more Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
at java.lang.Class.getConstructorOrMethod(Class.java:460)
at java.lang.Class.getConstructor(Class.java:431)
... 22 more
PreferenceCategory 在我的 preferences.xml 文件中使用,我想它是通过反射访问的。 Proguard if 可能会删除此方法(或 class),如果它在收缩时未在代码中引用。即使不是,它肯定会混淆这个名字。
Google 一贯的方式完全没有提供关于该主题的文档。
那么,实现良好收缩和混淆的最佳设置是什么。
Stack Overflow 上有一些类似的问题,但归结为:
-keep class android.support.v7.** { *; }
这显然违背了收缩和混淆的目的。
尝试随机猜测设置或通过试错法非常耗时。
在 Github 上查看此 project,其中包含 proguard
流行图书馆的规则。
支持库使用 consumerProguardFiles
功能在您使用 Gradle 时自动包含适当的 ProGuard,这意味着您无需手动包含任何内容。
查看 preferences-v7
的 ProGuard 文件(存储在 AAR 中的 proguard.txt 文件中),它包含以下行:
# Preference objects are inflated via reflection
-keep public class android.support.v7.preference.Preference {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keep public class * extends android.support.v7.preference.Preference {
public <init>(android.content.Context, android.util.AttributeSet);
}
其中涵盖了它所说的您缺少的确切方法(因为 PreferenceCategory
间接扩展了 Preference
)。检查以确保您使用的是完整的 Gradle 依赖项。
我在我的项目中使用 android-support-library-v7,当然我想使用 progurad 来最小化和混淆我的代码。 问题是,如果我使用混淆器,我会得到类似这样的错误:
FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{org.example.project/org.example.project.ActivityMain}: android.view.InflateException: Binary XML file line #12: Error inflating class android.support.v7.preference.PreferenceCategory
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
at android.app.ActivityThread.access0(ActivityThread.java:140)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4921)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
at dalvik.system.NativeStart.main(Native Method) Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class android.support.v7.preference.PreferenceCategory
at android.support.v7.preference.g.a(Unknown Source)
at android.support.v7.preference.g.a(Unknown Source)
at android.support.v7.preference.g.a(Unknown Source)
at android.support.v7.preference.g.a(Unknown Source)
at android.support.v7.preference.g.a(Unknown Source)
at android.support.v7.preference.h.a(Unknown Source)
at android.support.v7.preference.h.b(Unknown Source)
at org.exampple.project.ActivityMain.onCreate(Unknown Source)
at android.app.Activity.performCreate(Activity.java:5206)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
... 11 more Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
at java.lang.Class.getConstructorOrMethod(Class.java:460)
at java.lang.Class.getConstructor(Class.java:431)
... 22 more
PreferenceCategory 在我的 preferences.xml 文件中使用,我想它是通过反射访问的。 Proguard if 可能会删除此方法(或 class),如果它在收缩时未在代码中引用。即使不是,它肯定会混淆这个名字。 Google 一贯的方式完全没有提供关于该主题的文档。
那么,实现良好收缩和混淆的最佳设置是什么。 Stack Overflow 上有一些类似的问题,但归结为:
-keep class android.support.v7.** { *; }
这显然违背了收缩和混淆的目的。
尝试随机猜测设置或通过试错法非常耗时。
在 Github 上查看此 project,其中包含 proguard
流行图书馆的规则。
支持库使用 consumerProguardFiles
功能在您使用 Gradle 时自动包含适当的 ProGuard,这意味着您无需手动包含任何内容。
查看 preferences-v7
的 ProGuard 文件(存储在 AAR 中的 proguard.txt 文件中),它包含以下行:
# Preference objects are inflated via reflection
-keep public class android.support.v7.preference.Preference {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keep public class * extends android.support.v7.preference.Preference {
public <init>(android.content.Context, android.util.AttributeSet);
}
其中涵盖了它所说的您缺少的确切方法(因为 PreferenceCategory
间接扩展了 Preference
)。检查以确保您使用的是完整的 Gradle 依赖项。