動作しているAndroidアプリケーションがあります。ソースコードがありません。このアプリケーションの機能をデバッグしたいと思います。apktoolを使用して、このアプリケーションのapkファイルを正常にリバースエンジニアリングできます--- https://code.google.com/p/Android-apktool/ このツールは、クラスファイルをsmali形式で生成します。
私の要件は:
これを実現するには、デバッグログまたはスタックトレースに相当するsmaliを挿入/挿入する必要があります。メソッドの1つの開始時にsmali命令を追加しようとしましたが、ClassVerifyErrorでクラッシュしました。
smaliコードの例-
.method public declared-synchronized b()V
.locals 2
.prologue
.line 87
monitor-enter p0
:try_start_0
iget-object v0, p0, Lcom/example/viewerlib/t/d;->a:Ljava/lang/Thread;
invoke-virtual {v0}, Ljava/lang/Thread;->isAlive()Z
:
:
誰かがsmaliデバッグログを追加するのを手伝ってくれませんか。事前にThnx。
1。smaliのデバッグログ
Smaliのデバッグログ。たとえば、メソッドtest()の内部で、「Test()の内部」デバッグログを出力するとします。 smaliのメソッドの開始時に、次の手順を追加します。
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "Inside Test()"
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
注-ここでレジスタv0、v1を使用するときは注意が必要です。コード実行フローでは、フローの後半で使用されるレジスタの1つを使用していないことを確認する必要があります。または、例外が発生する場合があります。
2。StackTrace
これは、メソッドのスタックトレースを出力するためのsmaliのコードです。
Javaコード
public static void printStackTraces() {
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
for (StackTraceElement element : stackTraceElements) {
System.out.println("Class name :: " + element.getClassName() + " || method name :: " + element.getMethodName());
}
}
そして同等のsmaliコードは
.method public static printStackTraces()V
.locals 7
.prologue
.line 74
invoke-static {}, Ljava/lang/Thread;->currentThread()Ljava/lang/Thread;
move-result-object v2
invoke-virtual {v2}, Ljava/lang/Thread;->getStackTrace()[Ljava/lang/StackTraceElement;
move-result-object v1
.line 75
.local v1, stackTraceElements:[Ljava/lang/StackTraceElement;
array-length v3, v1
const/4 v2, 0x0
:goto_0
if-lt v2, v3, :cond_0
.line 78
return-void
.line 75
:cond_0
aget-object v0, v1, v2
.line 76
.local v0, element:Ljava/lang/StackTraceElement;
sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream;
new-instance v5, Ljava/lang/StringBuilder;
const-string v6, "Class name :: "
invoke-direct {v5, v6}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v0}, Ljava/lang/StackTraceElement;->getClassName()Ljava/lang/String;
move-result-object v6
invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v5
const-string v6, " || method name :: "
invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v5
invoke-virtual {v0}, Ljava/lang/StackTraceElement;->getMethodName()Ljava/lang/String;
move-result-object v6
invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v5
invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v5
invoke-virtual {v4, v5}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
.line 75
add-int/lit8 v2, v2, 0x1
goto :goto_0
.end method
このメソッドを任意のsmaliファイルに追加します。そして、
(上記のsmaliコードをcom.example.pakagename.ClassNameに追加したと仮定)
invoke-static {}, Lcom/example/packagename/ClassName;->printStackTraces()V
お役に立てれば .....
IntellijIdeaが好きなら、 smalidea チャンスを与えてください!
ちょっと私はあなたがこのツールが役立つかもしれないと思っていました
apkファイルをJava記述されたコードクラスに逆コンパイルします
このリンクをチェックして試してみてください
私はソニーのapkanalyzerを使用することをお勧めします:
https://github.com/sonyxperiadev/ApkAnalyser
apk-sを逆コンパイルしてsmaliコードを読み取り、printステートメントをさまざまな場所に挿入できます。メニューオプションがあります:「カスタムログを印刷する」、スタックトレースを印刷することもでき、他の多くのことを行うことができます。すべての変更が終わったら、デバイス->インストールを押してapkを起動します。すべてGUIから。
Apkanalyzerはststicアナライザーであることを指摘して申し訳ありませんsmaliコードを理解および編集するには、次のことを試してください
http://themasterofmagik.wordpress.com/2014/03/08/decompilerecompile-an-apk-basic-editing/
さまざまなシナリオでの編集について説明します。どのツールをいつ使用するか。
APKを逆コンパイル/再コンパイルするためのさまざまなアプローチ
a. apk
1. apktool + Notepad++
2. Virtuous Ten Studio
3. AndroChef Java Decompiler
b. classes.dex
1. smali/baksmali
2. dex2jar + JD-GUI
Smalideaプラグインを使用してみましたが、動作させることができなかったため、以下に示す別のアプローチで試してみました。
Android Studio 3.1.2、[ファイル]-> [プロファイルの選択]または[APKの分析]オプションに移動]にオプションがあります。次に、Apkをclasses.dexファイルとsmaliを含むファイルから逆コンパイルします。次に、Rus As-> Debugオプションを使用して、任意のsmaliファイルにブレークポイントを設定すると、指定したブレークポイントで停止します。これは、アプリケーションに単一のdexファイルがある場合にのみ機能します。ただし、マルチdexアプリケーションには回避策があります。以下の手順に従う必要があります-
1)Apktoolツールを ここ からダウンロードします
2)-> apktooldを使用してAPKを逆コンパイルします
3)上記で生成されたすべてのsmaliファイルを複数のフォルダー(smali、smali_classess2、smali_classes3など)にコピーして、Android Studio-> Analyze Apkメソッドから作成したoutフォルダーにコピーします。これにより、すべてのsmaliがファイルは単一のフォルダにあります
4)この手順が必要かどうかはわかりませんが、これを実行しました。この手順を確認してください。ここでも、コマンド-> apktool bを使用して、手順2で作成したフォルダーを使用してapktoolを使用してApkをビルドします。これにより、すべての.dexファイルが生成され、以前にAnalyzeApkメソッドを使用して単一のclasses.dexファイルが生成されたのと同じ場所にすべてのファイルがコピーされます。
5)Analyze Apkメソッドを使用して作成された同じプロジェクトを使用すると、デバッグできます。
P.S. -Android studioはJavaコードを使用したデバッグについて文句を言いますが、この方法は機能します。この方法は、smaliファイルを編集している場合にのみ役立ちます。それをデバッグします。