深入理解编译注解(三)依赖关系 apt/annotationProcessor与Provided的区别
前言
網上有很多朋友在問: apt/annotationProcessor與Provided 都是只編譯并不打入apk中,他倆到底有什么區別呢?所以我就把自己所了解的與大家分享一下。
正文
編譯關系 apt/annotationProcessor
只在編譯的時候執行依賴的庫,但是庫最終不打包到apk中,從之前的demo來看,總結一下:
編譯庫中的代碼沒有直接使用的意義,也沒有提供開放的api調用,最終的目的是得到編譯庫中生成的文件,供我們調用。
例如demo中,app與io-compiler是編譯關系,app在運行時需要io-compiler編譯生成的MainActivity$$ViewInject文件,跟io-compiler無關。
讓我們來做一個比喻:
演員表
小明:扮演app。
自動售賣機:扮演編譯庫。
營養快線:編譯庫生成的文件。
劇情:
小明站在自動售賣機前,對它說:感覺身體被掏空,趕緊給我來瓶營養快線!然后售賣機忽忽悠悠彈出一瓶營養快線,然后小明就走了。
簡單的說,就是利用編譯庫達成目的,目的達成就把它拋棄了,我們要的僅僅是編譯庫的成果。差不多就是這個意思,概念到位即可。
Provided
Provided 雖然也是編譯時執行,最終不會打包到apk中,但是跟apt/annotationProcessor有著根本的不同。
一般應用場景是這樣的:
A 、B、C都是Library。
A依賴了C,B也依賴了C
App需要同時使用A和B
那么其中A(或者B)可以修改與C的依賴關系為Provided
A這個Library實際上還是要用到C的,只不過它知道B那里也有一個C,自己再帶一個就顯得多余了,等app開始運行的時候,A就可以通過B得到C,也就是兩人公用這個C。所以自己就在和B匯合之前,假設自己有C。如果運行的時候沒有C,肯定就要崩潰了。
再來做一個比喻:
演員表
小明:扮演app
小剛:扮演Library(A)
小毛:扮演Library(B)
劇情:
春天到了小明寂寞難耐,給小剛和小毛打電話:今晚夜色撩人,我們去大保健吧,帶上你們的會員卡,我請客!
小剛:我有XXX的會員卡,會員通用,而且不是會員不讓進,十分安全,我和小毛帶一張就足夠了。
小毛:沒問題!你帶會員卡吧,我開車去接你倆。
結局1
小剛沒有忘記帶會員卡,一切順利。
結局2
小剛忘記帶會員卡,3個人因計劃泡湯掃興而歸。
差不多就是這個意思,比喻如果有小問題不要在意,關鍵是意會,你懂得。
總結一下,Provided是間接的得到了依賴的Library,運行的時候必須要保證這個Library的存在,否則就會崩潰,起到了避免依賴重復資源的作用。
總結
到這里就結束了,不知道大家有沒有對他們的區別有了更深的體會,如果有什么問題就留言,我們再好好的討論。
總結
以上是生活随笔為你收集整理的深入理解编译注解(三)依赖关系 apt/annotationProcessor与Provided的区别的全部內容,希望文章能夠幫你解決所遇到的問題。