Facebook에서 Android dex를 압축(?) 해 주는 툴을 만들어 두었는데, 이것의 이름이 ReDex다.


https://github.com/facebook/redex


Docker로 Ubuntu 14.04 container를  만들고, 위 링크에 있는 가이드 문서대로 따라 했지만 문제가 발생했다.

몇 가지 빠진 부분이 있어 내가 했었던 작업의 기록을 남겨 둔다.

( 이 과정을 Dockerfile로 만들면 좋겠지만, 귀찮아서 통과 )



1. Ubuntu 14.04 로 Docker Container 만들기 

docker run -i -t --name ubuntu14.04_redex ubuntu:14.04 /bin/bash



2. 디렉토리 이동 ( root의 home directory에 모든것을 설치할 예정 )

cd ~



3. redex 가이드 문서에 Ubuntu 14.04 부분을 실행하기 전에 아래의 것을 먼저 실행해야 한다.

redex 설치 및 사용할 때, 그리고 인터넷에서 android sdk 를 다운로드 받을 때 필요하다.

apt-get update

apt-get install curl

apt-get install unzip

apt-get install openjdk-7-jdk

apt-get install wget



4. android sdk를 먼저 설치해야 한다. ( 아래 과정 중 test 과정에서 java를 컴파일 하고, 이를 dx로 묶는 과정이 있다. )

wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz 

tar zxvf android-sdk_r24.4.1-linux.tgz 

cd android-sdk-linux

tools/android update sdk --no-ui

( 이후 라이센스에 동의하라고 하면 y를 눌러 주면 된다. 혹시 화면이 멈추면 엔터를 한번 쳐 주면 라이센스 동의 문구가 나온다. )

tools/android update sdk -u -a -t 4,5

( 상황에 따라서 뒤에 있는 숫자인 4,5 를 바꿔야 하는 경우도 있다. 숫자에 맞는 version을 다운받게 된다. 목록을 알고 싶다면 tools/android list sdk -a -u 를 쳐서 번호를 확인하도록 하자. 여기서는 23.0.3을 사용한다. 24는 java version 8이 필요하기 때문에 openjdk 7으로 실행할 수 없다. )



5. ~/.bashrc 파일의 제일 아래쪽에 아래 내용을 추가하도록 하자. ( vi ~/.bashrc ) 

ANDROID_SDK=/root/android-sdk-linux/

PATH=$PATH:/root/android-sdk-linux/build-tools/23.0.3/:



6. 이후 bashrc 파일에 넣어 둔 환경을 현재 터미널에도 적용하기 위해 source 명령으로 상태를 업데이트 해 준다.

source ~/.bashrc



7. redex 가이드 문서에 따라서 각종 tool 다운로드 및 설치 ( 이하의 과정은 달라졌을 수도 있으니, 공식 홈페이지에 가이드 문서를 반드시 다시 확인하자. )

sudo apt-get install \
    g++ \
    automake \
    autoconf \
    autoconf-archive \
    libtool \
    libboost-all-dev \
    libevent-dev \
    libdouble-conversion-dev \
    libgoogle-glog-dev \
    libgflags-dev \
    liblz4-dev \
    liblzma-dev \
    libsnappy-dev \
    make \
    zlib1g-dev \
    binutils-dev \
    libjemalloc-dev \
    libssl-dev \
    libiberty-dev \
    libjsoncpp-dev



8. redex 가이드 문서에 따라서 다운로드, 빌드, 설치

git clone https://github.com/facebook/redex.git

cd redex

autoreconf -ivf && ./configure && make

sudo make install



9. 설치가 다 되었으면 잘 동작하는지 체크 한다.

./test/setup.sh

cd test

make check

근데 여기서 에러가 난다.. 이유는 모르겠음.. ;; 요건 무시해도 된다.



10. 이후 redex 명령을 이용해서 apk를 redex 시킬 수 있다.

( 만약 zipalign 문제가 생기면, 위에 설명한 환경 설정이 제대로 안 된 것이다. ./bashrc 파일에 ANDROID_SDK를 확인해 보도록 하자. )

redex a.apk -o a.redex.apk




그 결과 다음과 같은 결과를 얻었다.

c.apk -> c.redex.apk : 44.8M -> 44.5M

s.apk -> s.redex.apk : 39.8M -> 39.4M

w.apk -> w.redex.apk : 38.4M -> 38.1M

t.apk -> t.redex.apk : 33.8M -> 33.4M

원본 apk는 이미 proguard를 거친 뒤였음에도 약 250kb ~ 400kb 정도 용량이 줄어 들었다.

( 실제로 동작하는지는 확인하지 않았다 ;; ㅎㅎ )


저작자 표시 비영리 변경 금지
신고
  1. 발자국 2016.10.21 00:07 신고

    빠른나이는 아니지만 뒤늦게 프로그래밍에 재미를 찾아 공부하고있는 백수입니다.
    검색중에 들렸습니다.
    2003년부터 올해까지 꾸준히 공부하시고 포스팅 하신 흔적보고 감동받아 이렇게 덧글 작성해봅니다.
    존경합니다!!

    • 2016.12.20 12:01 신고

      오랫동안 관리되지 않던 블로그라 부끄럽습니다. 즐거운 나날들 보내세요~

안드로이드의 타겟은 모바일 환경이기 때문에, 프로그램을 만들거나 실행할때 몇몇 제약이 있다.

이야기 할 내용은 왠만해서는 접할 수 없는 안드로이드 프로그램의 메소드 갯수 제한에 관한 이야기다.

안드로이드 프로그램을 작성하기 위한 순서를 보자.

1. "자바언어"로 프로그램을 작성한다.
2. "자바 컴파일러"로 JavaVM의 Bytecode를 생성해 낸다. 
3. JavaVM의 Bytecode를 DalvikVM의 Bytecode로 변경하면서
4. .dex 파일을 만들어 낸다.
5. .dex 파일과 xml 파일과 각종 이미지들을 zip포맷으로 묶고, 확장자를 apk로 바꾼다.
( 5번 항목은 더 복잡한 내용이 있지만 여기서는 굳이 말할 필요가 없어서 대충. ㅋ )


안드로이드에서는 많은 class 및 jar들도 모두 한꺼번에 묶어서 .dex 파일로 묶어 주게 되어 있는데, 안드로이드 프로그램 배포 파일인  .apk 파일을  .zip 으로 확장자를 변경한 뒤에 압축을 풀어 보면 classes.dex 파일을 볼 수 있는데, 이것이 바로 DalvikVM의 Bytecode가 들어 있는 .dex 파일이다. 모든 class 파일과 jar 파일을 단 1개의 .dex 파일안에 다 넣게 되어 있다. ( 틀렸다면 제보해 주세요. )

이때, 발생 할 수 있는 문제가 바로 메소드 갯수 제한이다.

큰 프로그램을 작성하다 보면, 혹은 많은 양의 라이브러리를 가져다 쓰다 보면 당연히 프로그램의 덩치가 커지게 될 것이다. 이때 빌드를 돌리게 되면 위의  순서에서 2번 class파일이나 jar파일을 만드는데는 문제가 없으나, 3번 과정에서 dex 파일을 만들때 "format == null" 따위의 도저히 예측 할 수 없는 에러를 발생 시키고 죽어 버린다.

모바일프로그램이라 큰 프로그램을 짜지 않을것이라고 생각했는지, 아니면 가난한 리소스때문에 일부러 그렇게 설계했는지 몰라도 dex 파일에는 64k(6.5만개) 이상의  메소드가 정의 될 수 없도록 되어 있다. dex 파일 포맷에서 method index를 저장하는 공간이 16bit로 되어 있으므로 당연히 6.5만개 이상의 메소드를 만들게 되면, method index table의 공간이 부족하여 dex 파일을 못 만드는 것이다.

혹시나 6.5만개 이상의 메소드를 사용하는 프로그램을 만들게 되면 거기에 대한 대비책을 만들어야 한다.

1. 안드로이드에서 기본적으로 제공하는 라이브러리를 쓰자.
2. 프로그램 빌드시 실제로 사용되지 않는 라이브러리들을 제거 하자.
3. 필요 없는 메소드들을 생성하지 말자.
4. 그렇게 큰 프로그램은 모바일 프로그램으로 만들 생각을 하지 말자.


하지만, 프로그램에서 필요 없는 메소드들이 어디 있으랴? 좀 더 구조적이고 아름다운 코드를 짜기 위해서 메소드 갯수가 늘어 나는것은 어쩔 수 없는 일이다. 그러므로 좀 더 우아한 방법을 찾아야 하고, 그 방법이 바로 바로 ProGuard 이다.

ProGuard는 Java Bytecode를 난독화, 사용하지 않는 코드 제거, 최적화 등을 수행해 주는 오픈소스 툴이다. 구글 안드로이드측에서도  2.2 인가 부터 이 놈을 추천하고 있다. 해당 툴을 사용하여 최적화 및 사용하지 않는 코드를 제거하게 되면, 메소드 갯수가 많이 줄어 든다. 단, 최적화를 거쳤다면 메소드가 사라지기도 하고, com.ggaman.A.java 파일의 내용 및 메소드가 com.ggaman.B.java 으로 이동되어 있는 경우도 있다. 
그러므로 실제 출시된 제품의 디버깅이 힘든 점이 존재한다. 물론 옮겨진 위치나 변경된 정보를 로그로 남겨주지만 그거 비교하는 것도 얼마나 짜증나는 일이겠는가? 또한 ProGuard 역시 사람이 많든 프로그램이라 버그가 있어, 제대로 빌드를 만들어 주지 못하거나, 빌드는 되나 실행시 제대로 수행되지 않는 경우도 있다. 

하지만 6.5만개 이상의 메소드를 사용할 수 밖에 없는 경우에는 어쩔 수 없이 선택해야만 한다. 

ProGuard에 대한 설명을 하기 위해서 글을 적은것이 아니기 때문에  ProGuard에 관련된 더 자세한 사항은 아래 링크를 이용해 주시라.

구글의 ProGuard 검색 결과
http://www.google.co.kr/#q=proguard&newwindow=1



또 다른 방법도 있다. 문제 상황에 대해서 한번 더 생각해 보면 프로그램의 덩치가 크기 때문에 dex 파일을 만들때 메소드 갯수가 많아서 dex 파일을 못 만들어 내는 것이다. 그렇다면 dex 파일을 여러개 만들면 안될까?

몇 일 전 안드로이드 개발자 블로그에 이 문제를 해결 할 만한 방법이 올라 왔다.

dex 파일을 쪼개서 만들고, Custom Class Loader를 이용해서 dex 파일에 있는  class를 사용하는 방법이다. Android에서는 dex 파일을 읽기 위해서 DexClassLoader를 제공해 주고 있다. 이를 이용해서 파일로 저장되어 있는 dex파일세서 class를 읽어와서 사용할 수 있음을 보여준 예제이다.

다만 해당 방법은 항상 dex파일을 로컬 스토리지에 두고 사용해야 하므로 최초 수행시 dex파일을 로컬 스토리지로 복사해야 하는 점, 그리고 자바의 리플렉션을 이용해서 Class를 찾고 객체는 생성해주어야 하기 때문에 동작이 느린 이슈가 있을 수 있다. 

하지만 로컬스토리지 복사나 동작이 느린것것이 프로그램이 아예 빌드가 되지 않는 것 보다는 훨씬 더 좋은 선택으로 생각된다.

해당 블로그 글은 아래의 링크를 클릭해서 따라 가면 된다.



오랜만에 포스팅 끝. ㅋ.
(검색이 잘 되도록 제목 수정. ㅋ )
저작자 표시 비영리 변경 금지
신고
  1. 닉쑤 2011.08.03 03:23 신고

    저도 안드로이드 폰 씁니다 ㅎㅎㅎ

    하지만 개발 내용은 알고싶지 않은..ㅎㄷㄷ;

백만년만에 글을 쓰게 되었는데, 글이 책리뷰라서 좀 안타깝긴하다.
네이버 카페 코드인(http://codein.co.kr)에서 책 리뷰를 해 줄 리뷰어를 모집했고, 그래서 얼른 냉큼 후딱 신청해서 당첨이 되었다.

리뷰하려고 하는 책은 "안드로이드 프로그래밍 정복 1권" 이다.

안드로이드프로그래밍정복.1(개정판)SDK2.3진저브레드를적용한안드?
카테고리 미분류
지은이 김상형 (한빛미디어, 2011년)
상세보기


회사에서 하는 일이 Office 프로그램개발인데, Java를 이용해서 만들어야 했으므로 Java swing을 기준으로 개발을 해 왔었다. 하지만 시대의 급변에 따라서 모바일 환경이 중요해졌고, 안드로이드쪽을 공부해야 했었다. 그 때 마침 리뷰어를 모집하는 글이 눈에 띈 것이다.


보통의 프로그래밍 개발 관련 자료들은 인터넷에 널려 있다. 이러한것들이 책으로 출간되는 이유는 무엇일까? 개인적으로 몇가지는 꼽자면 아래와 같다.

1.
첫번째 이유는 튜토리얼은 영어로 되어 있다는 것이다. 아무리 영어를 잘 한다고해도 한글로 되어 있는 문서보다 영어를 읽는데는 어려움이 따른다. 물론 영어 단어의 의미를 정확하게 파악하기도 힘들다.

2.
두번째 이유는 정제되어 있는 내용을 쉽게 읽을 수 있다는 것이다. 인터넷에 떠다니는 내용들은 정확한 내용이 아닐 수도 있고, 아예 잘못된 내용들이 맞는것처럼 돌아 다니는 경우도 있다. 물론 경험적인 측면에서 내려진 답들은 책에 나오지는 않을 수 있지만, "경험적"이라는 의미가 "정확한"이라는 의미가 되지 않는것은 확실히다.

3.
세번째 이유는 좀 더 읽기 쉽다는 것이다. 아무리 좋은 내용이라도 모니터로 보는것과 종이로 보는것이 눈의 피로도에서도 다를 것이다. 그리고 책을 한장 한장 넘겨가면서 읽는것, 그리고 몇번씩 줄을 그어가면서 읽는것, 중요한 내용을 표시하기 위해서 책의 한쪽 끝을 접어 두는것 등의 아날로그적 감성도 한 몫한다.

물론 다른 의견을 가지고 있는 사람도 있으리라.



이전에도 개인적인 궁금함으로 몇권을 안드로이드 관련 책을 따로 구매해서 읽었는데, 그리 만족스럽지는 않았다. 인터넷에 있는 튜토리얼 보다도 못한 책들도 읽었던 것으로 기억한다. 차라리 영어로 되어 있는 인터넷 사이트를 보는게 더 편했을법한 책들도 읽어 보았다.

그런 면에서는 지금 리뷰를 하는 책은 이제까지 읽었던 책 중에서는 제일 좋다고 생각한다. 원래 출간 될 때에는 한권으로 되어 있는 책이었는데, Android SDK 2.3이 나오고 책의 내용도 더 보강을 해서 1권과 2권으로 나누어서 총 2권으로 다시 출간 되었다.



1권은 개발환경 설정부터 Android 개발에 관련된 전반적인 내용이 나온다.

이클립스 설치부터 ADT, DDMS 사용법까지 개발환경을 스크린 샷과 함께 제공해 준다. 현재 Android SDK 3.0이 나오지 않은 상태에서는 책에 있는데로 하면 큰 무리는 없을 듯 하나, 환경 설치등은 인터넷에서 찾아서 최신환경에 맞추는것이 좋아 보인다.

그리고 안드로이드의 기본인 액티비티, 레이아웃, 뷰, 메뉴 관리, 리소스 관리 등이 나온다. 이는 안드로이드에서 기본이 되는 내용이므로 Android를 처음 접하시는 분들은 반드시 읽어보고 알아야 하는 내용이다. 원래 기본기가 중요한거다.


2권에서는 고급스러운 주제들이 나온다.

실무에서 사용하기 좋은 정보들은 2권에 있다. 1권에 있는 내용들은 기초를 다루고 있기 때문에 자바에 경력이 충분하고 본인이 프로그래밍적인 센스가 있다고 생각하는 사람이라면, 기본기는 인터넷으로 튜토리얼을 찾아서 읽고 2권을 구매하여 읽는것이 도움이 될 듯하다.

2권에서는 렌더링, 애니메이션, 네트워크, 미디어 처리에 대해서 나오며, Hello World 프로그램만 짜고 싶지 않다면 2권을 반드시 읽어 보는것이 좋을 듯 하다.



처음에는 이 책을 보고 인터넷에서 떠돌아 다니면서 보았던 안드로이드 관련 정보들을 머릿속에서 새롭게 정리하다는 생각으로 읽어 보았다. 1권에서는 안드로이드 기본에 대해서 잘 나와 있기 때문에 도움이 되었다. 그리고 "이제 실무에 쓸 수 있는 내용을 읽어 볼까~"했는데 정작 고급주제들은 2권에 있다고 한다.

처음 책을 받았을때는 "정복"시리즈답게 한권에 모두 있을 줄 알았는데, 알고보니 내가 리뷰를 하게 된 책은 1권이었던 것이다. -_- 책을 다 읽고 나서 책표지에 있는 "1" 이라는 숫자를 발견하다니 ;;;


실무에서 사용할 고급스러운 주제는 2권에 있으니 책을 구매하실 때는 이러한 점에 유의해야 한다. 처음부터 탄탄한 기초를 쌓고 싶다면 1권부터 사서 읽으시고, 이미 기본적인 내용을 알고 있으시다면 2권부터 시작해도 큰 무리는 없을 듯 하다.

다음 주말즈음에는 2권을 구매하여 읽어 볼 생각이다. 고급 주제중에 일부는 인터넷에서 자료를 찾기 힘든 내용도 있다. File이나 CP 같은 경우에는 인터넷에서 자료를 좀 찾을 수 있었지만, 서페이스뷰 같은 경우에는 쉽게 찾기 힘든 분야이기도하고, 잘 설명 된것도 못 보았다. ( 잘 설명된 "한글"페이지가 있다면 알려..굽신굽신..)


여하튼 1권만 읽었으니 1권만 평가를 한다면, 이제까지 읽어 보았던 안드로이드 관련 책 중에는 제일 잘 만든 책임은 확실하다.
저작자 표시 비영리 변경 금지
신고
  1. 닉쑤 2011.04.03 05:52 신고

    리뷰 솔직담백하게 잘 쓰시는데요? ㅋ

    별일 없으시죠? ^^

    아, 저 4월 20일날 한국가요. 움하하!

    • Chan 2011.04.03 21:17 신고

      오~ 한국에? 좋은 소식 가지고 오길 빌께. ㅎㅎ

+ Recent posts