smali analysis 1
mobile/android 2012. 4. 19. 16:51안드로이드의 APK파일은 APKTool을 통해 분해, 재조립을 할 수 있다.
안드로이드 기본 프로젝트를 디컴파일 해보면 다음과 같다.
java 코드
package com.atest; import android.app.Activity; import android.os.Bundle; public class AtestActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
smali코드
.class public Lcom/atest/AtestActivity; .super Landroid/app/Activity; .source "AtestActivity.java" # direct methods .method public constructor <init>()V .locals 0 .prologue .line 7 invoke-direct {p0}, Landroid/app/Activity;-><init>()V return-void .end method # virtual methods .method public onCreate(Landroid/os/Bundle;)V .locals 1 .parameter "savedInstanceState" .prologue .line 11 invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V .line 12 const/high16 v0, 0x7f03 invoke-virtual {p0, v0}, Lcom/atest/AtestActivity;->setContentView(I)V .line 13 return-void .end method
1. 헤더 부분
1package와 import부분은 사라졌다. package는 class명과 smali폴더 계층에서 찾아볼 수 있다.
public class AtestActivity extends Activity가
.class와 .super로 변형된 것을 알 수 있다. 클래스명 앞에 붙은 L은 Object를 뜻한다.
.source는 소스파일 명이다.
2. Class Body
메소드는 .method로 시작하여 .end method로 끝난다.
클래스의 생성자 코드가 보이고
그 아래로 onCreate 메소드가 있다.
마지막 문자는 리턴타입으로 V는 Void를 뜻한다. (http://code.google.com/p/smali/wiki/TypesMethodsAndFields)
.locals는 메서드 내부에서 사용하는 레지스터 수(v0, v1, v2 ....)
.parameter는 매개변수로 받아온 변수명이다.
.prologue로 body가 시작하는데 사용되는 opcode들은 (http://netmite.com/android/mydroid/dalvik/docs/dalvik-bytecode.html)에서 자세하게 확인할 수 있다.
.line xx는 java소스의 라인을 가리키므로 디버깅시 확인할 수 있다.
주로 함수 호출시 invoke-kind가 사용되는데 virtual, static, super등이 있다.
p0은 클래스 인스턴스를 가리키고 이후 value가 매개변수에 해당된다.
메소드 명 뒤 괄호 안에 매개변수의 type을 지정하는데, primitive type의 경우 약어를 넣고 그 외의 type은 패키지명을 포함하여 지정한다.
'mobile > android' 카테고리의 다른 글
9patch 오류 시 해결 방법 (0) | 2012.08.30 |
---|---|
smali2c - simple function test (0) | 2012.07.25 |
Dalvik Instruction Set (0) | 2012.06.19 |
Dalvik opcodes (0) | 2012.06.19 |