チェック観点
毎回毎回ハマるので記載しておきます……
基本-keep
しておけば大丈夫だと思います。
①SimpleNameを使用していないか
クラス名は圧縮すると名前が変わるので、パッケージ名違いの同クラスが作成される可能性がある。
そのため、一意な名前で有ることを期待して使用している場合に、意図しない動作が起きる可能性がある。
修正方針
FragmentManager
等の一意で有ることを想定しているタグ名に使用している場合は
パッケージ名を含むクラス名が取得できるため、かぶる事が無いjava.name
に置き換える。
SharedPreference
等の永続化キーとして使用している場合は
クラスの追加・削除で難読化後のクラス名に影響がでるため、文字列で定数を定義して置き換える。
②リフレクションを使用していないか
クラス名やメソッド名をリフレクションを使用して呼び出していた場合は
難読化で名称が変わるため、該当部分の呼び出しでエラーが発生する。
修正方針
-keep
する
リフレクション以外の方法を検討する
③Value Objectをサーバへ送信していないか
Value Objectのフィールド名をjsonで送信すると
フィールド名が難読化で変わってしまうため、サーバがレスポンスを認識できなくなる。
修正方針
-keep
する
④レイアウトファイルでバインディングをしていないか
Data Bindingを使用してレイアウトファイルに直接フィールド名等を指定した場合
難読化で名称が変わるため、該当部分のボタンが機能しなくなったり、画面に表示されなくなる。
修正方針
-keep
する
⑤Parcelable Serializable Enumを継承/実装したクラスがないか
もしもシリアライズしてファイルに保存する等の永続化を行っている場合に
クラスの追加・削除で難読化後のクラス名が変わる可能性があるため
デシリアライズ時にエラーが発生する。
修正方針
-keep
する
⑥外部ライブラリを使用している箇所がないか
使用しているライブラリが内部的にリフレクションを使用していて、突然死ぬことがある。
修正方針
優しいライブラリなら除外設定用の記述例を用意してくれている事が多いので
Readmeとかを読んで探してみる。
優しくなかったら諦めてパッケージを全て-keep
する。
参考:proguard-android-optimize.txt
の中身
Windowsはユーザフォルダ\AppData\Local\Android\Sdk\tools\proguard
の中にあります。
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
#
# This file is no longer maintained and is not used by new (2.2+) versions of the
# Android plugin for Gradle. Instead, the Android plugin for Gradle generates the
# default rules at build time and stores them in the build directory.
# Optimizations: If you don't want to optimize, use the
# proguard-android.txt configuration file instead of this one, which
# turns off the optimization flags. Adding optimization introduces
# certain risks, since for example not all optimizations performed by
# ProGuard works on all versions of Dalvik. The following flags turn
# off various optimizations known to have issues, but the list may not
# be complete or up to date. (The "arithmetic" optimization can be
# used if you are only targeting Android 2.0 or later.) Make sure you
# test thoroughly if you go this route.
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 5
-allowaccessmodification
-dontpreverify
# The remainder of this file is identical to the non-optimized version
# of the Proguard configuration file (except that the other file has
# flags to turn off optimization).
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
native <methods>;
}
# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontwarn android.support.**
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}