Как отладить smali код приложения для android?
У меня есть работающее приложение для android. из которых у меня нет исходного кода. Я хотел бы отладить функциональность этого приложения. Я мог бы успешно перепроектировать этот файл apk приложения, используя apktool - https://code.google.com/p/android-apktool/ Этот инструмент генерирует файлы классов в формате smali.
Мое требование:
- возможность отладки метода путем добавления журналов отладки.
- возможность отладки вызовов методов путем печати стека след.
Для этого мне нужно ввести / вставить smali-эквивалент журнала отладки или трассировки стека. Я попытался добавить некоторую инструкцию 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. Спасибо заранее.
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. StackTrace
Вот код 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. И вызовите as
(предположим, что вы добавили приведенный выше код smali в com.образец.pakagename.ClassName)
invoke-static {}, Lcom/example/packagename/ClassName;->printStackTraces()V
Надеюсь, это поможет .....
Если Вам нравится IntellijIdea, дайте smalidea шанс!
Я предлагаю использовать apkanalyzer от sony:
Https://github.com/sonyxperiadev/ApkAnalyser
Он позволяет декомпилировать apk-s и читать smali-код, вставлять операторы печати в различные места. Есть пункт меню: "печать пользовательского журнала", вы также можете распечатать stacktrace, и сделать много других вещей. После всех изменений нажать кнопку устройства->установить и запустить АПК. Все от Гуи.
Эй, я подумал, что вы могли бы найти этот инструмент полезным
Он декомпилирует любой файл apk в классы Java-кода
Проверьте эту ссылку и попробуйте
Извините, что указываю, что apkanalyzer-это ststic analyser Для понимания и редактирования кода 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 в классы.dex файл и out файл, который будет иметь smali файлы. Затем вы можете использовать опцию Rus As-> Debug и поместить точку останова в любые файлы smali, и она остановится в указанной точке останова. Это работает только в том случае, если в вашем приложении есть один файл dex. Там однако это обходной путь для приложения multi dex, в котором вам нужно выполнить следующие шаги -
1) Загрузите Apktool tool из здесь
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 файл был создан при помощи более ранней анализа методом АПК.
5) Теперь используйте тот же проект, созданный с помощью метода Analyze Apk, и Вы хороши для отладки.P.S.-Android studio будет жаловаться на отладку используя Java-код, но этот метод будет работать. Этот метод полезен только в том случае, если вы редактируете любой файл smali и хотите его отладить.