この回答を代替として追加し、既存の回答を更新するだけです。
最近、Samsung のアクセサリ SDK を Android の「コンパニオン」アプリに統合して、Galaxy Gear S2 で Tizen アプリをサポートしましたが、コンパニオン アプリの (縮小された) リリース ビルドをコンパイルするときに同じ問題に遭遇しました。
@while の回答では、NoSuchMethodException
スローされた原因と解決策が既に説明されています。しかし、概説された Proguard ルールはかなり緩和されていて数が多いことがわかりました。これは、以前のバージョンのアクセサリ SDK では必要だったかもしれませんが、最近では、おそらくはるかに少ない除外で実行できます。
最近のアクセサリ SDK バージョン (私は 2.2.2 と 2.3.0 の両方をテストしました) のいずれかを使用していると仮定すると、以下から開始する必要があります。
-keepattributes InnerClasses
はリフレクションを使用して、独自のコードのどこかに実装SAAgent
する のインスタンスをインスタンス化するため、これを回避することはできません。SASocket
この規則により、内部クラスと外部クラスの間の関係 (および命名) が変わらないことが保証されます。
SASocket
ここで、の除外を追加して、実装のデフォルト コンストラクターを保持するルールを書きたくなるかもしれません<init>()
。残念ながら、コード最適化の一環として、Proguard は外部クラスのインスタンスを受け入れる内部クラスにパラメーター化されたコンストラクターを実際に作成するため、これは機能しません。その結果、Proguard は誰もそれを呼び出していないと見なすため、そのコンストラクターは保持されず、取り除かれません。
要するに、SASocket
実装とそのコンストラクターの両方を維持するために、ルールを追加します。
-keep class * extends com.samsung.android.sdk.accessory.SASocket { <init>(...); }
これまでは、上記のルールを適用しないと、実行時にアプリがクラッシュしていた可能性があります。それらを追加すると、これはもはや当てはまりません。ただし、アクセサリ SDK は依然としてさまざまなエラーをログに記録し、アプリがまだ意図したとおりに動作していないことに気付くでしょう。Logcat を調べると、SDK がサービスへのバインドに失敗したことを示すエラーが表示されるはずです。
この原因は明らかではないかもしれませんが、Accessory SDK を調べてみると、いくつかのIInterface
andBinder
拡張機能 (つまり、IDeathCallback
and ISAFrameworkManager
(2.2.2) またはISAFrameworkManagerV2
(2.3.0)) に気付くでしょう。Proguard はそれらへの明示的な呼び出しを見つけることができず、これらが実際に Android フレームワークによって実行時に呼び出されていることを認識していないため、それらを取り除きます。そこで、Proguard がそれを行うのを止めるルールを追加しましょう。
-keep class com.samsung.accessory.api.* extends android.os.Binder { *; }
この後、おめでとうございます: サービスは再びバインド可能になるはずです。実装によっては、さらに例外が必要になる場合がありますが、基本的なセットアップでは、上記でうまくいくはずです。
すべてを追加すると、構成に次のルールが必要です。
#
# Samsung Accessory SDK Proguard Rules
#
# Keep relationship between inner and outer classes
-keepattributes InnerClasses
# Keep any SASocket implementation and its constructors
-keep class * extends com.samsung.android.sdk.accessory.SASocket { <init>(...); }
# Keep the Accessory SDK's IInterface and Binder classes
-keep class com.samsung.accessory.api.* extends android.os.Binder { *; }
YMMV。