背景
在下面的R.id.rv_msg_remind 標紅,然后鼠標附上去,顯示attribute value must be contant.如下:
@BindView(R.id.rv_msg_remind)
然后接觸android studio 有一段時間了,給出的信息並一定准確。給出的答案是屬性值必須是不變的。
但是android R.id.xxx本來就是const的,這顯然矛盾了,但是事情可以肯定的是是沒有拿到R.id.xxx的值報錯了。
這時候一個前提,我先寫好了子項目,然后合並項目出的錯誤,我把配置拷貝了過來。
再三確定配置沒有出錯的情況下,我開始懷疑:
- 是否是一些配置沖突了。
- 是否是在app moudule 和lib moudule 有什么不同的地方。(我寫好子項目,實在app目錄下進行的,而這次引用是作為lib)
配置沖突無疑是非常頭痛的問題,你不知道到底有多少驗證在等着你。
但是我轉念一想,配置沖突的可能性幾乎微乎其微,而且同步報錯的可能性極大,當然也有極小的可能性不報錯,這取決於是否按照規范開發jar包,那么這種情況是最壞的打算,並且幾乎不可能,暫不考慮。
然后我去google了一波官網,發現配置app moudule 與lib moudule真的不同。
解決
圖中我標紅了關鍵點,這是出錯需要修改的。
- 我們需要依賴一個plugin
- 然后在子lib module 中apply.
- 並且呢,要使用R2。
R2是用來干什么的呢?
沒錯就是來獲取id的。
然而當我make project 也就是編譯的時候,出現了反噬性性打擊。
可以看出前面已經標紅了,那就是編譯后出現了問題。原來是10.2.0使用的是androidx,關於androidx是google對以前包管理混亂然后又不想買單的一個舉動。
其中一個報錯的是:
androidx.support.annotation.AnimRes
當時我覺得androidx牛逼啊,打算升級androidx,具體可百度。
最后發現androidx 幾乎不兼容android,出現了各種錯誤,就不再累述。
此時心中無比的慌亂,what i can do for it?我要為我愚蠢的行為買單了。
然后我把版本倒退回去,然后去官網找了下答案,原來低版本是支持android的,想想肯定也支持啊,不然以前的人怎么用,反正當時沒有想到。。。。
配置如下:
classpath 'com.android.tools.build:gradle:3.3.1'
classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0'
上面是我的gradle,下面是配置的plugin。plugin需要根據gradle來確定,實踐可知,詳情查官網。
總結
如果需要增加一個子項目,然后不希望build的時候花費太多的事件,那么可以放在一個new project中。
但是必須要保持配置一致,比如說作為lib module,在new project中,也應該是lib module。最好是把正式開發app module中的配置,放在new project中,代碼就不必拷貝。
這樣能減少合並出錯的可能。