ProGuard実行時にaaptがクラッシュする
ProGuardはJava向けの難読化ツールで、SDK Tools r8とADT8.0.0から同梱されるようになっています。
- Androidアプリの解読・改ざんを防ぐ難読化ツールとは - @IT
- Androidとセキュリティ:Android 2.3(Gingerbread) SDKに標準搭載されたProGuardを試す - Android(アンドロイド)情報-ブリリアントサービス
で、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オプションをつけるとクラッシュする場合があるとのこと。
その場合、先ほどログを出力するために設定した[Build output]の設定を"Normal"に変更するとクラッシュすることなく、無事apkファイルが生成された。ちなみに、"Silent"でも問題なし。
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"に変更してそのままexportを再実行すると今度は別のエラーが発生します。
こちらは一度プロジェクトをcleanしてから再exportするか、eclipseを-cleanオプション付きで起動してexportすると良いです。