'systemui.odex'에 해당되는 글 1

  1. 2012.05.20 UC21의 SystemUI.odex deodex 하기 2

UC21의 SystemUI.odex deodex 하기

이 글은 맛클에 먼저 게시되었습니다.


Error

UC21버전에서 SystemUI.odex 를 deodex 하면 다음과 같은 에러가 발생합니다.

> java -jar baksmali.jar -a 15 -d framework -d app -x SystemUI.odex


Error occured while loading boot class path files. Aborting.

org.jf.dexlib.Code.Analysis.ClassPath$ClassNotFoundException: Could not find interface Lcom/sec/android/app/minimode/manager/MiniModeAppCallback$OnFocusChangedCallback;

at org.jf.dexlib.Code.Analysis.ClassPath$ClassDef.loadAllImplementedInterfaces(ClassPath.java:865)

at org.jf.dexlib.Code.Analysis.ClassPath$ClassDef.(ClassPath.java:690)

at org.jf.dexlib.Code.Analysis.ClassPath.loadClassDef(ClassPath.java:280)

at org.jf.dexlib.Code.Analysis.ClassPath.initClassPath(ClassPath.java:163)

at org.jf.dexlib.Code.Analysis.ClassPath.InitializeClassPathFromOdex(ClassPath.java:110)

at org.jf.baksmali.baksmali.disassembleDexFile(baksmali.java:104)

at org.jf.baksmali.main.main(main.java:293)

Error while loading class Lcom/android/systemui/statusbar/tablet/MiniModeAppsPanel$1; from file SystemUI.odex

Error while loading ClassPath class Lcom/android/systemui/statusbar/tablet/MiniModeAppsPanel$1;


원인

일단 에러 안에 진하게 표시된  Lcom/sec/android/app/minimode/manager/MiniModeAppCallback$OnFocusChangedCallback; 이건데요.

이 문제의 원인은 안드로이드에서 기본으로 지정된 bootclass 외의 파일을 참조하고 있기 때문입니다.



해결

system폴더의 minimode-res.apk와 framework폴더의 minimodejar 파일을 보고 떠올렸습니다.

bootclass 참조에 추가해서 풀면 되겠다 싶었습니다.


UC21 framework 안에 보시면 minimode.jar 파일이 있을 겁니다.

그래서 명령어를 좀 변경해줍니다.


> java -jar baksmali.jar -a 15 -d framework -d app -x SystemUI.odex -c core.jar:framework.jar:ext.jar:services.jar:framework2.jar:core-junit.jar:minimode.jar

(길지만 한 줄 입니다.)


이렇게 하시면 스르륵 풀리는 SystemUI.odex 파일을 보실 수 있습니다.


추가 정보


baksmali의 옵션 설명

-a

안드로이드 API 레벨입니다. smali 1.3.2에서 기본값은 14(4.0.0~4.0.2)입니다.

UC21은 4.0.3 이고, API 레벨은 15입니다. 


-d

bootclasspath 폴더 지정입니다. 기본값은 현재 폴더입니다. 폴더를 지정할 때마다 -d "경로"를 넣으시면 됩니다.

여러개의 폴더를 지정 하기 위해서는 중복으로 -d folder1 -d folder2 처럼 써주시면 됩니다.

-c

bootclasspath 지정입니다. 

기본 bootclasspath는 core.jar, ext,jar, framework.jar, android.policy.jar, services.jar 기본 5개인데, 

명령어를 보시면 아시다시피 minimode.jar 파일을 추가합니다. 

파일들 끼리는 " : "로 구분합니다.

-x

odex 파일을 deodex 하기 위한 옵션입니다. 이 옵션은 odex 파일이 아닐 경우 무시됩니다.


추가 정보는 java -jar baksmali.jar --help로 도움말을 보시거나 http://code.google.com/p/smali/w/list 참조하세요.





smali 다운 받는 곳

smali는 http://code.google.com/p/smali/ 에서 받으시면 됩니다.

아샌에서는 1.3.2 이상을 사용합니다.


deodex 시 추가 오류 모음

그리고, 다음은 SystemUI.odex 를 deodex 하는데, 부족한 bootclasspath 때문에 생기는 에러 정리입니다.

위의 명령문에 적힌대로 순서대로 하면서 얻은 정보이기 때문에 다를 수 있습니다.

core.jar

Ljava/lang/Object

framework.jar

Landroid/renderscript/RenderScript$RSMessageHandler

ext.jar

Lorg/apache/http/impl/conn/ProxySelectorRoutePlanner

services.jar

Landroid/widget/PopupMenu$OnMenuItemClickListener

framework2.jar

Landroid/util/IGateLoggerSettingsService$Stub

core-junit.jar

Ljunit/framework/TestCase

minimode.jar

Lcom/sec/android/app/minimode/manager/MiniModeAppCallback$OnFocusChangedCallback