Androidプロジェクトで、ビルドしようとすると以下のエラーが出ることがあります。
error executing aidl: return code 1
古いAndroid SDKを使っているマシンでは発生しないのですが、最近セットアップしたマシンでは発生。
aidlを使っている、とあるプロジェクトでのみ発生していました。
該当エラーを発生させているのは、この辺ですね。
android/sdk/eclipse/plugins/com.android.ide.eclipse.adt/src/com/adnroid/ide/eclipse/adt/internal/build/AidlProcessor.java
} else if (returnCode != 0) { // no stderr output but exec failed. String msg = String.format(Messages.AIDL_Exec_Error_d, returnCode); }
今回は、exitコードが1になっているだけで、そのプロセスをスキップすれば問題なくビルドが通る状態でした。
そこで、強引に終了ステータスを0にしてしまいます。
Linux
先にandroid-sdk/platform-tools/aidlを、aidl_にリネームしておきます。
aidlを、以下のようなシェルスクリプトに変更して、chmod +xしておきます。
#!/bin/bash echo $@ >> /tmp/aidl_log aidl_ $* exit 0
Windows
シェルスクリプトに相当する、適当なプログラムを作ってやります。
以下は使い捨てプログラムです。
失敗時にはメッセージボックスを出して、ついでにクリップボードにコマンドをコピーしておくようにしました。
こちらも同様に、aidl.exeをaidl_.exeにリネームしておきます。
#include <windows.h> int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { char buf[4096]; //てぬき! PROCESS_INFORMATION Pi; STARTUPINFO Si; ZeroMemory((LPVOID)&Si,sizeof(STARTUPINFO)); Si.cb = sizeof(STARTUPINFO); Si.dwFlags = STARTF_USESHOWWINDOW; Si.wShowWindow = SW_HIDE; wsprintf(buf, "%s %s", "aidl_.exe", lpCmdLine); CreateProcess(NULL, buf, NULL, NULL, FALSE, 0, 0, 0, &Si, &Pi); WaitForSingleObject(Pi.hProcess, INFINITE); DWORD status; GetExitCodeProcess(Pi.hProcess, &status); if (status != 0) { HGLOBAL hGlobal; LPTSTR pMem; hGlobal = GlobalAlloc(GHND, lstrlen(buf) + 128); if (hGlobal == NULL) { return 0; } pMem = (LPTSTR)GlobalLock(hGlobal); if (pMem == NULL) { GlobalFree( hGlobal ); return false; } lstrcpy(pMem, buf); GlobalUnlock( hGlobal ); OpenClipboard( NULL ); EmptyClipboard(); SetClipboardData(CF_TEXT, hGlobal); CloseClipboard(); MessageBox(NULL, buf, "AIDL", MB_OK); } return 0; }
はい、これで無事にビルドが通りました!
また、ログを出しているので、aidlファイルが何百もあるプロジェクトでも、どのaidlが失敗しているのかすぐわかります。
# adt側で、エラーメッセージに最初から出してくれればうれしいんですけどね。
ちなみに、今回のプロジェクトでは、aidlファイルが生成すべきJavaファイルと同名のファイルが、srcディレクトリに存在するのが原因でした。
この場合、何のエラーメッセージも無しに、終了コード1を返すようです。古いバージョンのSDKでは、無視して0を返していたようですね。
本来プロジェクト側を直すべきですが、諸事情によりできなかったので、とりあえずこれで開発をすることができそうです。