project/android / / 2016. 3. 17. 14:06

class file format

클래스 파일의 포맷은 크게 


헤더(Header)

상수 풀 (Constant Pool)

접근 플래그 (Access Flag)

자식 클래스 (This Class)

부모 클래스 (Super Class)

인터페이스 (interfaces)

필드 (Fields)

메소드(Method)

속성 (Attributes)


로 구성 되어 있다. 간단히 설명을 덧 붙이자면



헤더의 첫부분은 [0xCAFE]값(일반 zip헤더에는 없고 apk의 헤더에 존재하는 Extra Field에만 존재.)과 가상머신의 버전숫자가 저장되어있다. 이 0xCAFE라는 값의 16진수 숫자는 매직넘버라 불리는데 자바 가상머신이 클래스 파일을 식별하기 위해 존재하는것이라 보면된다.


상수 풀에도 메소드명, 필드명, 클래스명, 디스크립터, 속성, 상수 등을 문자열이나 정수를통해 부동한 자료 구조로써 이 영역을 구성하고있다. 


파일 구조상 상수풀에는 실질적 데이터가 나열되어 저장되고, 다른영역엔 상수풀에 저장된 데이터의 인덱스를 인식하여 정의시킨다. 접근플래그는 (접근제어자 private, public, protected, etc)와 관련된 자식 클래스의 접근권한을 정의하고있고, 자식클래스영역에선 자식클래스의 디스크립터 인덱스를 저장하고있으며 부모클래스 영역은 자식클래스가 상속받게되는 클래스의 디스크립터 인덱스를 담고있다.



*디스크립터(descriptor)*

디스크립터 : 클래스,필드 그리고 메소드의 타입을 표현하는 문자열

 자바 프로젝트에서 매개 객체의 구체적 타입을 클래스에서 식별하게하는 식별자같은 역할이다

프로가드도 이런 특성을 이용해 매개 클래스파일 포맷의 디스크립터를 변경하는것을 이용하여 식별자전환 난독화기법을 구현한다.




*자식클래스와 부모클래스의 관계*


JAVA에서 '상속'이란 의미로 쓰이며 코드의 재사용성을 늘림과 동시에 불필요한 중복성을 제거해, 효율적인 코드작성에 쓰인다.


class 자식 extends 부모 {

//

}


기본적인 문법은 이렇고 , 여기서 부모클래스의 메소드,인스턴트 변수등을 자식클래스에서 사용할 수 있게된다.




인터페이스는 클래스가 상속받은 인터페이스들의 정보를 담고있다. 


필드영역엔 클래스에서 정의된 정적필드 혹은 일반필드의 정보를 담고있고 메소드 영역엔 클래스에서 정의된 정적메소드와 일반메소드의 정보를 가지고있다. 






'project > android' 카테고리의 다른 글

Android Code Obfuscation  (0) 2016.03.17
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유