بناء جملة Smali لأكواد تشغيل DalvikVM
سؤال
مقدمة
أحاول التعرف على تعليمات DalvikVM باستخدام مجمع/مفكك Smali/Baksmali لملفات dex.
مشكلة
من ملف جافا هذا
package gd;
class Hello {
public static void main(String[] args)
{
System.out.println("Hello!");
}
}
لقد قمت بإنشاء ملف التجميع smali التالي:
.class Lgd/Hello;
.super Ljava/lang/Object;
.source "Hello.java"
# direct methods
.method constructor <init>()V
.registers 1
.prologue
.line 3
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static main([Ljava/lang/String;)V
.registers 3
.parameter
.prologue
.line 6
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "Hello!"
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
.line 7
return-void
.end method
سؤالي هو حول السطر التالي.
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
كما أفهم أن هذا يقوم بتحميل الكائن الثابت PrintStream
التابع java.lang.System
فئة في v0
يسجل.الآن، ماذا يفعل هذا out:
يقصد؟
المحلول
PrintStream هو في الواقع نوع الشيء الذي يتم تحميله.قد تتم الإشارة إلى الكائن الذي تقوم بتحميله باسم java.lang.System.out
, ، أين java.lang
هي الحزمة، System
هو الفصل، و out
هو العضو (حقل ثابت) الذي سيتم تحميله.
يمكنك رؤية نفس النمط في الاستدعاء الظاهري: java.io
هي الحزمة، PrintStream
هو الطبقة و println
هو العضو (في هذه الحالة، طريقة المثيل).وفي كلتا الحالتين، يسبق العضو ب ->
.لا أعرف ما إذا كان هذا النمط ثابتًا في جميع أنحاء سمالي.
وجدت http://source.android.com/tech/dalvik/dalvik-bytecode.html لا تقدر بثمن عندما كنت ألعب بأشياء dalvik، على الرغم من أن مساهمتها في هذه الحالة كانت مجرد تحديد أن كائن sget يتطلب وسيطتين فقط.أخبرني ذلك ->out:
يجب أن يكون العمل جزءًا من مرجع الحقل الثابت.
نصائح أخرى
في الواقع يقرأ الحقل الثابت المسمى out
الطبقة java.Lang.System. The (expected) type of that field is
java.io.PrintStream`.