我在我的 Android 应用程序中使用 Restlet 2.1.0 Java 库进行 HTTP 和 HTTPS 通信。
到目前为止,我已经将 Proguard 配置为不理会这些库,使用这些保留和忽略规则:
-keep class org.restlet.** { *; }
-dontwarn org.restlet.**
-dontnote org.restlet.**
由于 org.restlet.jar 是 726KB 并且包含 5761 个方法,我现在尝试打开 Proguard 以删除我的应用程序不使用的所有代码,并安全地对其进行优化。
不幸的是,我正在努力编写合适的 Proguard 规则,因为我的尝试导致异常,因为 Restlet 库使用反射。
我的规则的这些部分似乎足够安全:
-keep class org.restlet.engine.connector.Connection
# Ignore these Restlet warnings, as we have never included the
# org.jsslutils.* classes in our build
-dontwarn org.restlet.ext.ssl.**
我还尝试移植我在此博客上看到的规则:
-keep class org.restlet.engine.log.LoggerFacade
-keep class org.restlet.Application
-keep class org.restlet.Client
-keep class org.restlet.Context
-keep class org.restlet.* extends org.restlet.Client { *; }
-keep class org.restlet.* extends org.restlet.Context { *; }
不幸的是,我一直在这样打java.lang.NoSuchMethodException
:
10-18 18:22:12.975 3142 3165 W System.err: Exception during the instantiation of the client connector.
10-18 18:22:12.975 3142 3165 W System.err: java.lang.NoSuchMethodException: a(Client)
10-18 18:22:12.975 3142 3165 W System.err: at java.lang.Class.getMatchingConstructor(Class.java:643)
10-18 18:22:12.975 3142 3165 W System.err: at java.lang.Class.getConstructor(Class.java:472)
10-18 18:22:12.975 3142 3165 W System.err: at org.restlet.engine.e.a(Engine.java:510)
10-18 18:22:12.975 3142 3165 W System.err: at org.restlet.Client.<init>(Client.java:96)
10-18 18:22:12.975 3142 3165 W System.err: at org.restlet.Client.<init>(Client.java:120)
10-18 18:22:12.975 3142 3165 W System.err: at org.restlet.Client.<init>(Client.java:140)
10-18 18:22:12.975 3142 3165 W System.err: at org.restlet.d.a.j(ClientResource.java:830)
10-18 18:22:12.975 3142 3165 W System.err: at org.restlet.d.a.a(ClientResource.java:1045)
10-18 18:22:12.975 3142 3165 W System.err: at org.restlet.d.a.a(ClientResource.java:1454)
10-18 18:22:12.985 3142 3165 W System.err: at org.restlet.d.a.a(ClientResource.java:1400)
我正在使用我的 Proguard mapping.txt 和Restlet 源代码一一解决它们,但我想我现在要检查一下,以防有人已经知道答案!