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を返していたようですね。
本来プロジェクト側を直すべきですが、諸事情によりできなかったので、とりあえずこれで開発をすることができそうです。