自從入職CS,項目編譯壹直有個神坑報錯,每次都需要clean rebuild若幹次, 非常耽誤時間
簡單的說, 如果在使用AIDL時需要壹個自定義的數據類型, 我們壹般會這麽寫:
當我們寫壹個子類SubClass繼承該類.然後在Kotlin文件中直接或者間接引用到SubClass時, 就會出現壹個以下的報錯
報錯發生在 app:compileDebugKotlin , 也就是kotlinc. 但是我們明明已經定義了該類. 全局搜索發現有兩個 CustomParcel.java , 推測是兩個同名的文件引起.
除了我們自己寫的Java文件, 另外壹個肯定是aidl生成的. 引用壹張圖:
在編譯開始時會把aidl轉化為Java文件, 接下來才會經過javac, kotlinc把JVM語言文件轉化為字節碼 .class 文件.
查看aidl生成的文件, 發現是空的, 並且有壹行註釋: 說明這是壹個 PlaceHolder , 也就是占位文件.
網上搜到有人遇到了 相同的問題 ,問題確實發生在kotlinC編譯器以aidl生成的空java文件為編譯目標, 而不是真正的java類文件. 並且也給出了解決辦法,升級buildTools版本.
查看 buildTools提交記錄
提交記錄: No java output for parcelable declaration . 也就是移除了以下的為自定義的aidl Parcelable類生成Java文件的設定(29.0.2之前的實現)
升級29.0.3, 再次編譯, 發現build/aidl目錄下不再生成同名的 PlaceHolder 文件了, 只剩下唯壹的我們自己的文件, kotlinC這次只能用唯壹的文件來編譯,報錯解決.
至於為什麽有時候clean rebuild能編譯成功,需要探究下kotlinC的源碼.
最坑的是, 29.0.2就是 gradle plugin4.1默認支持的版本 , 所以妳不手動指定buildTools版本為29.0.3以上就會掉進坑裏.