【Android】難読化ツールProguard設定まとめ

公開日: : Android, 備忘録 ,

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 最適化対象

  • !code/simplification/arithmetic → 算術命令に対してヒープホール最適化を行わない
  • !field/* → fieldで始まるすべてのフィルタを除外する。
  • !class/merging/* → クラス階層においてクラスのマージを行わない。
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

関連記事

node_cookie

【Node.js】 Cookieの取り扱いまとめ

最近流行りのNode.jsですが、Cookieに関して、いくつかお決まりの取り扱い方があり、

記事を読む

PHPのextensionが読み込まれない問題…

大したあれではないが、ちょっと詰まったのでメモ。。。 事のぼったんは久々にWordPressを

記事を読む

Win7, 64bit環境でのcocos2d-x環境構築まとめ

さて、いままでJavaオンリーでゴリゴリとアプリリリースしてきたわけですが、ゲームを作るとなると、ど

記事を読む

hydra

クラックツールHydraでベーシック認証を突破してみる

kali linuxにデフォルトでインストールされているツール「Hydra」を利用して、ベーシック認

記事を読む

android_kitkat

Android4.4(API19)KitKatでのGraphicalLayout,AdMob問題

Androidの新バージョンKitKatがリリースされてもう結構経つが、いまさら我が開発環境でも導入

記事を読む

nerdtree

Vimプラグイン「NERDTree」設定・コマンド備忘録

Vimのプラグインである「NERDTree」について、設定・コマンドを備忘録としてまとめておきます。

記事を読む

MySQLでの条件付きSUM,COUNT

以前つっかかったMySQLでの条件付きSUM,条件付きCOUNTについて備忘録。。。 通常、条

記事を読む

john the ripper

パスワードクラックツール JOHN THE RIPPER 使い方まとめ

パスワードクラッキングツールである「JOHN THE RIPPER」の使い方を備忘録としてまとめてお

記事を読む

【Androidエラー】Conversion to Dalvik format failed with error 1

Androidにおいて、アプリケーションを作成し終え、いざパッケージをエクスポートっ!!というところ

記事を読む

【Android】APKのデコンパイルまとめ

AndroidのプロジェクトをパッケージングしたAPKファイルをデコンパイル(Javaのソースコード

記事を読む

GoogleAdsense

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

GoogleAdsense

openssh
SSH CA認証まとめ

SSHでの接続を、CA認証でやってみる。 備忘録として残しておく

node_cookie
【Node.js】 Cookieの取り扱いまとめ

最近流行りのNode.jsですが、Cookieに関して、いくつ

hydra
クラックツールHydraでベーシック認証を突破してみる

kali linuxにデフォルトでインストールされているツール「Hyd

john the ripper
パスワードクラックツール JOHN THE RIPPER 使い方まとめ

パスワードクラッキングツールである「JOHN THE RIPPER」の

宇部空港
久々の帰省・・・

宇部空港にて[/caption] たまには普通の日記を。。。

→もっと見る

PAGE TOP ↑