[電話] apktoolでapkを弄り回す日々。そのいち

2010年8月30日 by
カテゴリ: Android, 電話 

個人的に最近はやりの日本語化に必須ツールである apktool ですが、残念ながら apktool で作成した apk は署名されていない&test証明書では認証で撥ねられるのでXPERIA X10 mini pro で /system/app/ の置換えには使えませんでした。

さて、それではリソースの書き換えができないではないか?だがしかし、色々トライアンドエラーで調査してみると署名が必要なファイルとそうでないファイルがあるようです。ということで、元の apk の一部を書き変えるという現在の手段に落ち着きました。

まず apk  はただの zip ファイルなので、7-zipなどのアーカイバで中を見ることが出来ます。

基本的な構造は以下のとおり

META-INF(署名ファイル)
res (画像などのリソースフォルダ)
AndroidManifest.xml (政権公約w)
classes.dex (プログラム部分)
resources.arsc (リソースのうち言語リソースなど)

で、res の中に画像ファイル(drawableフォルダ)とか画面の設計図(layout)など色々入ってます。圧縮率を見ると分かるんですが、注意点として拡張子が xml のファイルは圧縮されて(Deflate)て画像ファイルなどは圧縮されてない(Store)です。画像ファイルを圧縮するとそれだけでリソースが見つからない的なエラーログを吐いてアプリが起動しなくなります。

この状態で言語情報が入っている場所を探しても見つかりません。なぜなら、values フォルダは resources.arsc ファイルに格納されてしまっているからです。ちなみに res フォルダにあるファイルも画像ファイルはそのまま見ることができますが、xml ファイルは難読化?暗号化?されていてテキストエディタで見ても意味不明なバイナリデータになってます。

そんな apk ファイルをバラバラにしてくれる素敵なツールが apktool です。

下準備として /system/framework/framework-res.apk を adb pull してきて apktool にインストールします。

apktool if framework-res.apk

自分のユーザーディレクトリ以下に apktool/framework/1.apk とコピーされ、apk ファイルをdecodeするときに参照されるようになります。とても重要。

(追記)GalaxySの場合は追加でtwframework-res.apkを入れる必要があるかもしれません。

apktool if twframework-res.apk

これは自分のユーザーディレクトリ以下に apktool/framework/2.apk とコピーされると思います。

他の端末でも別途追加インストールが必要なファイルがあるかもしれませんがそこら辺は長年の勘と経験で乗り切りましょう。

あとは任意の apk ファイルを

apktool d Radio.apk

のように decode すると Radio フォルダに res フォルダとかいろいろできます。リソースをいじるだけなら -s オプションを追加してプログラム部分の逆コンパイルをしない方が処理が速いです。

java -jar %~dp0\apktool.jar d -s "%1" "%~dpn1"
mkdir "%~dpn1"\original
copy "%1" "%~dpn1"\original

こんな中身のバッチファイルを作ってファイルをドロップすると使えるようにすると楽ちんです。ついでに元のファイルも保持するようにすると失敗したときに面倒が減るのでそうしてます。

さて res フォルダを見てみると元の values フォルダと values-de とか各言語に翻訳されたフォルダがあります。日本語に対応していれば values-ja があるはずですが、あれば元々翻訳する必要がないので無いことが前提です。

では日本語に対応させましょう。

values-ja フォルダを新規作成して values フォルダから strings.xml と、あれば arrays.xml をコピーして、他の言語と比較しながら必要な行を翻訳していきます。values/strings.xml に存在して values-ja/strings.xml に無い行は元のがそのまま使用されます。なのでURLとか翻訳する必要がない行は削除してしまって問題ないです。編集したファイルは必ずUTF8で保存しましょう。

文字ばっかりで疲れたので続きはまた今度

ああ、そうそう。JRE入れろとかjavaのパスは通せとかそういう基本的なことは書いてませんが察してくださいね。

そのにに続く

コメント