目的
だってDDMSを改造して、logcatに日本語を出す!みたくAndroidのソース落としてソースいじってビルドとかって、しゃらくせぇじゃないですか!
環境
試した環境は
Windows 7 64bit Home Premium
手順
- Bytemanをダウンロード/インストール
- Byteman用のルール、環境変数設定バッチを作る
- DDMSの起動バッチ"ddms.bat"をちょっといじる
- 起動→できた!
1.Bytemanをダウンロード/インストール
先日このエントリ「BytemanによるJava黒魔術」を見てピーン!ときました。
「DDMSの日本語文字化けって一行修正したら直るんだから、もうBytemanでバイトコードいじっちゃったらいいんじゃねーの!」
Android OSならdexという別世界に行ってしまいますが、DDMSは幸いclassの住人。バイトコードイチコロ。
早速Bytemanからbyteman binary + docsあたりを落としてきて、zipを展開、
android-sdk-windows/tools配下に持って行きます。
2.Byteman用のルール、環境変数設定バッチを作る
Bytemanを使う為に環境変数を設定するバッチファイルと、Byteman用ルールを作成します。
これらもandroid-sdk-windows/toolsに置いておきます。
■rule.txt
どのクラスをどう書き換えるかの定義ファイルです。
今回はjava.lang.StringのコンストラクタにStringのcharsetを指定した場合に内部で呼び出されるjava.lang.StringCoding#decodeをやっつけました。
decodeの第一引数にcharsetが渡ってくるので、
AT ENTRY:メソッドが呼び出された直後
DO $1 = "UTF-8":第一引数を"UTF-8"に書き換える
って感じの事をしてもらっています。
RULE logcat hack
CLASS java.lang.StringCoding
METHOD decode(String , byte[], int, int)
AT ENTRY
IF TRUE
DO $1 = "UTF-8"
ENDRULE
■byteman_env.bat
bytemanを動かす為の環境変数を設定してます。
bytemanはjava.lang.instrument APIを利用するJava言語エージェントなので、Java実行時に-javaagentで「俺が出る!」という設定をしてあげます。
@echo off
set BYTEMAN_HOME=byteman-1.4.1
set BYTEMAN_RULE=rule.txt
set BYTEMAN_OPTS=-javaagent:%BYTEMAN_HOME%\lib\byteman.jar=listener:true,script:%BYTEMAN_RULE%,boot:%BYTEMAN_HOME%\lib\byteman.jar -Dorg.jboss.byteman.transform.all -Dorg.jboss.byteman.debug
DDMSの起動バッチ"ddms.bat"をちょっといじる
ほぼもう準備完了
あとはddms.bat内で実際ddmsを起動しているとこのjavaのオプションに-javaagentでbytemanさんもご一緒して頂く様追記するだけです。
赤字が追記部分です。
■ddms.bat(抜粋)
call byteman_env
call %java_exe% %java_debug%
%BYTEMAN_OPTS%
-Dcom.android.ddms.bindir= -classpath "%jarpath%;%swt_path%\swt.jar" com.android.ddms.Main %*
起動->できた!
あとはコマンドラインで
>ddms
るだけ!
できた!
0 件のコメント:
コメントを投稿