[電話] 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のパスは通せとかそういう基本的なことは書いてませんが察してくださいね。

そのにに続く

コメント

13 件のコメント on [電話] apktoolでapkを弄り回す日々。そのいち

    […] 前回分解した apk を組み立てる。 […]

    […] そのいち […]

    […] apktoolの使用方法とかは過去ログを見てもらったりすると参考になるかも。 前提としてDigitalClockWidget.apkとandroid.policy.jarは端末から取得しておいてください。 上記zipファイルを解凍して以下のコマンドを実行する同じディレクトリに置いて […]

  1. NISI
    2010年9月22日 11:41 AM
  2. いつも有益な情報ありがとうございます。
    私も、simフリーgalaxyを所持していて、日本語化をしようとこの記事を
    参照に行ったんですが、apktool d で分解しようとしたら、
    Can’t find framework resources for package of id: 2. You must install proper fra
    mework files, see project website for more info.

    エラーが出てしまい、完全に分解できていませんでした。
    WikiのQ&Aを見たら、ダウンロードして入れてみろと書かれていましたが、
    htc製(だと思う)の記事しかありませんでした。

    xdaでもandroid2.2ですが、同様のエラーがでていました。twframework-res.apkで解決した?。見たいな事が書いてあったので試しましたが、
    apktool b で元に戻したところ、resource.arscがどこにもありませんでした。

    values-ja.netでのcmdファイルも、試しに行いましたが、resource.arscがありません。とエラーがでてしまいました。

    長々と、書いて申し訳ないのですが、解決策はありませんでしょうか?
    よろしくお願いします。

    apktoolは、最新のverで、jreのパスは通ってます。
    galaxyのファームは、JM8+Tayutama1.1+Voodoo Beta4になります。
    オリジナルframework-res.apkを使用してもダメでした。

  3. 8796.jp管理人
    2010年9月22日 12:12 PM
  4. GalaxySの場合は

    apktool if framework-res.apk
    apktool if twframework-res.apk

    と2個インストールしてから apktool d で分解する必要があるファイルもありました。
    一度 apktool d でできたフォルダを削除してからやり直すとうまくいくかもしれません。

    JM8+Tayutama1.1+Voodoo Beta4というのは使ったことがないのでよくわかりませんが
    それほど変わらないと思います。

  5. NISI
    2010年9月22日 4:36 PM
  6. >>8796.jp管理人さん
    ありがとうございます。早速試したところ、無事にできました!
    が、一つ困ったことがありまして、今回GalaxySのsettings.apkを
    日本語化しようと思ったんですが、できませんでした。

    values-jaと翻訳したもの追加→apktool b →7-zipでresources.arsc無圧縮で追加
    adb push /sdcard/→cp /sdcrd/system/app/→adb reboot
    で再起動後、英語表示のままでした。。
    select localeを見ても、日本語の表記はなく、more localeで
    日本語にしても設定画面は英語でした。
    もしかしたら、ファームアップ(JM8)する際にCSCを最もサイズが小さいものを選んで(xdaからDL)しまったので、それが原因かもしれないのですが・・・

    何か間違ったことをしてしまったんでしょうか?
    解決策があれば、お願いします。
    一応、settings.apkをadb pull したところ、作成したvalues-jaは、ありました。

    余談ですが、JM8+Tayutama+Voodoo Beta4は非常にサクサクで快適です。
    Voodooは、以前あったプチフリ対策のext2とは違い、/systemをext4でフォーマットするみたいです。まだ、Beta版なのでテストを兼ねていれてみました。

    もし、機会があれば使ってみてください。以前のlag fixより高速でいいと思います。またnilfs2でフォーマットするVoodooもBeta版ですがアップされています。

  7. 8796.jp管理人
    2010年9月22日 7:40 PM
  8. 設定の言語のところはframework-res.apkを日本語化しないと日本語が選べなかったような記憶があります
    なのでロケールを日本語にするにはMorelocale2ですね

    ちなみにSettings.apkの書き換えは再起動いらなかったと思います
    Settings.apkとsettings.apkで2個あるとかたまにやりますが大文字小文字で別ファイルになるので注意が必要です

    起動してからのログを adb logcat > log.txt とかでファイルに落として念入りに見てみるとなんかヒントがあるかも

    とりあえずVoodooのカーネルやってみました。ext2のと比べてぬるぬるしててとても良いです。一皮むけた感じ。同じ機械とは思えないw
    検証のためとかで標準環境から大きくいじらない方針なのでTayutamaはまた今度ー

  9. 8796.jp管理人
    2010年9月22日 11:45 PM
  10. あ、strings.xmlに一部不具合があったようです。

    失礼しました。
    自分でJM8にしてみて気が付きました。
    半角の&は&にするルールでしたのでそこを修正しました。
    ついでにarrays.xmlをあげたのでご活用ください。

    もしかしたら原因が違うかもしれないけどうちではそのような感じでした。

  11. NISI
    2010年9月23日 12:03 AM
  12. >>8796.jp管理人さん
    何度もありがとうございます。無事settings.apkを日本語化できました。
    調子に乗って、Phone.apkやMusicPlayer.apkも微妙に日本語化しちゃいました。
    仰るとおり、大文字・小文字の二つありました。ls /system/appでよく見ればよかったです。。adb logcat > log.txt も使用しました。非常に便利ですね。

    ただ、framework-res.apkも日本語化しようとしたら、結合時に大量にエラーを吐いてしまいresources.arscができなかったので、解決策を模索中です。   
    今回の件で、非常に勉強になりました。本当にありがとうございます。    

    Voodooを試しましたか。確かに別機種みたいですよね。まだ、Beta版なので正式にリリースされたらもっと凄いような気が・・ゴクリ(今でも満足ですけど)
    またVoodooには、画面の発色を最適にするオマケ?がついています。入れる前と比べて色が少し濃く、明るくなった感じです。

    Tayutamaは機会があれば、試してみてください。Froyoみたくアイコンがカラーになったり、バーが半透明になったりします。(このカスタムROM入れたからframework結合できないんじゃ・・・まさかね?)

    […] をいつものようにapktoolにて分解して comgoogleandroidmmspdu 以下をまるまるtakuoさまのnon-cm-froyoの […]

    […] 手順はいつも通り。FroyoなのでCM6.0の日本語リソースをそのまま流用しただけなので、特有のテキストは英語のままです。英語が得意で根気強い方は翻訳をしてみると助かる人もいるかも知れません。 […]

    […] deodex 化と apktool をそこそこ使えること。 apktool d FMRadio.apk […]

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