RetrofitとProtocol Buffersを連携させる場合、下記のConverterを使うケースが多いのかと思います。
Google Protocol Buffer Converter
https://github.com/square/retrofit/tree/master/retrofit-converters/protobuf
今回、Retrofit + Google Protocol Buffer Converter なAndroidプロジェクトで、ProGuardを設定しようとしたらエラーでハマったのでメモとして投稿します。
エラー内容
特にProGuardの設定なく実行させてみると、下記のエラーが吐かれました。
Caused by: java.lang.IllegalArgumentException: Found a protobuf message but jp.co.b.a.a.g$a had no parser() method or PARSER field.
parser()
というメソッドが難読化されて別名になったためと思われます。
コードを追うと、
https://github.com/square/retrofit/blob/master/retrofit-converters/protobuf/src/main/java/retrofit2/converter/protobuf/ProtoConverterFactory.java#L67
ここらへんでリフレクションを使って parser()
というメソッドを使うようになっているみたいです。
対策
-keepclassmembers class your.generated.class.** {
public static ** parser();
}
.protoファイルから自動生成されたクラスに対して、 parser()
というメソッドを難読化から除外することで、エラーが吐かれることなく実行できるようになりました。