SSブログ

Androidアプリ開発 ProGuardによる難読化 [Androidアプリ開発]

本日は、NDKの話をしようと思って書き始めたのではあるが、難読化についてである。ご存じのように、Androidアプリは基本Javaで開発する。Javaで書いておけば、プラットフォームの違いは、JavaVMが吸収してくれる。

しかし、Javaはどうしても実行速度が遅くなる。機械語に翻訳しながらプログラムを実行させているわけなので。
ガベージコレクションも結構、邪魔者扱いされるときがある。「解放しなくてもいい」っていうのは、プログラマにとっては楽なんだけどねぇ。

ゲームなんかだと、ガベージコレクションで画面の更新が止まってしまうからいや。といった発言があちこちで見られる。

ネイティブな機械語のプログラムを走らせた方が実行速度はぜんぜん速い。ポータビリティを考えなくてよいのであれば、C/C++でアプリを書いた方が速いプログラムを作成できるっていうこと。

難読化

マーケットに出すアプリであると、リバースエンジニアリングされることも考えないといけない。Javaのバイトコードは、機械語ではないので、簡単にソースコードの状態に戻すことができる。もちろん、コメントとかはなくなっているが、変数名とかはそのまま。
バイトコードへのコンパイル時に、最適化が行われるので、逆コンパイルしても全く同じソースコードにはならない。しかし、それでも開発したソースコードをさらしていると思うと気分はよくない。

最適化と同時に、「難読化」といったことも行われているらしい。

AndroidManifest.xmlの下に、proguard.cfgというテキストファイルがある。これが難読化の設定ファイル。

難読化でどういったことが行われるかというと、メソッド名や変数名が意味不明の番号などに置き換えられる。っていうことらしい。

C/C++で作成した機械語のプログラムでも逆コンパイルでアセンブラレベルまでには戻せる。リバースエンジニアリングできなくもないが、けっこう大変。関数や変数がみなアドレスに変換されてしまっているから。

これと同じように、メソッド名、変数名をそのままじゃなくて、アドレスのように人間が見たら何これ?って思うような意味の無い名前に変換してしまう。それが、難読化のうちのひとつで「名前の無意味化」というもの。ProGuardの機能のひとつ。

名前を変換することで、プログラムのファイルサイズが幾分か小さくなる、といった効果もあるとか。

うん?ちょっとまてよ。AREarthroidで例外が報告されていた際に、「難読化されているかも」といった注意書きがあった。メソッド名が無意味なものに変換されていたら、スタックトレースを見ても何がなんだか理解不能なはず。

ちゃんとメソッド名が出ているっていうことは、難読化されてない?

だよねぇ。java.langとか、android.openglとかのソースは変換しちゃだめな気がするが、自分で作成している部分については、難読化してくれていてもよさそうなのだが...
ちゃんと設定していないとだめなのか。


調べ中...


project.propertiesproguard.config=proguard.cfgっていう設定が必要なのか。がーん。
試しにやってみる。
project.propertiesを編集後、プロジェクトをクリーン。実行。
アプリは、普通に起動されたが、難読化された形跡がないなぁ。

さらに調べ中...

ADTのr17で変更されたのか。proguard-project.txtになってるし。アンコメントすればいいだけなのか。

# 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


これでいいのか?

以下の記事がr17での変更について詳しく書かれていた。
http://d.hatena.ne.jp/bs-android/20120325/1332662384

しかし、これでも難読化された形跡がないのだが...
本当に難読化されたのであろうか。

どうも、署名付きのAPKをエクスポートする際に、発動するものらしい。エミュレータで実行している分にはProGuardの出番はない。
じゃあ、APKを作ってみるとしよう。

おお、プロジェクトにproguardのフォルダができた。その中のmapping.txtをみると...
やってるやってる。

cx.fam.asai.TestOpenGL.Model -> cx.fam.asai.TestOpenGL.a:
    java.nio.FloatBuffer buffer -> a
    java.nio.FloatBuffer normalBuffer -> b
    java.nio.FloatBuffer textureBuffer -> c


最初の行はクラス名の変換だな。
次は、フィールドか。順番にa、b、cと名前を付けていく模様。

これは、AREarthroidでもやらなければ。
しかし、難読化することで問題が発生するかも知れないので十分にテストしないと。

関連記事


サイト内を検索

nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。



Copyright Atsushi Asai Google+朝井淳
[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)

イラストで理解 SQL はじめて入門

イラストで理解 SQL はじめて入門

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2019/05/16
  • メディア: 単行本(ソフトカバー)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/03/03
  • メディア: 単行本(ソフトカバー)

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/05/25
  • メディア: 大型本

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。