ソフトコミュ開発ブログ

SoftCommu は Javaアプリ、Androidアプリの開発を行うディベロッパーです。人材教育もやっています。企業の新人研修の講師からスカイプでのオンライン家庭教師まで!技術書の執筆や翻訳もしています。
<< エクリプスでテキストエディタの背景色を黒っぽくしたらデバッグ中にどの行にいるのかわからなくなった場合の対応策 | main |
2017.04.21 Friday
Proguard を使用してリリース用APKを出力しようとした際にエラーになるケースの対応策

Proguard は、Android Studio に付属のソースコード難読化ツールです。

これを使うと、APK全体がコンパクトになり、

実行時の処理速度も速くなるというメリットもあります。


アンドロイド用の APK は、Java のクラスファイルがそのまま入っていますが、

これは非常に簡単にリバースエンジニアリングできますので、

そのまま Google Play などにリリースすると、

ソースコードが一般公開されたも同然の状態になります。


そこで、APKの中に埋め込まれているコードのクラス名や変数名を

人間にとって意味の分からない文字列に置き換えることによって難読化し、

ソースコードの盗用をある程度防ぐことができます。


もちろん、Proguard がやっていることは、あくまで「難読化」であり、「暗号化」ではありません。

単にソースコードを読みにくくして、解析する側のやる気をそぐだけですので、

完璧なソースコードの保護とはなりませんが、一定の効果は期待できます。


Proguard の使用方法としては簡単です。

Android Studio で作成したプロジェクトはデフォルトで

appレベルの build.gradle に下記のように記入してあります。


buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }


あとは、Android Studio のメニューの Build → Generate Signed APK

を実行することによって、難読化された署名付きAPKを作成することが可能です。


しかし、アプリに外部ライブラリなどを組み込んでいる場合、

下記のようなエラーが発生し、APKが作成できないことがあります。

 

 

上記では、


「Error:Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
> Job failed, see logs for details」


と書いてありますね。


「see logs for details」つまり「詳細はログを参照」と言っているようです。


では、ログを見てみましょう。

 

 

なんと!ログの方では、


「Generate Signed APK: Errors while building APK. You can find the errors in the 'Messages' view.」


と書いてあります。


つまり、「エラーの内容に関しては Messages ビューをみてください」ということですね。


あら、無限ループの予感。

 

Messages は Log を見なさいと言う、

Log は Messages を見なさいと言う・・・


でもここは辛抱強く、ログの言うとおり、Messages 欄をもう一度見てみましょう。


今度は Messages 欄の表示範囲をグリグリっと広げてみます。

 

 

なるほど、


Warning:com.amazonaws.util.json.JacksonFactory: can't find referenced class com.fasterxml.jackson.core.JsonFactory


といった感じのメッセージがずらずらと表示されていますね。


各行のメッセージの左に表示されているアイコンが「黄色の三角内のビックリマーク」なので、

単なる警告っぽく見えますが、どうやら Proguard の適用時にこれが表示された場合、

これは警告というよりはエラーと解釈した方が良さそうです。


今回の場合、プロジェクト内で使用している Amazon AWS のライブラリ(SDK)が

com.fasterxml.jackson.core パッケージ以下のクラスを参照できないことがエラーになっている原因です。


これらのファイルを Proguardが勝手に(もとい自動的に)難読化してしまい、

Amazon AWS のライブラリ(SDK)からcom.fasterxml.jackson.core パッケージ以下の

ファイルを参照できなくなってしまっています。


これを解決するためには、上記のファイルたちを Proguard による難読化の対象から外すことが必要です。


このためには proguard-rules.pro というファイルに必要な設定を記述する必要があります。

でも、何と記述すれば良いのでしょうか?

ネットで検索すると Amazon AWS用の SDK を使っている場合は、

下記のように記載すれば良いということが分かりました。

 

-keep class com.amazonaws.** { *; }
-keepnames class com.amazonaws.** { *; }
-dontwarn com.amazonaws.**
-dontwarn com.fasterxml.**

 

上記の設定を proguard-rules.pro に記載した状態は下記の通りです。

 

 

では、Android Studio のメニューの Build → Generate Signed APK を実行してみましょう。

 

キーストアファイルやパスワードなどを設定した後、

下記の画面のような感じのダイアログが出ます。

 

 

そして、Finish をクリックすると・・・

 

 

無事にリリース用の署名付き APKが作成されました!

 

ちなみに、作成されたリリース用APKファイルのサイズをデバッグ用のAPKサイズと比べてみると・・・

 


Proguard適用前は 3.3MBだったのが

Proguard適用後は 2.1MBまで小さくなったようです!


これで晴れて APK を Google Play にリリースできます!

 

今回の教訓:Proguard を使った時にコンパイルエラーが発生した場合は、

エラーメッセージで検索するのではなく、

警告メッセージを頼りに検索すべし!

 

| SoftCommu | - | 11:28 | comments(0) | - |









 123456
78910111213
14151617181920
21222324252627
28293031   
<< May 2017 >>
+ 人気の記事
+ ARCHIVES
+ CATEGORIES
+ MOBILE
qrcode
(C) 2016 SoftCommu All Rights Reserved.