DEX파일이란 JAVA코드로 작성돼 컴파일된 클래스 파일을 DX(Android DX tool)도구를 사용해 변환한 파일이다. 이 과정에 java 바이트 코드들은 달빅 바이트 코드로 변환 되며 여러 클래스 파일에 들어있는 중복된 코드들을 재사용하기 때문에 JAR(Java Archive)파일에 비해 필요한 공간이 절반 정도로 줄어들게 된다.
이러한 성질을 이용하여 다양한 Java파일을 묶은 클래스 파일을 DEX형태로 바꾸는 것이다. 아래의 사진을 참고하면 이해하기 쉬울 것이다.




Java파일이 Dex파일로 바뀌는 과정 및 역으로 바뀌는 과정



이 글에서는 Java파일을 DEX파일로 바꾸는 방법을 알아보고자 한다.

필요한 준비물

1. 자바 개발 킷(Java Development Kit) : 자바 코드를 클래스 파일로 컴파일하기 위함
링크 : http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
링크 타고 들어가면 아래와 같은 화면을 볼 수 있을 것이다. Accpet License Agreement를 체크 해주고 아래에 사용자 OS에 맞는 것을 설치 한다.

C:\Program Files\Java\jdk1.8.0_73\bin
위 경로는 기본 설치 경로이며, 빨간색으로 칠해져 있는 곳은 각 버전마다 다를 수 있으니 참고하시길 바랍니다. 


2. 안드로이드 SDK : 자바 클래스 파일을 DEX파일로 변환하기 위해 SDK에 있는 도구 중 일부를 사용
안드로이드 SDK로써 이클립스등 다양한 툴이 있는데 여기선 안드로이드 SDK를 사용 할 것이다.
링크 : http://developer.android.com/sdk/index.html#Other


빨간곳 안에서 사용자가 쓰고 있는 OS에 맞게 다운로드 합니다.
다운로드하면 기본적인 것이 깔리는데 다 깔고 나서 SDK Manager를 실행시켜 줍니다.


여기서 Tools에 해당되는 것을 체크해주고 설치합니다. 그러면 후에 쓰일 dx를 사용 할 수 있습니다.


3. 텍스트 편집기 : 샘플 자바 프로그램을 구현하기 위해 텍스트 편집기
필자는 Sublime Text3을 사용 하여 샘플코드를 제작했다.
링크 : http://www.sublimetext.com/3
서브라임 텍스트는 범용성이 좋아서 깔아두면 요긴하게 쓰일 수 있다. 굳이 이걸로 할 필욘 없지만 쓰는 텍스트 편집기가 없다면 고려해볼만 하다.
그리고 서브라임 텍스트의 설정방법은 타 블로그에 검색해보면 자세히 나와있으므로 설명은 생략한다.



준비물이 준비되었다면

텍스트 편집기를 열고 다음 코드를 이용해 파일을 생성 한다.




위와 같은 소스로 Example.java라는 이름으로 저장한 후 터미널이나 명령 프롬프트(CMD)에서 다음 명령을 입력해서 컴파일 한다.



컴파일 후 아래의 모습


컴파일하고나서 뜨는 Warning 은
JDK 최신 버전에서 구버전으로 -source를 지정해서 컴파일 할 경우 아래와 같은 오류가 발생하지만 경고일 뿐이라서 무시해도 상관 없다.
만약 컴파일했는데 엑세스 거부가 뜬다면 관리자 권한으로 cmd를 실행하여 해보자.




그러면 자바 파일과 Class파일이 생긴 것을 확인 할 수 있다.

컴파일할 때 실행하려는 파일의 위치로 Example.java파일을 옮겨 할 수 도 있고 환경변수를 지정하여 어디든지 할 수 있고 할 방법은 다양하다.



컴파일을 통해 Class 파일이 준비되었다면 아까 안드로이드 SDK에서 깔았던 기능 중에서 dx를 사용 할 것이다.
C:\Users\사용자\AppData\Local\Android\android-sdk\build-tools\23.0.2가 필자의 기본 경로이며 dx.bat이 있다면 사용 할 수 있다.



아까 컴파일하여 Class파일을 만들었다면 이 해당 하는 파일을 사용한다. 

아래의 dx --dex --output=Example.dex Example.class를 입력해준다. 

해당 명령어를 입력해주면 DEX파일이 만들어지는 것을 알 수 있다.


-dex : dx에게 DEX파일을 생성할 것이라고 알려줌
-output=example.dex : dx에게 작업을 통해 생성되는 파일의 이름이 example.dex라고 알려줌
Example.class : 입력될 파일 



이렇게 Java파일을 Class로 바꿔 DEX파일로 바꾸어 보았다.

처음에 했던 것은 자바 개발자들이 많이 하는 것으로 자바 객체라 불리는 것을 만드는 것이고 이 객체가 Example이다. 

그다음은 Example.java를 클래스 파일로 컴파일한다. 여기서는 자바 컴파일러가 사람이 작성한 코드를 분석해 자바 가상 머신을 위한 스택 기반의 명령어 집합으로 변환 처리한다.

마지막으로 자바 데이터와 스택 기반의 명령어로 이루어진 CLASS 파일을 만들고 리소스, 데이터 구조와 레지스터 기반의 명령어로 이루어진 달빅 가상 머신(Dalvik VM)이 이해할 수 있는 DEX파일을 만들었다. 



참고자료 : http://blog.naver.com/gigar/60115566766
           안드로이드 해킹과 보안(에이콘)


+ Recent posts