Androidアプリ開発

アプリの難読化 (最適化を有効にする)

この記事は約10分で読めます。
記事内に広告が含まれています。
スポンサーリンク

この記事はAndroidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Javaでの開発経験、XML構文規則、Androidのアプリ開発経験がある方を対象としています。
Androidのアプリ開発でお役にたててれば、嬉しいです。
(これからAndroidのアプリ開発やJavaでの開発を始めたい方への案内は、記事の最後で紹介します)

この記事のテーマ


Google R8でアプリの難読化とコードの最適化を図る

Androidアプリは、逆コンパイルでソースを閲覧することが可能です。
アプリの脆弱性対策の観点で、難読化は有効です。

アプリの最適化を有効にする

アプリの難読化

Google R8の難読化は単純でクラス名やメソッドを意味を持たない短縮した文字列に置換します。
メリットとして、コードを解析し難くなることと短縮化によるコードの圧縮があります。
デメリットとして、クラッシュ時のスタックトレースが置換された短縮された文字列で出力されます。

置換前のクラス名やメソッド名と置換された短縮された文字列のマッピングは、ビルドした際に出力されるmapping.txtで確認できます。

Google R8の難読化はモジュールのbuild.gradleminifyEnabledで指定します。

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

trueで有効、falseで無効です。

プロジェクトのgradle.propertiesにGoogle R8を無効化する指定がある場合は削除します。

android.enableR8.fullMode=false

コードの最適化

Google R8のコードの最適化は未使用のコードとリソースを削除します。

Google R8の難読化はモジュールのbuild.gradleshrinkResourcesで指定します。

android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
        }
    }
}

trueで有効、falseで無効です。

難読化の問題点

Google R8の難読化には大きな問題点があります。
ビルドは成功するがアプリを起動するとクラッシュすることがあります。
外部ライブラリを使用している場合、クラス名やメソッドが変更され、ClassNotFoundExceptionが発生します。
厄介なことに、使用している箇所と通らないとクラッシュしません。
難読化した場合、基本的に全画面、全機能についてアプリの動作確認が必要です。

外部ライブラリを難読化の対象から除外する場合、proguard-rules.txtに記述します。

proguard-rules.txtの記述例

# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
-if class androidx.credentials.CredentialManager
-keep class androidx.credentials.playservices.** { *; }
-keep class com.google.api.** { *; }
-dontwarn javax.naming.InvalidNameException
-dontwarn javax.naming.NamingException
-dontwarn javax.naming.directory.Attribute
-dontwarn javax.naming.directory.Attributes
-dontwarn javax.naming.ldap.LdapName
-dontwarn javax.naming.ldap.Rdn
-dontwarn org.ietf.jgss.GSSContext
-dontwarn org.ietf.jgss.GSSCredential
-dontwarn org.ietf.jgss.GSSException
-dontwarn org.ietf.jgss.GSSManager
-dontwarn org.ietf.jgss.GSSName
-dontwarn org.ietf.jgss.Oid
-dontwarn android.media.LoudnessCodecController$OnLoudnessCodecUpdateListener
-dontwarn android.media.LoudnessCodecController

ビルドで警告が出る場合は-dontwarnで無視、クラッシュする場合は-keepで難読化の対象から除外します。

保持ルールを追加する

今回は、ここまでです。

暑い季節にクーラーのない部屋で仕事するなら、コレです♪

誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にあるコメントか、
こちら
から、お願いいたします♪

ポチッとして頂けると、
次のコンテンツを作成する励みになります♪

ブログランキング・にほんブログ村へ

これからAndroidのアプリ開発やJavaでの開発を始めたい方へ

初めての Android のアプリ開発では、アプリケーション開発経験がない方や、
アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、
書籍などによる独学ではアプリ開発できるようになるには、かなりの時間がかかります。
オンラインスクールでの習得をおススメします。

未経験者からシステムエンジニアを目指すのに最適です。まずは無料相談から♪

未経験者からプログラマーを目指すのに最適です。まずは無料カウンセリングから♪

カリキュラムとサポートがしっかりしています。お得なキャンペーンとかいろいろやっています♪

ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適です。まずは無料オンライン相談から♪

参考になったら、💛をポッチとしてね♪

スポンサーリンク
msakiをフォローする
スポンサーリンク

コメント欄

タイトルとURLをコピーしました