【Android】難読化ツールProguard設定まとめ
Android開発環境の1つであるEclipseでは、標準でAndroidプロジェクトの難読化ツールであるProguardが搭載されています。
しかし、そのままではこのProguardは機能せず、他者によって容易にリバースエンジニアリング(APK→プロジェクトコードへの復号)が可能となってしまいます。
昨今、他者にアプリをまんまパクられたりする恐れもあるため、この難読化はリリース時に不可欠なものだと思います。
ということで難読化ツールであるProguardについてまとめておくのです。
難読化とは・・・
ここでの難読化とは、クラスや関数、変数などの名前をaやbなどのように、1~2文字程度に置き換えたり、動作に影響のない無駄な部分を取り除いたりすることです。たぶん。
これをすることによって主に、「人によるコードの可読性を下げてリバースエンジニアリングを困難にする」、「コード量を削減し、パッケージが軽量化、パフォーマンス向上がもたらされる」などといった嬉しい事があります。
それでは実際にあるプロジェクトでのProguardの設定について見てみます。
(なお、ここではEclipseについて取り扱ってます。。。)
生成されたプロジェクトのフォルダを見てみると、直下に「project.properties」、「proguard-project.txt」の2ファイルがあります。
流れとしては、「project.properties」にproguardを有効にするための記述を、「proguard-project.txt」にproguardの詳細な設定をそれぞれ記述していきます。
プロジェクトによっては「proguard-project.txt」の設定が若干面倒ではあるけど、まぁ自動で難読化するのにも限界があるのでそこは仕方ないってことで。
それぞれ見ていく。
project.propertiesの設定
ここでの設定は簡単。ただコメントアウトしてproguardを有効にしてあげるだけ。具体的には、下記のようになる。
# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system edit # "ant.properties", and override values to adapt the script to your # project structure. # # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): //↓これをコメントアウトから外す(#を消す) proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. target=android-18
これでもうProguardが有効になりました。
proguard-project.txtの設定
proguardは有効になったが、このままでは難読化しちゃいけない箇所まで難読化が実行されたり、必要なはずのコードを不要と判断され削除されたりということが多々あり、エラー吐かれます。。。なので基本的に、ここは難読化しちゃダメ、そのままにしといて!!、このコードは必要!!というのをここで指定してあげるのです。
んでその肝心の難読化しちゃダメな所は、以下の箇所になります。
- AndroidManifest.xmlでのみ参照されるクラス
- JNIから呼ばれるメソッド
- 動的に参照されるフィールドやメソッド
- 外部jarのクラス ・・・etc
サンプルとして、ActionBarの互換用ライブラリとしてポピュラーなActionBarSherlock、広告としてポピュラーなAdmobのための設定を示す。これらは外部のJarクラスのため、設定が必要となります。。
#admob用の設定 -keep public class com.google.ads.** { public protected *; } -keep public class com.google.gson.** { public protected *; } #ActionBarSherlock用設定 -keep class android.support.v4.app.** { *; } -keep interface android.support.v4.app.** { *; } -keep class com.actionbarsherlock.** { *; } -keep interface com.actionbarsherlock.** { *; } -keepattributes *Annotation*
-keep <hogehoge>で難読化しないでね、と指定しています。詳細は下記のようになります。
オプション | 詳細 |
---|---|
optimizationpasses | 最適化の処理回数の指定。デフォルトは1回。複数回実施することで処理結果の向上が期待できます。apkファイルのサイズに影響します |
dontoptimize | 最適化を行わない |
dontusemixedcaseclassnames | 最適化処理で大文字と小文字を混ぜたクラス名に変更しない。Windows環境でこのオプションを指定しないと、ファイル名の大文字小文字の区別がされないため上書きされる可能性がある |
dontskipnonpubliclibraryclasses | 非publicなライブラリクラスをスキップしないようにする |
dontpreverify | 処理済みファイルの事前検証を行わないようにし、VMの読み取り速度を高速化する |
dontwarn | 警告を握りつぶす。警告の原因が明らかで無視してもよい場合は記述してよいが、それ以外は根本解決とならず危険 |
verbose | 処理中の情報を詳しく書き出す |
optimizations | 最適化対象
|
keep | クラスとクラスメンバをリネーム、削除しない |
keepnames | クラスとクラスメンバをリネームしない |
keepclassmembers | クラスメンバをリネーム、削除しない |
keepclassmembernames | クラスメンバをリネームしない |
keepclasseswithmembers | クラスメンバが存在した場合のクラスとクラスメンバをリネーム、削除しない |
keepclasseswithmembernames | クラスメンバが存在した場合のクラスとクラスメンバをリネームしない |
でproguardが適用されるのは、リリースビルドされる時です。
まず、ビルドの詳細ログが見られるようにするため、設定を変更します。
[Window] → [Preference] → [Android] → [Build] → [Build output]と順に選択していき、[Verbose]を選択。
んでリリースビルドしてみる。。大賞のプロジェクトフォルダ上で右クリックして
[Android Tools]→[Export Signed Application Package…]・・・
吐かれるログを見て、無事終了したらプロジェクト直下に新たに「proguard」フォルダが生成され、中には「dump.txt」「mapping.txt」「seeds.txt」「usage.txt」の計4ファイルが入っている。
エラーが出た場合は、基本的にエラーで怒られたクラス名などを-keepしてあげれば改善される。まぁ個々は頑張るしかない。
ちなみに、このビルドがちゃんと通ってもアプリが落ちる等しばしばあるので、リリースしたパッケージの動作確認は忘れずに。。。
・・・とまぁ色々と面倒くさいところもあるが、これで難読化完了。また、当方で試しに難読化したパッケージのサイズを見てみると、「難読化前:920kb」→「難読化後:715kb」と、おおよそ20%位軽量化されていますた。
ということでつまり、頑張れば幸せになれます。。。
参考
GoogleAdsense
関連記事
-
-
【Androidエラー】Conversion to Dalvik format failed with error 1
Androidにおいて、アプリケーションを作成し終え、いざパッケージをエクスポートっ!!というところ
-
-
bash設定ファイルについてまとめてみた
仮想環境を組んだ時に、環境変数が所どころ未設定なことがあった。 環境変数の設定にはbashの設定フ
-
-
MySQLでの条件付きSUM,COUNT
以前つっかかったMySQLでの条件付きSUM,条件付きCOUNTについて備忘録。。。 通常、条
-
-
Vimプラグイン「NERDTree」設定・コマンド備忘録
Vimのプラグインである「NERDTree」について、設定・コマンドを備忘録としてまとめておきます。
-
-
Android4.4(API19)KitKatでのGraphicalLayout,AdMob問題
Androidの新バージョンKitKatがリリースされてもう結構経つが、いまさら我が開発環境でも導入
-
-
【Android】代表的な脆弱性まとめ ~ファイルアクセス権について~
近年、スマートフォンの普及に伴い、Android, iPhone, WindowsPhone? ユー
-
-
Win7, 64bit環境でのcocos2d-x環境構築まとめ
さて、いままでJavaオンリーでゴリゴリとアプリリリースしてきたわけですが、ゲームを作るとなると、ど
-
-
クラックツールHydraでベーシック認証を突破してみる
kali linuxにデフォルトでインストールされているツール「Hydra」を利用して、ベーシック認
-
-
パスワードクラックツール JOHN THE RIPPER 使い方まとめ
パスワードクラッキングツールである「JOHN THE RIPPER」の使い方を備忘録としてまとめてお
-
-
PHPのextensionが読み込まれない問題…
大したあれではないが、ちょっと詰まったのでメモ。。。 事のぼったんは久々にWordPressを