Как отлаживать smali-код приложения для android?
У меня есть рабочее приложение для android. которого у меня нет исходного кода. Я хотел бы отладить функциональность этого приложения. Я мог бы успешно перепроектировать этот файл apk приложения, используя apktool -https://code.google.com/p/android-apktool/ Этот инструмент генерирует файлы классов в формате smali.
мои требования :
- чтобы иметь возможность отлаживать метод, добавляя журналы отладки.
- чтобы иметь возможность отлаживать вызовы методов путем печати трассировки стека.
для этого мне нужно ввести / вставить smali эквивалент журнала отладки или трассировки стека. Я попытался добавить некоторую инструкцию smali в начале одного из методов, но она разбилась с ClassVerifyError.
пример кода-
.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 журналов отладки. Спасибо заранее.
7 ответов
1. Журнал отладки в smali
журнал отладки в smali. Скажем, например, внутри метода test () вы хотите распечатать журнал отладки "Inside 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 здесь. В потоке выполнения кода Вы должны проверить, что не используете один из регистров, который используется позже в потоке. Или вы можете получить Исключение.
2. Трассировка стека
вот код smali для печати stacktrace метода
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.образец.pakagename.ClassName)
invoke-static {}, Lcom/example/packagename/ClassName;->printStackTraces()V
надеюсь, что это помогает .....
Я предлагаю использовать apkanalyzer от sony:
https://github.com/sonyxperiadev/ApkAnalyser
Он позволяет декомпилировать apk-s и читать код smali, вставлять операторы печати в различные места. Существует опция меню: "печать пользовательского журнала", вы также можете печатать stacktrace и делать много других вещей. После всех изменений вы просто нажимаете Device - >Install и start apk. Все от Гуи.
Эй, я думал, что вы можете найти этот инструмент полезным
Он декомпилирует любой файл apk в классы Java written code
проверьте эту ссылку и попробуйте
жаль, что 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 есть опция, перейдите в File - > Select Profile или Analyze Apk option. Затем он будет декомпилировать Apk в классах.dex файл и файл, который будет иметь файлы smali. Затем вы можете Rus As - > Debug option и поместить точку останова в любые файлы smali, и она остановится в указанной точке останова. Это работает только если у вас один файл DeX в вашем приложение. Тем не менее, для приложения multi dex существует работа, в которой вам нужно выполнить следующие шаги -
1) Скачать Apktool инструмент из здесь
2) Декомпилируйте Apk с помощью - > apktool d
3) скопируйте все файлы smali, созданные выше в нескольких папках-smali, smali_classess2, smali_classes3 и так далее в папку out, созданную из Android Studio - > Analyze Apk метод ранее, так что все файлы smali находятся в одном папка
4) этот шаг я не уверен, требуется ли это, но я следовал этому, не стесняйтесь проверять этот шаг. Здесь вы снова создаете Apk с помощью apktool, используя папку, созданную на Шаге 2 с помощью команды - > apktool b . Это будет генерировать все .dex файлы и скопировать все файлы в том же месте, где отдельные классы.файл dex был создан с использованием метода Analyze Apk ранее.
5) Теперь используйте тот же проект, созданный с помощью метода Analyze Apk, и вы хорошо отлаживать.
С. П. - студия Android жалуются на отладку, используя Java-код, но этот метод будет работать. Этот метод полезен, только если вы редактируете любой файл smali и хотите отладить его.