Что означает следующая терминология smali?

#smali

#smali

Вопрос:

В последнее время я копался в некоторых закодированных файлах smali, и есть терминология, которую я просто не понимаю и нигде не объясняется (даже на сайте dalvik opcodes). Давайте начнем с вопросов

 1. What is ->?
2. What is (somerandomletter):I, F, J, S, C, B etc. (any element encoding letter)? 
   example of both in one: Lcom/google/android/gms/games/achievement/AchievementEntity;->j:I
3. What is this god damned v1, v2, v3, or v4 I see everywhere?
   ex. const-string/jumbo v1, "Type"
4. What is invoke-static and invoke-interface?
   ex. invoke-interface {p0},      Lcom/google/android/gms/games/achievement/Achievement;->n()J
   ex. invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
5. What are interfaces and public or private fields?
  

Ответ №1:

  1. -> синтаксис, используемый для обозначения элемента (либо метода, либо поля).
  2. Это примитивные типы. Они задокументированы на https://source.android.com/devices/tech/dalvik/dex-format.html (найдите «Семантику описания типов»). Смотрите также https://github.com/JesusFreke/smali/wiki/TypesMethodsAndFields

Lcom/google/android/gms/games/achievement/AchievementEntity;->j:I является ссылкой на поле. Lcom/google/android/gms/games/achievement/AchievementEntity; это класс, содержащий поле, -> это синтаксис для обозначения члена, j это имя поля, : это просто разделитель и I это тип поля (int).

  1. Это регистры. Вы можете найти более подробную информацию на https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html и https://github.com/JesusFreke/smali/wiki/Registers

  2. Они задокументированы на https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html

invoke-static используется для вызова статического метода (который всегда считается прямым методом).

invoke-interface используется для вызова метода интерфейса, то есть для объекта, конкретный класс которого неизвестен, используя method_id, который ссылается на интерфейс.

  1. Они соответствуют стандартной концепции интерфейса Java, а также общедоступных и закрытых полей.