[RAZR HD]ボリューム30段階とスクロールキャッシュ無効化

ええ、流行っているやつです。

Screenshot_from_2012-12-30 18:12:07

参考にしたサイトはこちら。

寝床で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が展開されます。
Screenshot_from_2012-12-30 15:28:21

2.ファイルの編集

(1)ボリューム30段階

まずはボリューム30段階にするための編集。

framework/android/mediaディレクトリへ移動し、「AudioService.smali」をUTF-8が扱えるエディタで開く。
Screenshot_from_2012-12-30 15:31:18
ここではサクラエディタを使用。
「MAX_STREAM_VOLUME」のキーワードで検索。
いくつか検索結果が上がってくるが、その行の先頭が「iput-object」で始まっているかを確認。
RAZR HDの場合は457行目。

その行の上に「fill-array-data」から始まる行を見る。
その行の後半に「array_」何とかってあるのでそれでまたファイル内検索をかける。
RAZR HDの場合、455行目。「array_24e」なのでコレを使って検索。
Screenshot_from_2012-12-30 15:37:13

するとこんな行へ飛ぶ。
RAZR HDだと959行目。
Screenshot_from_2012-12-30 15:40:05

ここを編集する。

    :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の電卓を使うとそれを見ることができます。

10進数で「30」と打ち込んでみる。
Screenshot_from_2012-12-30 15:53:06

16進数のラジオボタンを押してみる。
Screenshot_from_2012-12-30 15:53:16

ということです。
まぁ理屈はいいですね。

で書き換えた結果。

    :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

これだけ。
Screenshot_from_2012-12-30 16:00:50
検索からここまで長いですけど、「0xft 0x0t 0x0t 0x0t」で最初っから検索しちゃえばいいんじゃないの?というのが感想です・・。

(2)スクロールキャッシュの無効化

iPhoneの特許絡み?でandroid2.3.x GingerBreadで使えていた機能がandroid4.0.x ICS以降使えなくなったとか。
このスクロールキャッシュを無効にするとGmailアプリとかヌルサクになるらしいですが、正直違いがよく分かりません。

「framework/android/widget」ディレクトリ内の「AbsListView.smali」をエディタで開きます。
Screenshot_from_2012-12-30 16:06:59

またまた検索。
キーワードは「createScrollingCache()V」で。
似たようなのがいっぱい出てきますが、すぐ次の行に「.registers」やそのさらに次の行あたりに「const/4 v1, 0x1」(端末によって数値は違うみたい)があること。
RAZR HDなら1546行目。
Screenshot_from_2012-12-30 16:10:50

.method private createScrollingCache()V
    .registers 3

    .prologue
    const/4 v1, 0x1

この「const/4 vl, 0x1」の「0x1」を「0x0」へ書き換える。
Screenshot_from_2012-12-30 16:14:30

次は「setScrollingCacheEnabled」で検索。
また似たようなのがいっぱい出てきますが、こんな感じのところ。
Screenshot_from_2012-12-30 16:17:23
RAZR HDなら2072行目。

    .line 807
    invoke-virtual {p0, v1}, Landroid/widget/AbsListView;->setScrollingCacheEnabled(Z)V

ここの「{p0, V1}」のところを「{p0, V2}」へと書き換える。
Screenshot_from_2012-12-30 16:19:49

こんな感じ。

最後。もう疲れた。

また「setScrollingCacheEnabled」で検索。
こんな感じのところ。
Screenshot_from_2012-12-30 16:21:12
RAZR HDなら13980行目。

ここの

.method public setScrollingCacheEnabled(Z)V
    .registers 3
    .parameter "enabled"

「.parameter “enabled“」を「.parameter “disable“」
に書き換えます。
説明だと「disable」じゃなくてもなんでもいいそうで、「no」でもいいとのこと。あ
ホントかいっ。

こうなります。
Screenshot_from_2012-12-30 16:24:23

以上でファイルの書き換えは終わりー。

ちなみにセルスタンバイ対策の修正もやってみようかと思いましたが

GsmServiceStateTracker.smali

がない・・・。ので終わり。

3.classes.dexへコンパイル

androidが読めるように変換します。

java -jar smali.jar framework/ -o classes.dex

これでエラーがなければ作業フォルダ内に「classes.dex」が出来上がりますね。
Screenshot_from_2012-12-30 16:34:14

4.framework.jarのdeodex化

7zipで解凍することなく、ただ開いて先ほどの「classes.ded」を放り込みます。Screenshot_from_2012-12-30 16:36:13

?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
wipe-dalvik-cache

dalvik-cacheを消せたらそのまま再起動します。
おそらく無事に起動することはなく無限ループになるでしょう。
無事に起動しちゃったら?・・・知りませんw

しばらくモトローラロゴがブルっている画像をお楽しみください。
logo-loop-enjoy

そろそろ焦ってきたら、PCと端末をadb接続してみます。
だいたい5分くらい待てばいいのかな。

$ adb devices
List of devices attached 
TA240007G6	device

 

認識したのを確認したらreboot。

$ adb reboot

 

すかさず、リカバリモードへ。

ここからはRAZR HDのカスタムリカバリTWRP上での操作ですが多分、CWMでも同じような感じで出来ると思います。
まずは「Mount」を選択して、/system/の横にレ点が入っているのを確認。
non-touchなCWMでも確かそんな項目があったような気がします。
mount-system
その後、また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

アプリで確認してみる。
device-2012-12-30-172959

メディア音量が「3/30」になっているので30段階ですね。
スクロールキャッシュは?分かりません。

【追記】
RAZR i XT890で試してみましたけど、dalvik-cacheが出来上がりませんでした。
まさに無限ループ。
Intel CPUは訳わからん。

関連のありそうな記事

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください