最近學習aidl,寫demo后編譯報錯,跟着《Android開發藝術探索》以及網上的一些aidl詳解博客敲完后一直編譯不過,錯誤日志如下:
Process 'command 'C:\Users\DELL\AppData\Local\Android\Sdk\build-tools\27.0.3\aidl.exe'' finished with non-zero exit value 1
打開詳細錯誤后很多,但也沒有有效信息:
Caused by: org.gradle.process.internal.ExecException: Process 'command 'C:\Users\DELL\AppData\Local\Android\Sdk\build-tools\27.0.3\aidl.exe'' finished with non-zero exit value 1
at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:382)
at com.android.build.gradle.internal.process.GradleProcessResult.assertNormalExitValue(GradleProcessResult.java:46)
... 130 more
搜索網上的各種答案,常見原因如下:
- Java文件跟aidl文件報名不一致;
- aidl中沒有顯示引用數據對象類;
- aidl中沒有描述數據對象類的in、out、inout標志;
- window默認aidl空格符為cr,aidl解析器用的是crlf,所以無法解析(改原因可能是早期的缺陷,現在的Android studio默認就是crlf)
上述的一個個試了后都沒有解決,最后通過gradlew compileDebugSource --stacktrace -info打印構建log后發現有異常日志:
C:\usr\project\Aidl\app\src\main\aidl\com\niiwoo\aidl\aidl\Book.aidl:7: syntax error
C:\usr\project\Aidl\app\src\main\aidl\com\niiwoo\aidl\aidl\Book.aidl:7: syntax error don't know what to do with "interface"
在創建數據對象類Book.aidl時,Androidstudio默認創建了一個接口:
interface Book {
...
}
我看的教程中對這個接口的描述是“可以刪除”,所以就以為可刪可不刪,最后刪除后就可以編譯了。
考慮到aidl的性質,默認創建的接口應該是控制類aidl生成的,數據對象類還是需要刪除的。記錄一下,希望對遇到同樣問題的兄弟有一些幫助。
如有錯誤,歡迎留言指正!