1

Android アプリで HTTP および HTTPS 通信に Restlet 2.1.0 Java ライブラリを使用しています。

これまで、これらのライブラリをそのままにしておくように Proguard を構成し、次の keep および ignore ルールを使用しました。

-keep class org.restlet.** { *; }
-dontwarn org.restlet.**
-dontnote org.restlet.**

org.restlet.jar は 726KB で 5761 個のメソッドが含まれているため、Proguard をオンにして、アプリが使用しないすべてのコードを削除し、安全に最適化しようとしています。

残念ながら、Restlet ライブラリはリフレクションを使用しているため、適切な Proguard ルールを書くのに苦労しています。

私のルールのこれらの部分は十分に安全だと思われます:

-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次のように s を打っています:

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 ソース コードを使用して 1 つずつ作業を進めていますが、誰かがすでに答えを知っている場合に備えて、今すぐ確認しておこうと思いました。

4

2 に答える 2

2

最初に-dontobfuscateフラグを使用して、難読化せずに Proguard を実行しました。私の例外はまだ発生しましたが、原因を確認する方が簡単でした:

10-20 08:43:06.725  4475  4499 W System.err: Error while handling an HTTP client call
10-20 08:43:06.725  4475  4499 W System.err: java.lang.NoSuchMethodException: ClientAdapter(Context)
10-20 08:43:06.725  4475  4499 W System.err:    at java.lang.Class.getMatchingConstructor(Class.java:643)
10-20 08:43:06.725  4475  4499 W System.err:    at java.lang.Class.getConstructor(Class.java:472)
10-20 08:43:06.725  4475  4499 W System.err:    at org.restlet.engine.adapter.HttpClientHelper.getAdapter(HttpClientHelper.java:100)
10-20 08:43:06.725  4475  4499 W System.err:    at org.restlet.engine.adapter.HttpClientHelper.handle(HttpClientHelper.java:111)
10-20 08:43:06.735  4475  4499 W System.err:    at org.restlet.Client.handle(Client.java:180)
10-20 08:43:06.735  4475  4499 W System.err:    at org.restlet.routing.Filter.doHandle(Filter.java:159)
10-20 08:43:06.735  4475  4499 W System.err:    at org.restlet.routing.Filter.handle(Filter.java:206)
10-20 08:43:06.735  4475  4499 W System.err:    at org.restlet.resource.ClientResource.handle(ClientResource.java:1137)
10-20 08:43:06.735  4475  4499 W System.err:    at org.restlet.resource.ClientResource.handleOutbound(ClientResource.java:1226)
10-20 08:43:06.735  4475  4499 W System.err:    at org.restlet.resource.ClientResource.handle(ClientResource.java:1069)
10-20 08:43:06.735  4475  4499 W System.err:    at org.restlet.resource.ClientResource.handle(ClientResource.java:1045)
10-20 08:43:06.735  4475  4499 W System.err:    at org.restlet.resource.ClientResource.post(ClientResource.java:1454)
10-20 08:43:06.735  4475  4499 W System.err:    at org.restlet.resource.ClientResource.post(ClientResource.java:1400)

JD-GUI を使用して bin/proguard/obfuscated.jar を開き、コンストラクターが削除されていることを確認しました。欠落しているコンストラクターは Adapter スーパークラスにありました。

public Adapter(Context context) {
    this.context = context;
}

その特定の問題の修正は、次の Proguard ルールを追加することでした。

-keep class org.restlet.engine.adapter.Adapter { *; }

単純な HTTP 接続で再構築してテストすると、必要なルールがさらに明らかになりました。

以下のルールを使用すると、HTTP および HTTPS 接続を成功させることができます。

# Preserve a minimal number of Restlet classes.  It is particularly
# difficult to get these keep rules correct as Restlet uses quite a
# lot of reflection. 
-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.Connector
-keep class org.restlet.Request
-keep class org.restlet.Response
-keep class org.restlet.Restlet
-keep class org.restlet.data.Status
-keep class org.restlet.engine.adapter.Adapter { *; }
-keep class org.restlet.engine.adapter.ClientCall
-keep class org.restlet.engine.adapter.ClientAdapter { *; }
-keep class org.restlet.engine.adapter.HttpClientHelper { *; }
-keep class org.restlet.engine.connector.Connection
-keep class org.restlet.engine.ClientHelper { *; }
-keep class org.restlet.engine.header.Header { *; }

-keep class org.restlet.* extends org.restlet.Client { *; }
-keep class org.restlet.* extends org.restlet.Context { *; }
-keep class org.restlet.* extends org.restlet.Connector { *; }
-keep class org.restlet.* extends org.restlet.engine.ClientHelper { *; }
-keep class org.restlet.* extends org.restlet.resource.Resource { *; }

# We use constants like Disposition.NAME_FILENAME
-keepclassmembers class org.restlet.data.Disposition { public static final *; }

# Ignore these Restlet warnings, as we have never included the
# org.jsslutils.* classes in our build
-dontwarn org.restlet.ext.ssl.**

Restlet ライブラリを私とは異なる方法で使用すると、これらのルールが機能しない可能性がありますが、出発点としては役立つかもしれません。

于 2013-10-20T16:25:17.727 に答える
1

多くの試行錯誤の後、これは私が使用しているものです:

-keep class org.restlet.Application { *; }
-keep class org.restlet.Client { *; }
-keep class org.restlet.Connector { *; }
-keep class org.restlet.Context { *; }
-keep class org.restlet.Request { *; }
-keep class org.restlet.Response { *; }
-keep class org.restlet.Restlet { *; }
-keep class org.restlet.Server { *; }
-keep class org.restlet.Uniform { *; }
-keep class org.restlet.data.AuthenticationInfo { *; }
-keep class org.restlet.data.MediaType { *; }
-keep class org.restlet.data.CacheDirective { *; }
-keep class org.restlet.data.ChallengeRequest { *; }
-keep class org.restlet.data.ChallengeResponse { *; }
-keep class org.restlet.data.ChallengeScheme { *; }
-keep class org.restlet.data.CharacterSet { *; }
-keep class org.restlet.data.ClientInfo { *; }
-keep class org.restlet.data.Conditions { *; }
-keep class org.restlet.data.Digest { *; }
-keep class org.restlet.data.Disposition { *; }
-keep class org.restlet.data.Encoding { *; }
-keep class org.restlet.data.Expectation { *; }
-keep class org.restlet.data.Form { *; }
-keep class org.restlet.data.Language { *; }
-keep class org.restlet.data.Metadata { *; }
-keep class org.restlet.data.Method { *; }
-keep class org.restlet.data.Range { *; }
-keep class org.restlet.data.Reference { *; }
-keep class org.restlet.data.ReferenceList { *; }
-keep class org.restlet.data.Parameter { *; }
-keep class org.restlet.data.Protocol { *; }
-keep class org.restlet.data.ServerInfo { *; }
-keep class org.restlet.data.Status { *; }
-keep class org.restlet.data.Tag { *; }
-keep class org.restlet.engine.adapter.* { *; }
-keep class org.restlet.engine.log.LoggerFacade { *; }
-keep class org.restlet.engine.resource.AnnotationInfo { *; }
-keep class org.restlet.representation.Representation { *; }
-keep class org.restlet.representation.RepresentationInfo { *; }
-keep class org.restlet.representation.Variant { *; }
-keep class org.restlet.resource.* { *; }
-keep class org.restlet.security.Enroler { *; }
-keep class org.restlet.security.User { *; }
-keep class org.restlet.security.Verifier { *; }
-keep class org.restlet.service.ConnectorService { *; }
-keep class org.restlet.service.ConnegService { *; }
-keep class org.restlet.service.ConverterService { *; }
-keep class org.restlet.service.DecoderService { *; }
-keep class org.restlet.service.EncoderService { *; }
-keep class org.restlet.service.MetadataService { *; }
-keep class org.restlet.service.RangeService { *; }
-keep class org.restlet.service.StatusService { *; }
-keep class org.restlet.service.TaskService { *; }
-keep class org.restlet.service.TunnelService { *; }
-keep class org.restlet.util.Series { *; }
-keep class org.restlet.util.SelectionListener { *; }

Dan J からの返信(申し訳ありませんが、これはコメント セクションに収まりません):

提案をありがとう。上記のルールを試してみたところ、次の 3 つのメモが表示されました。

 [proguard] Note: the configuration keeps the entry point 'org.restlet.engine.connector.ConnectionPool { void clear(org.restlet.engine.connector.Connection); }', but not the descriptor class 'org.restlet.engine.connector.Connection'
 [proguard] Note: the configuration keeps the entry point 'org.restlet.representation.Representation { void setListener(org.restlet.util.ReadingListener); }', but not the descriptor class 'org.restlet.util.ReadingListener'
 [proguard] Note: the configuration keeps the entry point 'org.restlet.util.SelectionListener { void onSelected(org.restlet.util.SelectionRegistration); }', but not the descriptor class 'org.restlet.util.SelectionRegistration'

単純な HTTP 接続をテストすると、わずかに異なるスタック トレースが得られます。

10-19 16:21:04.175  4042  4065 W System.err: Exception during the instantiation of the client connector.
10-19 16:21:04.175  4042  4065 W System.err: java.lang.NoSuchMethodException: a(Client)
10-19 16:21:04.175  4042  4065 W System.err:    at java.lang.Class.getMatchingConstructor(Class.java:643)
10-19 16:21:04.175  4042  4065 W System.err:    at java.lang.Class.getConstructor(Class.java:472)
10-19 16:21:04.185  4042  4065 W System.err:    at org.restlet.engine.e.a(Engine.java:514)
10-19 16:21:04.185  4042  4065 W System.err:    at org.restlet.Client.<init>(Client.java:96)
10-19 16:21:04.185  4042  4065 W System.err:    at org.restlet.Client.<init>(Client.java:120)
10-19 16:21:04.185  4042  4065 W System.err:    at org.restlet.Client.<init>(Client.java:140)
10-19 16:21:04.185  4042  4065 W System.err:    at org.restlet.resource.ClientResource.createNext(ClientResource.java:518)
10-19 16:21:04.185  4042  4065 W System.err:    at org.restlet.resource.ClientResource.getNext(ClientResource.java:830)
10-19 16:21:04.185  4042  4065 W System.err:    at org.restlet.resource.ClientResource.handleOutbound(ClientResource.java:1222)
10-19 16:21:04.185  4042  4065 W System.err:    at org.restlet.resource.ClientResource.handle(ClientResource.java:1069)
10-19 16:21:04.185  4042  4065 W System.err:    at org.restlet.resource.ClientResource.handle(ClientResource.java:1045)
10-19 16:21:04.185  4042  4065 W System.err:    at org.restlet.resource.ClientResource.post(ClientResource.java:1454)
10-19 16:21:04.185  4042  4065 W System.err:    at org.restlet.resource.ClientResource.post(ClientResource.java:1400)

おそらく異なるRestletバージョン、または異なる基本Proguard構成を使用していると思いますか? (eg )*の代わりにシングルを使用していることに気付きました。そのため、一部のルールはサブパッケージ ( docs ) に分類されません。**org.restlet.engine.adapter.*

于 2013-10-19T23:04:36.450 に答える