2010年12月23日木曜日

DDMSを改造"せず"に、logcatに日本語出す!

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

目的

だってDDMSを改造して、logcatに日本語を出す!みたくAndroidのソース落としてソースいじってビルドとかって、しゃらくせぇじゃないですか!


環境

試した環境は
Windows 7 64bit Home Premium

手順

  1. Bytemanをダウンロード/インストール
  2. Byteman用のルール、環境変数設定バッチを作る
  3. DDMSの起動バッチ"ddms.bat"をちょっといじる
  4. 起動→できた!

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 件のコメント:

コメントを投稿