Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

ProGuard実行時にaaptがクラッシュする

ProGuardはJava向けの難読化ツールで、SDK Tools r8とADT8.0.0から同梱されるようになっています。

で、Androidアプリの難読化をしようとしたところ、見事にドハマリしました。。。何周目のネタか分かりませんが、せっかくなので備忘録としてまとめときます。

現象

Androidアプリをreleaseモードでexportする際にProGuardを使用した場合、aaptがクラッシュする。

環境

手順

1. ProGuardやaaptのログをConsoleから確認したいので、Y.A.M の 雑記帳: Android Eclipse から ProGuard を使ってみた。の追記部分を参考にして、Windowメニューから

[Preference]-[Android]-[Build]-[Build output]

の設定を"Verbose"に変更。

2. eclipseで新規Androidプロジェクトを作成

3. project.propertiesに以下の行を追加し、ProGuardを使用するよう設定。proguard.cfgは特に編集しない

proguard.config=proguard.cfg

4. パッケージのexportを実行

5. keystoreを作成

6. 署名用の鍵を作成

7. apkファイルの作成実行

調査/対策

Consoleに出力されたaaptのログをコピーし、エラーの原因となった以下のコマンド(適宜改行)をコマンドラインから実行するとやはり同様のエラーが発生。

C:\android-sdk-windows\platform-tools\aapt.exe package
    -v
    -S C:\workspace\SampleProject\bin\res
    -S C:\workspace\SampleProject\res
    -f
    --no-crunch
    --auto-add-overlay
    -M C:\workspace\SampleProject\AndroidManifest.xml
    -A C:\workspace\SampleProject\assets
    -I C:\android-sdk-windows\platforms\android-4\android.jar
    -F C:\WINDOWS\Temp\android_3984224136892715853.ap_ 

"aapt crash"でググッてみると、SDK Tools r14からの問題らしく、Windows環境で-vオプションをつけるとクラッシュする場合があるとのこと。


AAPT crashes on Windows in some cases when the build output is set to verbose.
The workaround is to set Eclipse>Preferences>Android>Build>Build Output to less than Verbose, e.g. Normal.
We have a fix, which will be available in tools 16. [Issue 20395]

その場合、先ほどログを出力するために設定した[Build output]の設定を"Normal"に変更するとクラッシュすることなく、無事apkファイルが生成された。ちなみに、"Silent"でも問題なし。

ちなみに

[Build output]の設定を"Normal"に変更してそのままexportを再実行すると今度は別のエラーが発生します。

こちらは一度プロジェクトをcleanしてから再exportするか、eclipseを-cleanオプション付きで起動してexportすると良いです。

まとめ

この件はr16で修正されるはずが直ってなくてr17としてリリース予定な感じっぽいです。

ちなみに、これで1日のほとんどを潰しました。。。orz