Tech Racho エンジニアの「?」を「!」に。
  • 開発

error executing aidl: return code 1

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を返していたようですね。

本来プロジェクト側を直すべきですが、諸事情によりできなかったので、とりあえずこれで開発をすることができそうです。


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。