ええ、流行っているやつです。
参考にしたサイトはこちら。
- [HOWTO]More smooth scroll & volume step increase for MOST android phones[Poweramp OK]
- 非deodex なICS でセルスタンバイ対策
- Xperia@Custom
- ドコモMVNOデータSIMの不具合対策パッチ当てのつづき – モバイルをバックパックにつめこんで:
寝床でRazikoで録った音源なんかを聞いてるとうるさいなーと思っていたので試してみました。
手順はXDAのとおりなんだけど、この手のカスタマイズは端末が変わっても何度もやるので自分用にメモです。いちいち英語読むの面倒だし。
事前に必要なのは
- カスタムリカバリが入っていること
- busyboxが入っていること。
- 非deodexedな環境
でしょうか。バックアップを取る上でも、また署名をする時にも必要になります。
1.framework.odexのデコンパイル
デコンパイルに必要なものは、
にあるので省略。手抜き。
framework.odexをbaksmali.jarを使ってデコンパイルします。
java -jar baksmali.jar -d system/framework -x framework.odex -o framework
これで「framework」フォルダにodexが展開されます。
2.ファイルの編集
(1)ボリューム30段階
まずはボリューム30段階にするための編集。
framework/android/mediaディレクトリへ移動し、「AudioService.smali」をUTF-8が扱えるエディタで開く。
ここではサクラエディタを使用。
「MAX_STREAM_VOLUME」のキーワードで検索。
いくつか検索結果が上がってくるが、その行の先頭が「iput-object」で始まっているかを確認。
RAZR HDの場合は457行目。
その行の上に「fill-array-data」から始まる行を見る。
その行の後半に「array_」何とかってあるのでそれでまたファイル内検索をかける。
RAZR HDの場合、455行目。「array_24e」なのでコレを使って検索。
ここを編集する。
:array_24e .array-data 0x4 0xft 0x0t 0x0t 0x0t(←STREAM_VOICE_CALL:受話音量?) 0xft 0x0t 0x0t 0x0t(←STREAM_SYSTEM:システムのデフォルト?) 0xft 0x0t 0x0t 0x0t(←STREAM_RING:着信音?) 0xft 0x0t 0x0t 0x0t(←STREAM_MUSIC:音楽とか) 0xft 0x0t 0x0t 0x0t(←STREAM_ALARM:見たまんま) 0xft 0x0t 0x0t 0x0t(←STREAM_NOTIFICATION:メッセージとかの着信音?) 0xft 0x0t 0x0t 0x0t(←STREAM_BLUETOOTH_SCO:bluetoothを使った時) 0xft 0x0t 0x0t 0x0t(←STREAM_SYSTEM_ENFORCED:システム全体?) 0xft 0x0t 0x0t 0x0t(←STREAM_DTMF:??) 0xft 0x0t 0x0t 0x0t(←STREAM_TTS:??) 0xft 0x0t 0x0t 0x0t(←STREAM_FM:FMラジオ) .end array-data
「0xft」から始まる行が沢山あるけど、これは使用する端末によって値が全く違う。
とりあえずRAZR HDは上記のとおり。
右側にそれぞれの設定項目を書いておきましたが、これはCyanogenmod7のソースに書いてあったそうです)
今回は音楽を聞いた時とbluetoothのボリューム増減を30段階へと変更させるために設定します。
上記で言えば、
0xft 0x0t 0x0t 0x0t(←STREAM_MUSIC:音楽とか) ・ 0xft 0x0t 0x0t 0x0t(←STREAM_BLUETOOTH_SCO:bluetoothを使った時)
この2箇所。
このうち先頭の「0xft」の「f」を「1e」に書き換えます。
この「f」は16進数で言うところの「15」を意味します。
ということは「1e」なら16進数で言うところの「30」となります。
Windows7の電卓を使うとそれを見ることができます。
ということです。
まぁ理屈はいいですね。
で書き換えた結果。
:array_24e .array-data 0x4 0xft 0x0t 0x0t 0x0t 0xft 0x0t 0x0t 0x0t 0xft 0x0t 0x0t 0x0t 0x1et 0x0t 0x0t 0x0t 0xft 0x0t 0x0t 0x0t 0xft 0x0t 0x0t 0x0t 0x1et 0x0t 0x0t 0x0t 0xft 0x0t 0x0t 0x0t 0xft 0x0t 0x0t 0x0t 0xft 0x0t 0x0t 0x0t 0xft 0x0t 0x0t 0x0t .end array-data
これだけ。
検索からここまで長いですけど、「0xft 0x0t 0x0t 0x0t」で最初っから検索しちゃえばいいんじゃないの?というのが感想です・・。
(2)スクロールキャッシュの無効化
iPhoneの特許絡み?でandroid2.3.x GingerBreadで使えていた機能がandroid4.0.x ICS以降使えなくなったとか。
このスクロールキャッシュを無効にするとGmailアプリとかヌルサクになるらしいですが、正直違いがよく分かりません。
「framework/android/widget」ディレクトリ内の「AbsListView.smali」をエディタで開きます。
またまた検索。
キーワードは「createScrollingCache()V」で。
似たようなのがいっぱい出てきますが、すぐ次の行に「.registers」やそのさらに次の行あたりに「const/4 v1, 0x1」(端末によって数値は違うみたい)があること。
RAZR HDなら1546行目。
.method private createScrollingCache()V .registers 3 .prologue const/4 v1, 0x1
この「const/4 vl, 0x1」の「0x1」を「0x0」へ書き換える。
次は「setScrollingCacheEnabled」で検索。
また似たようなのがいっぱい出てきますが、こんな感じのところ。
RAZR HDなら2072行目。
.line 807 invoke-virtual {p0, v1}, Landroid/widget/AbsListView;->setScrollingCacheEnabled(Z)V
ここの「{p0, V1}」のところを「{p0, V2}」へと書き換える。
こんな感じ。
最後。もう疲れた。
また「setScrollingCacheEnabled」で検索。
こんな感じのところ。
RAZR HDなら13980行目。
ここの
.method public setScrollingCacheEnabled(Z)V .registers 3 .parameter "enabled"
「.parameter “enabled“」を「.parameter “disable“」
に書き換えます。
説明だと「disable」じゃなくてもなんでもいいそうで、「no」でもいいとのこと。あ
ホントかいっ。
以上でファイルの書き換えは終わりー。
ちなみにセルスタンバイ対策の修正もやってみようかと思いましたが
GsmServiceStateTracker.smali
がない・・・。ので終わり。
3.classes.dexへコンパイル
androidが読めるように変換します。
java -jar smali.jar framework/ -o classes.dex
これでエラーがなければ作業フォルダ内に「classes.dex」が出来上がりますね。
4.framework.jarのdeodex化
7zipで解凍することなく、ただ開いて先ほどの「classes.ded」を放り込みます。
?5.framework.jarの署名
署名がないとdeodexedなframework.jarを/system/frameworkに放り込んだところで機能しないようです。
署名方法はいくつかあるそうなのですが、一つは「dexopt-wrapper」を使用する方法。
これが一番簡単で分かりやすいのかもしれません。
ただ、この方法はintel x86 CPUを積んだRAZR iだと失敗します。
RAZR HDなら成功すると思います。
なのでこの方法はやりません。
を参考にさせていただきました。
ここからubuntuで作業しましたがadbコマンドはwindowsでも関係ないですね。
まずはPCと端末をadb接続します。
接続状況の確認。
$ adb devices List of devices attached TA240007G6 device
次に端末へファイルを送り込みます。
送り込んだ先で「framework-mod.jar」と名前を変更しています。
$ adb push framework.jar /sdcard/framework-mod.jar 3492 KB/s (3396524 bytes in 0.949s)
android内に入ってSU権限をゲットします。
$ adb shell $ su #
/system/ディレクトリをマウントし、/system/framework/へframework-mod.jarをコピーします。
# mount -o remount,rw /dev/block/mtdblock0 /system # cp /sdcard/framework-mod.jar /system/framework/
/system/framework/ディレクトリへ移動後、framework-mod.jarのパーミッションを整えます。
# cd /system/framework/ # chmod 644 framework-mod.jar # chown root framework-mod.jar
オリジナルファイルのバックアップを取ります。
# mv framework.odex framework.odex.bak # cp framework.jar framework.jar.bak
さあもう元に戻れません。
framework-mod.jarをリネームしてオリジナルファイルに上書きします。
# mv framework-mod.jar framework.jar # reboot
再起動してすぐにリカバリモードへ入り、dalvik-cacheをwipe
dalvik-cacheを消せたらそのまま再起動します。
おそらく無事に起動することはなく無限ループになるでしょう。
無事に起動しちゃったら?・・・知りませんw
しばらくモトローラロゴがブルっている画像をお楽しみください。
そろそろ焦ってきたら、PCと端末をadb接続してみます。
だいたい5分くらい待てばいいのかな。
$ adb devices List of devices attached TA240007G6 device
認識したのを確認したらreboot。
$ adb reboot
すかさず、リカバリモードへ。
ここからはRAZR HDのカスタムリカバリTWRP上での操作ですが多分、CWMでも同じような感じで出来ると思います。
まずは「Mount」を選択して、/system/の横にレ点が入っているのを確認。
non-touchなCWMでも確かそんな項目があったような気がします。
その後、またadb接続します。
接続状況を確認。
$ adb devices List of devices attached 0123456789ABCDEF recovery
まずはandroid内に入ってdalvik-cache内にあるframework.jarのclasses.dexを/system/framework/へ「framework.odex」とリネームして移動します。
$ adb shell # mv /data/dalvik-cache/system@framework@framework.jar@classes.dex /system/framework/framework.odex
ddコマンドで最初にバックアップを取っておいたオリジナルのframework.odex.bakから署名部分を新しいframework.odexへ移します。
busyboxのddを使わないとダメみたい。理屈は分からないw
# busybox dd if=/system/framework/framework.odex.bak of=/system/framework/framework.odex bs=1 count=20 skip=52 seek=52 conv=notrunc
今あるframwork.jarはdeodex化してあるためそのままシステムが起動するとodexファイルを作ってしまい、せっかく修正したframework.odexを台無しにしてしまいます。
なので非deodexなオリジナルのframework.jar.bakを元に戻します。
# mv /system/framework/framework.jar.bak /system/framework/framework.jar
再起動。
# sync # reboot
メディア音量が「3/30」になっているので30段階ですね。
スクロールキャッシュは?分かりません。
【追記】
RAZR i XT890で試してみましたけど、dalvik-cacheが出来上がりませんでした。
まさに無限ループ。
Intel CPUは訳わからん。
コメント