Androidアプリを難読化して動かすと、例外が発生することがあります。
スタックトレースを見ても難読化により、どのメソッドで例外が発生したのかわかりません。
そんなとき、例外発生したメソッドを特定する方法です。
難読化
Androidでは、セキュリティやサイズ縮小を目的に以下の設定を行うことがあります。
build.gradle
minifyEnabled true
shrinkResources true
この設定で動かしてみると、例外が発生することがあります。
難読化で例外発生して困ること
以下の実装があるとします。
Calc.java
package com.example.myapplication;
public class Calc {
public int divide(int param1, int param2) {
return param1 / param2;
}
}
MainActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Calc calc = new Calc();
int result = calc.divide(10, 0);
System.out.println(result);
}
}
これを実行すると、ゼロ除算で例外が発生します。
スタックトレース
Caused by: java.lang.ArithmeticException: divide by zero
at b.a.a.a.a(:5)
at com.example.myapplication.MainActivity.onCreate(:13)
at android.app.Activity.performCreate(Activity.java:7009)
at android.app.Activity.performCreate(Activity.java:7000)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
難読化により、例外発生したメソッド名がb.a.a.a.a
となり、どこで例外発生したかわかりません。
難読化された文字列からメソッドを特定する
難読化前後のマッピングを見れるファイルがあります。
Androidのプロジェクトフォルダに移動し、検索欄で「mapping」と検索してみてください。
検索結果に「mapping.txt」が表示されます。このファイルを開きます。
例外発生したメソッド名b.a.a.a.a
は、パッケージ名.クラス名.メソッド名で表現されています。
パッケージ名とクラス名(b.a.a.a
)でmapping.txtを検索します。以下該当箇所がヒットします。
mapping.txt
com.example.myapplication.Calc -> b.a.a.a:
3:3:void <init>() -> <init>
5:5:int divide(int,int) -> a
マッピングを見ると、例外発生したメソッド名(a
)がdivide
であることがわかります。