Hax빙글
12.07.08
조회 수 19068
추천 수 14
댓글 24

이해를 도와드리기위한 사진^^


타블렛PC 쓰시는 분들이시라면
허니컴 소리만 들어도 곡소리를 내며 도망치시겠지만(물론 과장입니다^^),

락스크린 효과만은 허니컴이 가장 이쁜 것 같더군요.(젤리빈도 만만치 않게 이쁩니다~)



*이 강좌는 XDA의 글을 기반으로 작성되었으며, XDA의 글이 java로 이루어진것을 smali로 바꾸어 작성하였습니다.

원문 XDA 링크 : http://forum.xda-developers.com/showthread.php?p=23456320 (evilisto님 게시물)



**XWLPG 펌웨어, KT노트 UF13 펌웨어의 파일을 비교해본 결과, 거의 동일한 것으로 밝혀졌습니다. 그러므로 기기에 따라서 다르게 적는 부분은 array 딱 한부분 외엔 없습니다.



--------------------------준비물---------------------------------------

deodex 하는 방법을 터득(칵이닷 님께서 정말 자세하게 정리를 잘 해두셨습니다. 

방법을 모르신다면, 읽어보고 오세요. 추천 드리는거 잊지 마시구요. http://matcl.com/?c=1/10&uid=112566)

framework2.jar

framework-res.apk

아래에 첨부된 허니컴 리소스(modified는 제가 약간 수정한 버전입니다.)

-----------------------------------------------------------------------





1.framework2.jar 수정



본문에서는 framework.jar 이라고 표기하고 있지만,

사실 아무리 뒤져봐도 MultiWaveView.java 파일은 framework.jar 안에 없습니다.

그래서 이웃동네인 framework2.jar을 분해해봤더니 떡하니 나오더군요!

그러므로, framework2.jar을 deodex하고 baksmali해줍니다.

그 다음, comandroidinternalwidgetmultiwaveview 경로로 가서 MultiWaveView.smali 를 엽니다.



1-1 애니메이션 재생 속도

XDA 원문에서는 CHEVRON_ANIMATION_DURATION:I 와 CHEVRON_INCREMENTAL_DELAY:I 를 수정해주면 된다고 말하지만, 사실 smali는 얘들을 안읽어옵니다. 바꿔도 헛짓이더군요.

알고보니 그냥 const로 즉석에서 정의를 내려서 사용하고 있었어요.

그래서 추적해서 바꿔줍니다.



CHEVRON_INCREMENTAL_DELAY 의 기본값은 160이므로, 0xa0을 찾아봅니다.

3640줄에 mul-int/lit16 v3, v2, 0xa0 라는 내용이 있습니다.

0xa0을 0x320으로 바꿉니다. 즉,  mul-int/lit16 v3, v2, 0x320



CHEVRON_ANIMATION_DURATION 의 기본값은 850이므로, 0x352을 찾아봅니다.

3680줄에 const-wide/16 v12, 0x352 라는 내용이 있습니다.

0x352를 0xfa0으로 바꿉니다. 즉, const-wide/16 v12, 0xfa0



1-2 계산 식 수정

XDA 원문에서는 

{mWaveCenterX + r, mWaveCenterY},  // right 와

{mWaveCenterX + chevronAnimationDistance, mWaveCenterY},  // right 를

{mWaveCenterX, mWaveCenterY},  // right로 고치라고 하고 있습니다.

java는 한 줄인데 smali는 엄청 식이 길어집니다.







iget v14, v0, Lcom/android/internal/widget/multiwaveview/MultiWaveView;->mWaveCenterX:F



add-float/2addr v14, v8



aput v14, v12, v13



const/4 v13, 0x1



move-object/from16 v0, p0

이 부분이 mWaveCenterX + r 의 부분입니다.

add-float/2addr v14, v8 을 삭제합니다.

결과물은






iget v14, v0, Lcom/android/internal/widget/multiwaveview/MultiWaveView;->mWaveCenterX:F



aput v14, v12, v13



const/4 v13, 0x1



move-object/from16 v0, p0

가 됩니다.



그리고






iget v14, v0, Lcom/android/internal/widget/multiwaveview/MultiWaveView;->mWaveCenterX:F



add-float/2addr v14, v1



aput v14, v12, v13



const/4 v13, 0x1



move-object/from16 v0, p0

가 mWaveCenterX + chevronAnimationDistance 의 부분이므로






iget v14, v0, Lcom/android/internal/widget/multiwaveview/MultiWaveView;->mWaveCenterX:F



aput v14, v12, v13



const/4 v13, 0x1



move-object/from16 v0, p0

로 수정해줍니다.



1-3 스타팅 스케일과 엔드 스케일

smali는 dalvik-opcode로 이루어져있는데, 이놈은 float과 integar을 구분을 못합니다.

그냥 무작정 전부 16진수로 표현해버립니다.

그래서 소수는 구하기 힘들기 때문에 그냥 디컴파일용으로 apk를 하나 만들어서 값을 구해오는게 가장 편합니다.



어쨋든, XDA 원문에서는 스타팅 스케일을 0,3으로, 엔드 스케일을 1.1로 바꾸라고 하고 있습니다.

3613번 줄의 const/high16 v9, 0x3f00 를 const v9, 0x3e99999a로,

3618번 줄의 const/high16 v5, 0x4000을 const v5, 0x3f8ccccd로 바꾸시면 됩니다.



1-4 smali이기에 해주어야하는 끔찍한 수정

java의 이부분,





mChevronAnimations.add(Tweener.to(icon, CHEVRON_ANIMATION_DURATION,
                        "ease", mChevronAnimationInterpolator,
                        "delay", delay,
                        "x", new float[] { from[direction][0], to[direction][0] },
                        "y", new float[] { from[direction][1], to[direction][1] },
                        "alpha", new float[] {1.0f, 0.0f},
                        "scaleX", new float[] {startScale, endScale},
                        "scaleY", new float[] {startScale, endScale},
                        "onUpdate", mUpdateListener));

는 smali에서는 따로따로 정의를 해준 다음 array값으로 대체하게 됩니다.

이 array값은 사실 저도 정확히 무슨 용도인지 완전히 파악하지는 못했습니다.

startChevronAnimation 메서드의 맨 아래에 있는 어레이 값 3개가 각각

:array_1bc (XWLPG 펌웨어는 :array_1c0)

는 투명도를 의미하며,

:array_1c4 (XWLPG 펌웨어는 :array_1c8)

는 퍼져나가는 가로 크기.

:array_1cc (XWLPG 펌웨어는 :array_1d0)

는 퍼져나가는 세로 크기를 의미한다는 것만 압니다.



3884번~3900번 줄의 어레이들 중

투명도는 수정해주실 분만 수정해주시고,

(다만, 0x80t는 81 이상의 수치를 적으면 나타나지 않습니다. 0x3ft는 3e이하의 수치를 적으면 나타나지 않습니다.

3번째 값과 4번째 값이 동일할 시에도 나타나지 않습니다. 0x80t, 0x40을 적으면 깜빡거리는 물결이 나타납니다.

0x80t, 0x79를 적으면 처음부터 끝까지 투명도가 변하지 않는 물결이 퍼져나갑니다.)



퍼져나가는 가로크기의 어레이는


        0x0t 0x0t 0x0t 0x3ft

        0x0t 0x0t 0x0t 0x40t

에서


        0x9at 0x99t 0x99t 0x3et

        0xcdt 0xcct 0x8ct 0x3ft

로,

세로 크기의 어레이 역시


        0x0t 0x0t 0x0t 0x3ft

        0x0t 0x0t 0x0t 0x40t

에서


        0x9at 0x99t 0x99t 0x3et

        0xcdt 0xcct 0x8ct 0x3ft

로 바꿔주시면 됩니다.

1번 줄이 물결파의 최소 크기구요, 2번 줄이 최대 크기입니다. 값을 줄였다 늘렸다해보세요. 뭔지 아시게 됩니다.


(덧붙임)


smali의 array 값은 사실


 


const v9, 0x3e99999a 의 0x3e99999a를 반대로 쓴 것이였습니다


그래서 0x9at 0x99t 0x99t 0x3et가 되는거죠...


 


3e 99 99 9a


0x9at 0x99t 0x99t 0x3et


이제 이해가 가시죠?


------------------


여기까지가 smali 수정입니다.

classes.dex로 다시 컴파일해주시고, framework2.jar에 넣으신 다음 odex화 시켜주세요.



2.framework-res.apk 수정

아까 다운받은 Honeycomb.zip 있으시죠?

일단 그걸 drawable-hdpi에 덮어씌워줍니다.

그 다음 reslayoutkeyguard_screen_tab_unlock.xml 을 열어줍니다.






<RelativeLayout android:layout_width="fill_parent" android:layout_height="302.0dip">

<com.android.internal.widget.multiwaveview.MultiWaveView android:orientation="horizontal" android:id="@id/unlock_widget" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentBottom="true" android:targetDescriptions="@array/lockscreen_target_descriptions_with_camera" android:directionDescriptions="@array/lockscreen_direction_descriptions" android:targetDrawables="@array/lockscreen_targets_with_camera" android:handleDrawable="@drawable/ic_lockscreen_handle" android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right" android:waveDrawable="@drawable/ic_lockscreen_outerring" android:outerRadius="@dimen/multiwaveview_target_placement_radius" android:hitRadius="@dimen/multiwaveview_hit_radius" android:vibrationDuration="20" android:snapMargin="@dimen/multiwaveview_snap_margin" android:feedbackCount="3" android:verticalOffset="60.0dip" android:horizontalOffset="0.0dip" />

<TextView android:textAppearance="?textAppearanceMedium" android:textSize="@dimen/keyguard_lockscreen_status_line_font_size" android:textColor="?textColorSecondary" android:ellipsize="marquee" android:gravity="center_horizontal" android:id="@id/carrier" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="12.0dip" android:singleLine="true" android:layout_alignParentBottom="true" />

<TextView android:textAppearance="?textAppearanceMedium" android:ellipsize="marquee" android:id="@id/statement" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12.0dip" android:singleLine="true" android:drawablePadding="4.0dip" android:layout_below="@id/carrier" android:layout_centerHorizontal="true" android:marqueeRepeatLimit="marquee_forever" />

</RelativeLayout>







<RelativeLayout android:layout_width="fill_parent" android:layout_height="370.0dip" android:layout_marginTop="-100.0dip">

<com.android.internal.widget.multiwaveview.MultiWaveView android:orientation="horizontal" android:id="@id/unlock_widget" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentBottom="true" android:targetDescriptions="@array/lockscreen_target_descriptions_with_camera" android:directionDescriptions="@array/lockscreen_direction_descriptions" android:targetDrawables="@array/lockscreen_targets_with_camera" android:handleDrawable="@drawable/ic_lockscreen_handle" android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right" android:waveDrawable="@drawable/ic_lockscreen_outerring" android:outerRadius="@dimen/multiwaveview_target_placement_radius" android:hitRadius="@dimen/multiwaveview_hit_radius" android:vibrationDuration="20" android:snapMargin="@dimen/multiwaveview_snap_margin" android:feedbackCount="5" android:verticalOffset="0.0dip" android:horizontalOffset="0.0dip" />

<TextView android:visibility="gone" android:textAppearance="?textAppearanceMedium" android:textSize="@dimen/keyguard_lockscreen_status_line_font_size" android:textColor="?textColorSecondary" android:ellipsize="marquee" android:gravity="center_horizontal" android:id="@id/carrier" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="72.0dip" android:singleLine="true" android:layout_alignParentBottom="true" />

<TextView android:textAppearance="?textAppearanceMedium" android:ellipsize="marquee" android:id="@id/statement" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12.0dip" android:singleLine="true" android:drawablePadding="4.0dip" android:layout_below="@id/carrier" android:layout_centerHorizontal="true" android:marqueeRepeatLimit="marquee_forever" />

</RelativeLayout>

로 바꿔주게 되면, 락스크린의 락이 위 사진과 같은 위치에 오고, 통신사 문구가 사라집니다.



*주의 : 게시물을 등록하니까 사라지는 단어들이 몇몇개 있습니다. 절대로 복사해서 붙여넣지 마시고 비교하면서 하세요.



여기서 진동을 없에고싶으신 분은

android:vibrationDuration="20" 를 android:vibrationDuration="0"으로,

물결의 갯수를 5개에서 바꾸고 싶으신 분은

android:feedbackCount="5" 안의 5에 원하는 값을 넣어주시면 됩니다.

다 하셨으면,

resvaluesdimens.xml 를 엽니다.

keyguard_lockscreen_outerring_diameter 를 290으로,

multiwaveview_target_placement_radius 을 140으로 바꿔줍니다.

이렇게 하면 물결과 바깥원의 크기가 딱 맞아떨어집니다.

framework-res.apk의 수정이 끝났으니 저장하고 컴파일하신 후 투척하시면 됩니다.





3.보너스



Honeycomb(modified).zip 은 이 효과를 만들 때 쓰입니다.

MutiWaveView.smali에서 X,Y 최소값을 0x3et에서 0x3dt로 수정,

framework-res.apk의 keyguard_screen_tab_unlock.xml에서 android:feedbackCount 를 3으로 수정,

그리고 drawable-hdpi에 zip 안의 내용물을 쏟아부으시면 됩니다.





항상 테마 만들기에 도움을 주시는 AzDesign :F★님 감사드려요!

-끝-



 

Extra Form
첨부
댓글 24
  • ?
    get역시ass
    12.07.08

    언제나 힘써주는 빙긜님 감사합니다 ㅎㅎ

     

  • ?
    ICS도 괜찮긴 한데 역시 진저에서는 허니컴락이 가장 부러웠죠 ㅎㅎ
    개인적으로 젤리빈락도 좀 별로라는 생각이 들지만..
    아무튼 항상 좋은 고급정보 감사합니다~
  • ?
    씽싱
    12.07.08

    Hax빙글님 감사합니다..

    아 framework2.jar에 존재하고 있었군요.. 허니콤애니 적용된 여러 파일을 봤었는데 모두 framework.jar 포함이 된거라 미쳐 거기까진 생각을 못했네요..

     

    노트에도 적용이 됩니다..

  • ?
    에테리스
    12.07.08
    안드로이드 개발자인 저는

    허니컴 소리만 들으면 곡소리와 함께 ㅅㅂ 소리가 절로나옵니다! ㅠ0ㅠ ㅋㅋㅋ
  • ?
    에테리스
    12.07.08
    노트에 한번 시도해보겠습니다. ㅎ.ㅎ 
  • ?
    에테리스
    12.07.08
    1-4 부분은 잘 이해가 안되는데;; 말씀하신 그런 코드도 못찾겠어요 -0-;;

    수정을 꼭 해야하는 부분인가요?;;
  • ?
    에테리스
    12.07.08





    적용은 되었는데요 -0-;; 정중앙에서 물결이 치는게 아니고

    기존  ICS 락처럼 이렇게 한쪽으로 (언락쪽으로) 치우쳐서 물결치는게 정상인가요?
  • ?
    에테리스
    12.07.08
    오홍! 정상적으로 잘 적용되었습니다. ^^

    1-2 식에서 비슷한게 하도 많아서 도중에 다른 걸 바까버린 모양입니다...(_-_)ㅋㅋ

    이쁘네요 감사합니다...+.+ ㅎㅎ
  • ?
    짱언잉
    12.07.08
    갤투도 가능한가요???
  • ?
    Azdesign : F★
    12.07.08
    헉빙글님 이건 강좌교본같아요^^ 저도 빨리 도전해보고싶은데 지금 친가쪽와있어서 에테리스님이 성공하셨으니 노트는검증됐네요^^ 지금 써주신강좌보고 공부해야겠어요^^ 너무감사합니다. 주말 마무리잘하시고 건강관리잘하시고 항상감사합니다^^
  • ?
    내안의달
    12.07.08
    잘 적용했습니다!! 감사합니다 ㅎㅎ
  • ?
    맛클보이
    12.07.08
    아!!
    디자이어hd에 적용해보려고 하는중인데 너무너무 어렵네요.ㅜ
    odex deodex와는 하나도 안친해서;;
    해보려고 하는데 framework.jar 디오덱스하는것부터 막혓네요..ㅋㅋ
  • ?
    phyb
    12.07.08
    감사 댓글이 많이 늦었습니다..^^ xda글만 봐서는 적용이 힘들었는데 알기 쉽게 해석해주시고 설명을 덧붙여주신 덕분에 성공했네요. ^^ 다시 한번 Hax빙글님의 지식에 감탄하고 갑니다..!
  • ?
    보님
    12.07.09
    정말 고생 많이하셨네요 설명까지 자세히 달인주시고ㅎㅎ 좋은정보 감사합니다
  • ?
    놀패
    12.07.10

    감사합니다.

    할까 말까 하다가 빙글님덕분에 오늘 작정하고 시작해서 성공했네요. ^_^

  • ?
    팡다군
    12.07.10
    dpi수정해도 되는건가요?

  • ?
    미라클_S
    12.07.11
    정말 중요한정보 감사합니다
    저도 전에 해볼려고했으나  프레임자만 열씸히 뒤지다 포기했었는데 ^^
  • ?
    pch3928
    12.07.15
    너무 어려우니깐 다 버리고 원문 스레드가서 크롬 이미지만 다운 받아오는...
  • ?
    bestmjh47
    12.10.07
    감사합니다^^
    저기 다른 질문이지만 ICS순정 락은 락 메뉴가 두 개 던데 어떻게 네 개로 하셨나요?
  • ?
    토긔
    12.12.02
    젤리빈도 될까요? [Matcl mobile : LG-F160L F160L10p.1351584851]
  • ?
    프라이스스
    13.02.01
    감사합니다!~
  • ?
    뉴혤
    13.02.19
    좋은방법 감사드려뇨~
  • ?
    갈구냐
    13.02.22
    좋은정보 감사합니다^^
  • ?
    오레가노
    13.03.10
    젤빈은 안되는군요...
댓글 쓰기 권한이 없습니다.
1