2011년 7월 29일 금요일

[안드로이드] 메모리 누수 OutOfMemoryError 관련 링크들

가끔씩 마주치게 되는 "OutOfMemoryError : bitmap size exceeds VM budget" 에러는 메모리 누수가 주요 원인입니다. 이와 관련된 링크를 모아봤습니다.

* 액티비티가 멈출 때 비트맵을 재활용(즉 GC)되게 하라

- bitmap 이미지인 경우 recycle() 호출
- onPause에서 수행하는게 좋음
- ((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();

* 이미지를 미리 줄여서 읽어들여라

- BitmapFactory.Options.inSampleSize 활용

* Activity Context에 대한 참조(reference)를 오랫동안 유지하지 말아라

- Drawable.setCallback(null) 사용
- WeakReference를 가진 static 내부 클래스
- 이미지를 static 변수로 처리하지 마라

* 외부(outer) 클래스의 상태에 의존하지 않는 내부(inner) 클래스는 static으로 선언하라
- 내부클래스는 외부 클래스 인스턴스를 크게 만들며 또한 외부클래스 객체가 필요이상으로 오래 살아있게 되어 메모리를 더 차지할 수 있음
- 외부클래스의 상태 필드에 접근하지 않는(즉 외부 객체의 상태에 의존하지 않는) 내부클래스는 static으로 선언

* Attacking memory problems on Android
 
 
 

2011년 7월 14일 목요일

Android ODEX Reverse Engineering(DE-ODEX)

우선 ODEX라는 것이 무엇일까?
http://mylifewithandroid.blogspot.com/2009/02/optimized-dex-files.html
위 블로그에 보면 아주 내용이 잘 정리 되어있다. Optimized dex 로써 성능향상을 위해 Hardware에 최적화되어 만들어진 dex file이다. HTC의 단말기들에 있는 app들을 까보면 apk파일과 odex 파일 두개로 이루어져있다.
(그리고 apk file을 압축을 풀어 확인해보면 classes.dex 파일이 존재 하지 않는다.)

ODEX를 classes.dex로 바꿔보자!
1. http://code.google.com/p/smali/downloads/list 사이트에서 smali.jar와 baksmali.jar를 다운로드한다.
1. Android Phone을 Android SDK가 깔려있는 PC에 연결
2. adb pull system system
3. java -jar baksmali.jar -d system/framework -x temp.odex(odex파일 경로)
(참조: http://code.google.com/p/smali/wiki/DeodexInstructions)
이렇게 하면 out이라는 폴더 안에 smali format으로 odex가 풀려있게 된다.
4. java -jar smali.jar -o classes.dex out
이렇게 해서 우리가 원하는 classes.dex 파일이 생성되었다.

APK파일로...
classes.dex가 없는 apk 파일에 추가하여 다시 압축 한 후 http://leehacks.blogspot.com/2010/05/android-apk-reverse-engineering.html 포스팅에서 언급한 apktool로 다시한번 풀어줬다가 apk로 묶어주면 된다.
물론 위 포스팅에서 언급한대로 sign도 해줘야 install이 가능하다.

http://code.google.com/p/android-apktool/
1. 해당 사이트에서 apktool을 다운로드하고 기재된 install방법으로 설치한다.
2. apk 디코딩
>apktool d -d name.apk out
3. classes.dex 파일을 out 폴더에 copy
4. apk 빌드
>apktool b -d out
5. 위까지 수행하게 되면 out/dist/out.apk 가 생성되며 이 out.apk를 sign해주면 완료.

jarsigner -verbose -keystore E:\Works\Android\Android_2.1_Library\debug.keystore out.apk KEYNAME(ex: yunjinsung_key)