http://matcl.com/s/?document_srl=1302873
위 글에 결과물을 올려놓았으니(6메뉴가 아니라 7메뉴지만요) 이걸로 작업하시면 되겠습니다.
framework-res.apk만 수정하시고 android.policy.jar이랑 framework.jar과 함께 배포하시면 됩니다.
먼저 이 글은 http://forum.xda-developers.com/showthread.php?t=811532 요 앞의 링크 내용을 참조하여 만들었음을 알립니다.
먼저.. framework-res.apk를 수정하셔야합니다.
수정하실때는 apk manager이나 apktool에서 Decompile을 사용하시면 되구요, 굳이 제가 하는걸 그대로 따라하실 필요는 없고 테마 제작자분께서평소에 테마 제작하실때랑 똑같은 방식으로 하시면 됩니다.
res/values/strings.xml 마지막에 (보단 앞에) 아래 문구를 추가합니다.
그리고 res/values-ko/strings.xml 마지막에 아래 문구를 추가합니다.(위와 똑같은 방식으로)
눈치채셨겠지만 이 부분은 위 영어의 한글번역입니다.
이제 strings는 추가가 완료되었고.. 메뉴 앞에 나오는 아이콘을 넣을 차례입니다.
res/drawable-hdpi 폴더에 powermenu.zip <-- 요걸 받으셔서 압축 푸신 후 이미지를 넣어주세요.(테마 제작자분께서 직접 만드신 이미지를 넣으셔도 상관 없습니다. 크기는 대략 48*48에서 72*72 사이쯤이면 적당할듯합니다....)
이제 strings랑 drawable은 추가가 완료되었으니 베터리 1%단위 만드실때 정말 힘들고 지긋지긋하셨을거같은 public.xml을 고칠 차례입니다(-_-;;)
res/values/public.xml을 여셔서 아래 여섯줄을 추가하시고 베터리 수정하실때처럼 id="0x010?????" 부분을 적당히 수정해주세요.
이건 그냥 지금은 컴파일하신 후에 unsignedframework-res.apk를 다시 디컴파일해서 res/value/public.xml 열어서 저 뒤에 id="" 부분만 확인해두시면 됩니다. (해모수님의 제보 감사합니다)
이제 framework-res.apk를 다시 컴파일하신 후 unsignedframework-res.apk에서 resource.arsc등을 포함한 수정된 파일들을 원래 framework-res.apk로 옮기세요.
이걸로 framework-res.apk부분은 완료되었습니다.
이번엔 프레임워크의 .jar파일들을 수정해보죠.
갤스 내의 /system/framework/ 폴더 내의 android.policy.jar과 framework.jar을 꺼내줍니다.
bakssmmaallii.zip<---요 파일을 받으셔서 한가한 폴더에 압축을 풀어주고, 거기에 android.policy.jar과 framework.jar을 같이 넣어주세요.
그리고 cmd를 켜서 그 폴더로 이동하신 후 다음 두줄의 명령어를 입력하세요.(JRE는 이미 깔려있으실거라 믿어요 ㅠ_ㅠ)
java -jar baksmali.jar -x android.policy.jar -o android.policy
java -jar baksmali.jar -x framework.jar -o framework
이렇게 하면 그 한가한 폴더에 framework이랑 android.policy폴더가 생깁니다.(Khiz님의 제보로 명령어 수정했습니다 ㅠㅠ)
framework폴더를 들어가봅니다.
comandroidinternalapp폴더까지 가보시면 ShutdownThread.smali파일이 있죠?
그걸 워드패드나 Acroedit으로 열어줍니다. (메모장은 비추..)
맨위에서 좀 내려오면 # static fields 이런게 있고 아래로 쭉 목록이 있는게 보이실겁니다.
그 목록 맨 끝에 (그러니까 # instance fields 시작하기 전에) 다음 한줄을 추가합니다.
.field public static mRebootMenu:I
이제 " invoke-static {}, Landroid/os/Power;->shutdown()V " 이걸 검색하셔서 그 위에다가 다음 줄들을 추가하세요.
sget v1, Lcom/android/internal/app/ShutdownThread;->mRebootMenu:I
const/4 v2, 0x1
if-eq v1, v2, :reboot
const/4 v2, 0x2
if-eq v1, v2, :rebootRecovery
const/4 v2, 0x3
if-eq v1, v2, :rebootDownload
그리고 " invoke-static {}, Landroid/os/Power;->shutdown()V " 검색하셨던거 아래 보면 " return-void "가 보일겁니다. 바로 아래요. 그 return-void 다음줄부터 아래의 내용을 추가해주세요.
:reboot
const-string v4, "now"
invoke-static {v4}, Landroid/os/Power;->reboot(Ljava/lang/String;)V
return-void
:rebootRecovery
const-string v4, "recovery"
invoke-static {v4}, Landroid/os/Power;->reboot(Ljava/lang/String;)V
return-void
:rebootDownload
const-string v4, "download"
invoke-static {v4}, Landroid/os/Power;->reboot(Ljava/lang/String;)V
return-void
이제 아까 그 cmd창에서 다음 명령어를 입력하세요.
java -jar smali.jar -o classes.dex framework
그럼 조금 있다가 classes.dex 파일이 나옵니다.
WinRAR등으로 framework.jar을 여신 후에 classes.dex을 끌어다 넣으면 됩니다.
여기까지 하시면 framework.jar 수정은 끝난겁니다. 이제 android.policy.jar을 수정해보도록 하죠.
아까 그 한산한 폴더에 android.policy폴더를 들어가봅시다.
쭉~ 폴더가 하나씩밖에 없을테니 계속 들어가서 impl폴더까지 들어갑니다.
거기 보면 GlobalActions$5.smali 파일이 있지요? 그걸 복사해서 붙여넣기.. 붙여넣기.. 붙여넣기.. 이렇게 세번 하면 사본이 세개 나옵니다.
그렇게 나온 사본들의 이름을 각각 GlobalActions$9.smali, GlobalActions$10.smali, GlobalActions$11.smali로 이름을 바꿔줍니다.
이제 GlobalActions.smali파일을 수정해야하니 워드패드나 Acroedit등으로 열어주세요.
" new-array v0, v0, [Lcom/android/internal/policy/impl/GlobalActions$Action; "를 검색하신 후 그 약간 위에 있는 " const/4 v0, 0x3 "에서 0x3을 0x6으로 바꿔주세요.
이제 " new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$5; "를 찾아보시면 그 아래쪽에 aput-object v2, v0, v1 이라는 줄이 나옵니다.
그 다음줄부터 아래 내용을 추가해주세요.
const/4 v1, 0x3
new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$9;
const v3, 0x1080*** # reboot icon resource id
const v4, 0x1040*** # reboot string resource id
invoke-direct {v2, p0, v3, v4}, Lcom/android/internal/policy/impl/GlobalActions$9;->
aput-object v2, v0, v1
const/4 v1, 0x4
new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$10;
const v3, 0x1080*** # recovery icon resource id
const v4, 0x1040*** # recovery string resource id
invoke-direct {v2, p0, v3, v4}, Lcom/android/internal/policy/impl/GlobalActions$10;->
aput-object v2, v0, v1
const/4 v1, 0x5
new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$11;
const v3, 0x1080*** # download icon resource id
const v4, 0x1040*** # download string resource id
invoke-direct {v2, p0, v3, v4}, Lcom/android/internal/policy/impl/GlobalActions$11;->
aput-object v2, v0, v1
이부분 오타 수정했습니다 ㅠㅠㅠㅠㅠ
저기 resource id라고 되있는 부분 앞에 0x10?????에는 아까 public.xml에서 적절하게 넣어줬던 id="0x010?????"부분에 넣어줬던거(id=에서는 0x0으로 시작하지만 뒤의 0은 여기선 생략해도 되는겁니다) 적절하게 집어넣어주세요.
예를들어 아래처럼 넣었다고 하면...(어디까지나 예시입니다. 무조건 이렇게 숫자 적당히 넣으면 framework-res.apk 컴파일할때 오류떠요.)
저기 resource id라고 되있는 부분 앞에 0x10으로 시작하는 숫자 부분은 아까 컴파일해서 나온 unsignedframework-res.apk를 다시 디컴파일하면 res/value/public.xml에 있는 내용중에.. string과 drawable을 잘 보시고 아래같은 부분을 찾아셔서 숫자를 넣어주세요.
예를들자면...
.......
.......
......
.... 이렇게 되있다면 저기 아래 resource id 앞의 숫자 부분에는 이런식으로 넣어주시면 되겠지요.
....
const v3, 0x10805a1 # reboot icon resource id
const v4, 0x10405f1 # reboot string resource id
....
const v3, 0x10805a2 # recovery icon resource id
const v4, 0x10405f2 # recovery string resource id
....
const v3, 0x10805a3 # download icon resource id
const v4, 0x10405f3 # download string resource id
....
대충 아셨으리라 생각하고 다음으로 넘어가서..
아까 GlobalActions$5.smali 사본 세개 만들어놨었잖아요?
그거 여셔서 "GlobalActions$5"를 찾아바꾸기로 전부 사본들 이름에 맞는거로 5를 바꿔줍니다.
그리고.. 각각 파일에서 " invoke-static {v0, v1}, Lcom/android/internal/app/ShutdownThread;->shutdown(Landroid/content/Context;Z)V "를 검색하신 뒤에.. 각각 파일에 맞게 그 앞줄에 다음 내용을 넣어줍니다.
GlobalActions$9.smali의 경우에는 아래처럼..
const/4 v2, 0x1
sput v2, Lcom/android/internal/app/ShutdownThread;->mRebootMenu:I
GlobalActions$10.smali의 경우는 아래처럼..
const/4 v2, 0x2
sput v2, Lcom/android/internal/app/ShutdownThread;->mRebootMenu:I
GlobalActions$11.smali의 경우는 아래처럼요.(숫자만 바뀝니다)
const/4 v2, 0x3
sput v2, Lcom/android/internal/app/ShutdownThread;->mRebootMenu:I
이제 android.policy.jar도 거의 다 되었습니다.
변경 내용을 다 저장하시고 나서 한산한폴더에 열려있던 cmd창으로 돌아가서 다음 명령어를 입력합니다.
java -jar smali.jar -o classes.dex android.policy
그럼 곧 작업이 끝나고 classes.dex파일이 새로 만들어집니다. 이걸 아까 framework.jar에서 했던것처럼 android.policy.jar에 넣어주세요.
이제 수정된 파일 세개(framework-res.apk, android.policy.jar, framework.jar)를 갤스 내의 /system/framework/ 폴더에 집어넣고 재부팅 한번 하면 완성입니다.
이거 하고 나서 재부팅시에 deODEXed 커스텀롬 처음 올렸을때처럼 시간이 좀 걸립니다. 조금 기다리시면 되요.
이제 이 만들어진 테마를 배포하실때는 글 내용에 이 게시물 주소와 저 위의 xda 주소 두개를 같이 밝혀주시면 고맙겠습니다.. 이게 가장 쉽고 가장 중요한 단계(?)이니 꼭 부탁드려요 ㅋㅋㅋㅋ