ソフトコミュ開発ブログ

SoftCommu は Javaアプリ、Androidアプリの開発を行うディベロッパーです。人材教育もやっています。企業の新人研修の講師からスカイプでのオンライン家庭教師まで!技術書の執筆や翻訳もしています。
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だったのが、適用後は 2.1MBまで小さくなったようです!

 

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

 

 

教訓:Proguard の適用時にエラーが発生した場合は、エラーメッセージで検索するのではなく、警告メッセージを頼りに検索すべし!

 

 

 

ソフトコミュでは、スカイプによる Java や Androidプログラムの

オンライン家庭教師を受け付けています。

料金は30分2,000円から。

ネット検索しながら何日も悩んだ問題が、たった30分で解決すると大好評です!

興味のある方はソフトコミュのホームページからご連絡ください!

 

 

 

 

 

| SoftCommu | - | 11:53 | comments(0) | - |
     12
3456789
10111213141516
17181920212223
24252627282930
31      
<< December 2017 >>
+ 人気の記事
1位: ズバリ、ラムダ式 (Lambda)とは何か? それを使うと何がうれしいのか?

2位: Android エミュレータが起動しない場合の復旧手順

3位: Android Studio で "SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable" と表示される問題の原因と対応策

4位: Android 7.0 から Intent の getSerializableExtra() が使えなくなってしまいました!

5位: エミュレータの Google Play Services のバージョンが古いために Google Maps などを使用したアプリが動作しない場合の対応策

6位: Proguard を使用してリリース用APKを出力しようとした際にエラーになるケースの対応策

7位: OneDrive でオフィス文書が同期できなくなるケースの対応策

8位: Java で Firebase を使う方法のまとめ。

9位: Arduino の開発環境に ZIP形式のライブラリをインストールできない場合の対処方法

10位: Bitbucketから、指定した時点でのファイルをすべてまとめて zip でダウンロードする方法

11位: Android Studio で2台のパソコンを行き来しながら開発作業をする方法

12位: AWS (Amazon Web Service) で動作している WEBアプリを SSL対応(HTTPS対応)にする

13位: AWS (Amazon Web Service) の公式ドキュメントで 「HTTPS を終了する」とはどういう意味か?

14位: エクリプスでテキストエディタの背景色を黒っぽくしたらデバッグ中にどの行にいるのかわからなくなった場合の対応策

15位: 任意のレジストラで取得したドメインのSSL認証を AWS で無料で取得し、Elastic Beanstalk の WEBアプリを https で公開するまでの手順まとめ

16位: マイクロソフトの API仕様変更に伴う 「OneDrive API活用術」のサンプルコードの修正のお知らせ

+ ARCHIVES
+ CATEGORIES
+ MOBILE
qrcode
(C) 2016 SoftCommu All Rights Reserved.