안녕들 하십니까?

오늘의 강좌 주제는 안드로이드 App Resource(이미지, XML) Hacking 입니다.

정말 잘 만들어진 App을 보면서 이 App은 어떻게 UI를 구성했을까? 고민해 본적은 없습니까? 하하~ 저는 그런 고민을 많이 했습니다. 단순한 UI야 쉽게 만들 수 있지만, 복잡한 UI를 보면서.. UI를 만들기 위해서 어떤 Layout을 사용했으며, 어떤 View를 사용했을까? 고민하다가 찾아본 프로그램에 대한 소개입니다.


전체 강좌 목차

[강좌A01] Moteodev Studio를 이용한 안드로이드 개발 환경 구축 가이드
[강좌A02] 안드로이드 개발 참고 서적 소개
[강좌A03] Android 실전 개발 - 아이디어 / 기획 / Wireframe
[강좌A04] 안드로이드 실전 개발 - 아이콘 제작
[강좌A05] 안드로이드 실전 개발 - 레이아웃 및 리소스 : Part1
[강좌A06] 안드로이드 실전 개발 - 레이아웃 및 리소스 : Part2
[강좌A07] 안드로이드 실전 개발 - 리소스 해킹

참고로 안드로이드 소스 역컴파일은 현재는 불가능합니다. 어셈블리 레벨로 볼 수는 있지만, 그거 분석하는거 공부할려면 짜증납니다. 언젠가는 자바로 역컴파일 해주는 프로그램이 나오지 않을까? ㅋㅋ 안 나올수도 있습니다.

 

기본적으로 Android App을 빌드하면 .apk 파일이 만들어집니다. 이 파일은 압축파일로 압축을 풀면 이미지는 볼 수 있으나, xml 파일의 경우에는 binary로 저장되기 때문에 editor에서 볼 수가 없습니다. xml을 볼 수 있다면.. resource 설계에 상당한 도움이 될 것입니다

~ 시작하겠습니다.

 

1. 먼저 apk 파일을 구해야 겠지요.

핸드폰으로 앱을 다운/설치 하시면.. 기본적으로 apk 파일은 /data/app 디렉토리에 저장됩니다. 근데, 우리가 구매한 핸드폰은 기본적으로 root 계정이 막혀있으며, /data 디렉토리에 퍼미션이 없어서 접근 자체가 불가능합니다. 루팅을 하지 않는 한 /data 디렉토리의 apk를 볼 수 있는 방법이 없습니다. <개발자 폰이 있으면 가능할텐데…> 하지만, 구글 검색어: “android apk rapidshare” 이정도 치면 누군가 apk를 모아서 rapidshare 사이트에 올려둔 게 많습니다. 특정 App 이름을 검색어에 추가하면 그 앱을 구할 수도 있습니다. 최신 App은 거의 없구요. 일종의 불법 app 사용이겠네요. 것도 원래 무료 App이 많습니다.  폰에 설치해서 사용도 가능합니다. 사용하기 위해서 이짓하기는 좀 귀챦습니다. 무료인 경우에는 개발사 홈페이지에서 바로 다운이 가능한 곳도 많습니다. 향후 Google App 인증이 적용된 App들이 나오면 설치는 불가능하게 되겠죠?

저희는 TStore에서 다운받겠습니다. tstore에서 pc manager로 다운 받으시면 local pc apk 파일이 다운됩니다. (참고로 tstore에서는 개발자에게 ARM 관련 library를 제공하기 때문에 ARM이 걸려있는 apk는 폰에 설치해도 실행이 안됩니다. 어플 실행 부분에 체크하는 로직이 들어있기 때문입니다. 저희는 리소스만 볼 것이므로 상관은 없습니다.)

 


앱에서 아무 프로그램이나 pc Manager로 다운받으신 후 우측마우스 클릭 > 파일이 저장된 폴더 열기를 하시면 apk 파일이 저장된 폴더가 열립니다. 저는 R-2 Player라는 라디오 프로그램을 다운 받았습니다. 제가 강좌하고 있는 Hangul To English 앱을 다운 받으셔서 테스트 하셔도 됩니다.

 

2. 압축을 풀자.

apk
파일은 압축 파일이므로 압축을 풀 수가 있습니다. 다만, 알집으로는 못 풀고 오픈소스 진영에서 만든 압축 프로그램인 7-zip으로 푸셔야 합니다. 7-zip은 홈페이지
(http://www.7-zip.org/) 에서 다운받으시면 됩니다.


위 그림을 보시면 /res/drawable 디렉토리에 이미지들이 보이네요. 보통 개발할 때 drawable 디렉토리에는 xml만 넣고, drawable-hdpi 폴더에 큰이미지, drawable-mdpi에 작은 이미지를 넣는데, 이 앱은 drawable에 이미지랑 xml 모두 다 들어있군요.

3. xml 파일 보기.

압축 푼 파일에서 xml 파일을 열어 보겠습니다.


~ binary 파일로 되어 있어서 xml 파일 자체를 볼 방법이 없군요.

이제 이 xml을 볼 수 있는 프로그램을 다운 받아 봅시다.

오픈소스로 만든 AXMLPrinter2 라는 자바로 개발된 프로그램입니다.


http://code.google.com/p/android4me/downloads/list  

에서 AXMLPrinter2.jar 파일을 다운 받아서 아무 디렉토리에 넣습니다. 저는 d:\test 디렉토리에 apk 압축을푼 파일(apk 디렉토리명도 r2_player로 변경했습니다) AXMLPrinter2.jar 파일을 넣어두겠습니다.

이제 준비가 끝났습니다. 위 압축 푼 파일 중에서 D:\test\r2_player\res\layout-hdpi\player_fwvga.xml 파일을 변환한다고 할 때..

cmd 창에서 다음과 같이 입력하시면 작업이 끝납니다.

java –jar [AXMLPrinter2.jar위치] [binary 포맷 xml 파일 위치] > [변환될 파일 위치]


java –jar D:\test\AXMLPrinter2.jar D:\test\r2_player\res\layout-hdpi\player_fwvga.xml > D:\test\r2_ player\res\layout-hdpi\player_fwvga.xml.txt



변환 작업이 완료되었습니다.

변환된 파일 위치에 가보시면 변환된 파일이 존재합니다. 열어보도록 하겠습니다.



잘 변환이 되었습니다.
그런데 이 작업에는 두가지 문제가 존재합니다.

하나는 변환 해야 될 파일이 많은 경우 엄청난 노가다를 해야 합니다.
두번째는, 현재 변환된 XML을 보시면 android:layout_width=”-2”로 실제 상수값이 들어가 있습니다. -2developer.android.com 에서 찾아보니
WRAP_CONTENT를 말합니다. 이것을 우리가 보기좋게 변환하려면 AXMLPrinter2 프로그램을 소스를 수정하거나 혹은 XML -> XML로 변환하는 XSLT 하나 만들면 될 것 같은데만들까 했는데.. 도저히 시간이 나지 않는군요. 누군가 해 주시면 감사하겠습니다. 아무도 안 해주심..하하 내년쯤에나 만들어 볼까 합니다.

 

첫번째 이슈인 변환해야 될 파일이 많은거..이것은 제가 도저히 참을 수가 없어서 간단히 VB스크립트로 조금 일을 간단하게 처리할 수 있도록 만들었습니다.

 

처음에는 vbsWindow Shell을 이용하여 프로그램을 직접 실행하도록 만들었으나 cmd 창이 개수만큼 떴다 사라지고 해서 오히려 불편해서 그냥 batch 파일을 만들어 주는 스크립트를 만들었습니다.

스크립트
소스입니다.



Const AXMLPRINTER_FILE = "D:\test\AXMLPrinter2.jar"

Const APP_ROOT_DIR = "D:\test\r2_player"

Const SAVE_FILE = "D:\test\print_xml_r2_player.bat"

 

Dim fso, tf

Set fso = CreateObject("Scripting.FileSystemObject")

 

 

If Not fso.FolderExists(APP_ROOT_DIR) Then

             Print("App Root Folder not exist. Check APP_ROOT_DIR Constants")

             WScript.Quit 0

End If

 

If Not fso.FileExists(AXMLPRINTER_FILE) Then

             Print("AXMLPrinter2.jar file not exist. please check AXMLPRINTER_FILE Constants")

             WScript.Quit 0

End If

 

Set tf = fso.CreateTextFile(SAVE_FILE, True)

 

call ShowSubfolders(APP_ROOT_DIR)

 

tf.Close

 

 

Sub ShowSubFolders(Folder)

             Set folder = fso.GetFolder(Folder)

    Set files = folder.Files

 

             For each file In files

                            If InStr(file.Name, ".") <> 0 Then

            fext = Right(file.Name, Len(file.Name) - InStrRev(file.Name, "."))

                  End If

 

                            If UCase(fext) = "XML" Then

                                        runCmd = "java -jar " & AXMLPRINTER_FILE & " " & file.Path & " > " & file.Path & ".txt"

                                        Print(runCmd)

                                        tf.WriteLine(runCmd)

 

                            End If

    Next

 

    For Each Subfolder in Folder.SubFolders

        ShowSubFolders Subfolder

    Next

End Sub

 

Sub Print(x)

   WScript.Echo x

End Sub

 


소스는 간단합니다.
디렉토리를 뒤져서 xml 파일인 경우 우리가 실행할 명령어를 텍스트 파일로 만들어 주는 스크립트입니다. vb 스크립트 아시면 금방 이해가 가실겁니다.

 

위 스크립트를 test 디렉토리에 저장한 후 처음 세줄인 상수값을 자신에게 맞게 수정합니다.

 

Const AXMLPRINTER_FILE = "D:\test\AXMLPrinter2.jar" 'AXMLPrinter2.jar 파일 경로 및 파일명

Const APP_ROOT_DIR = "D:\test\r2_player"                  '압축푼 apk 파일 루트 경로 (이 경로 하위 디렉토리를 뒤집니다.)

Const SAVE_FILE = "D:\test\print_xml_r2_player.bat"   '스크립트가 생성할 파일명

 

자 이제 실행은 cmd 창에서 cscript d:\test\print_xml.vbs 라고 명령 내리시면 apk 루트 하위의 모든 xml를 뒤져서 필요한 배치 스크립트를 만들어 줍니다. wscript d:\test\print_xml.vbs 라고 입력하셔도 되나, 이 경우 스크립트에서 메시지가 출력될 때 팝업창으로 나와서 조금 불편합니다.


위 그림과 같이 입력하면 배치파일이 만들어 집니다.

이제 만들어진 배치 파일을 실행하시면 모든 xml 파일을 텍스트 파일로 변환해 줍니다. 일이 한결 편해졌습니다.

이로써 7번째 안드로이드 실전 강좌를 마치겠습니다.

다음 강좌에서는 DB 부분을 살펴볼 것입니다. DB 관련 툴도 살펴보고 저희 Hangul to English 앱의 DB 부분 소스도 개발하겠습니다. 제 강좌를 구독하시면서 아직 Hangul To English App을 설치해 보지 않으신 분은.. 한번 설치해보시기 바랍니다. 그래도 직접 해보면 개발하는 앱에 대한 이해를 높일 수 있으니 ..

 

끝으로 스크립트 소스 첨부합니다. 필요하신분은 다운받으시기 바랍니다.

 

 

 

  1. 지니님 2010.08.20 19:33

    안녕하세요 강좌 잘 보고 있습니다. 서핑하다 우연히 들어왔는데 이렇게 좋은 강좌가 있었네요. 앞으로도 좋은 강좌 많이 부탁드립니다.^^

  2. onjo 2010.08.21 18:39

    좋은 정보 감사합니다.. ^^

  3. 나그네 2010.08.25 11:36

    좋은 강좌 감사합니다.

    너무나 많은 도움이 된거 같네요!

    앞으로도 잘 부탁드립니다 (__)

  4. seso 2010.12.19 16:04

    좋은 정보 감사드립니다~!!

  5. 지니파파 2010.12.21 17:00

    좋은 정보 감사합니다.

  6. tony 2011.05.04 19:28

    최고에요0.0

  7. 빛나는 야옹이 2011.06.29 12:10

    열심히 따라했는데요... 안되네요... xml파일 내용이 텅~ 비어있어요,,, 왜 그런건가요?

  8. 빛나는 야옹이 2011.06.29 12:12

    꼭 해보고 싶은데 ㅠㅠ *

  9. 뽀잉뽀잉 2011.10.26 21:48

    와우! 이런정보가 있다니!!
    정말 많은 도움이 되었어요!!

  10. eeaa3 2012.02.27 21:56

    소스구하기에 좋습니다. 책에서는 이부분을 왜 그냥지나쳣는지 ㅎㅎ

+ Recent posts