티스토리 뷰
안드로이드의 APK파일은 APKTool을 통해 분해, 재조립을 할 수 있다.
안드로이드 기본 프로젝트를 디컴파일 해보면 다음과 같다.
java 코드
smali코드
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은 패키지명을 포함하여 지정한다.
안드로이드 기본 프로젝트를 디컴파일 해보면 다음과 같다.
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은 패키지명을 포함하여 지정한다.
'컴퓨터 이야기 > Android' 카테고리의 다른 글
안드로이드 커널 컴파일 간단 HOWTO (2) | 2012.03.04 |
---|---|
CM7 7.1.0 Stable 출시 기념 한국 전화번호 패치 (넥서스S) (0) | 2011.10.10 |
넥서스 S 한국 전화번호 하이픈 패치방법 (3) | 2011.09.27 |
Notepad++용 Smali파일 Highlight 파일 (0) | 2011.09.24 |
안드로이드의 미래? (1) | 2011.08.12 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 5 sec rule
- 요리·레시피
- 레터스 투 줄리엣
- 더블린
- dex2jar
- IT·컴퓨터
- 5초 룰
- Ubuntu7.10
- 2월 29일
- 잠금화면
- 락스크린
- apktool
- ubuntu
- U123
- Gutsy
- 전화번호
- 안드로이드
- lockscreen
- setfsb
- GutsyGibbon
- 프로포즈 데이
- 일상·생각
- 문학·책
- 아일랜드
- STOP_APP_SWITCH
- Android
- 하이픈
- NEXUS S
- Leap Year
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함