作者:CnPeng
連結:https://www.jianshu.com/p/41de8689615d
1、AndroidX 簡介
點選檢視Android檔案中對androidx的簡介
https://developer.android.com/topic/libraries/support-library/androidx-overview
按照官方檔案說明 androidx 是對 android.support.xxx 包的整理後產物。由於之前的support包過於混亂,所以,google推出了 androidX。
由於在後續版本中,會逐步放棄對support 的升級和維護,所以,我們必須遷移到 androidX.對此,官方描述如下:
Existing packages, such as the Android Support Library, are being refactored into AndroidX.
Although Support Library versions 27 and lower are still available on Google Maven,
all new development will be included in only AndroidX versions 1.0.0 and higher.
2、遷移步驟
2.1 修改gradle.properties
android.useAndroidX=true
android.enableJetifier=true
其中:
-
android.useAndroidX=true 表示當前專案啟用 androidx
-
android.enableJetifier=true 表示將依賴包也遷移到androidx 。如果取值為false,表示不遷移依賴包到androidx,但在使用依賴包中的內容時可能會出現問題,當然了,如果你的專案中沒有使用任何三方依賴,那麼,此項可以設定為false
2.2 如何遷移
點選檢視官方遷移指南
https://developer.android.com/topic/libraries/support-library/refactor#migrate
在AndroidStudio 3.2 或更高版本(目前最新正式版為3.2,其他更高版為alpha版)中執行如下操作:
-
Refactor > Migrate to AndroidX
在執行該操作時會提醒我們是否將當前專案打包備份。如果你提前已經做好了備份,可以忽略;如果沒有備份,則先備份。
3、遷移後續
3.1 手動修改錯誤包名
由於 Migrate to AndroidX 執行之後,部分控制元件的包名/路徑名轉換的有問題,所以還需要我們手動調整(包括修改xml佈局檔案和.java/.kt 檔案)。
如:ViewPager,RecyclerView 等,這些內容在遷移完成之後,包名是 androidx.core.weight.xxxx,這是一個錯誤的包名,我們必須手動修改,否則,無法正常編譯——點選綠色 Run(執行) 按鈕時會詳細報出哪裡有錯誤。
此處需要註意,在 AndroidStudio 的 build 選項卡中一次最多隻會報 50條錯誤!! 所以,可能在你修完第一批之後,後面還有N個50。此處要保持一個平靜的?。
3.2 修複DataBinding中的錯誤
在 AndroidStudio3.2 + androidx 環境下,對錯誤的檢查和處理更為嚴格。如果同一個xml佈局檔案中存在同名id,在之前的版本中,我們可以正常編譯和執行,但是,在新的環境下, 必然會報錯,錯誤資訊如下:
在上圖的錯誤資訊中,我們以 DecibelBinding 為例,簡述修複過程。
-
如上圖,無法將xxxBinding 建構式中的xxxBinding應用到指定型別指明瞭出錯的 Binding類 為 DecibelBinding
-
按照DataBinding類名的生成規則,我們可以知道,DecibelBinding 對應的xml檔案名應該是 decibel.xml (如果你在xml中透過 class=”xxxBinding” 指定了DataBinding的生成類名,那麼就全域性搜尋吧)
-
在確定了xml之後,我們還需要知道到底哪裡出了錯誤,那麼,就繼續看圖中的 錯誤:找不到符號 符號:變數 xxx.這個變數就是控制元件的id名稱。
-
DataBinding轉換控制元件id名的規則是:去除下劃線連線符,然後將原下劃線後面的第一個字母大寫。所以,圖中的 fragmentDiscoverGridItemRelativeLayout1 對應的控制元件id應該是:@+id/fragment_discover_grid_item_relative_layout,後面之所以有一個1 ,是因為重覆了。然後,我們在對應的xml檔案中搜索這個控制元件名,然後刪除重覆即可。
3.3 去除 attr.xml 中重覆的屬性名稱
在遷移到 androidX 之前,我們為自定義控制元件編寫自定義屬性時,可以與android已有的屬性重名,但是,在AndroidX環境下不行了,如果存在重名的情況, 必然會報錯——會提示你重覆定義(詳細錯誤資訊沒截圖,但翻譯過來就是重覆定義了attr/xxx)。
錯誤示例:
<declare-styleable name="RoundImageView">
...
<!-在遷移到androidx之前,這樣寫雖然不規範,但是能用,不報錯->
<attr name="textSize" format="Integer" />
...
declare-styleable>
正確示例
<declare-styleable name="RoundImageView">
...
<!-遷移到androidX之後,必須使用android:xxx 屬性,不能定義android已有的屬性->
<attr name="android:textSize" />
...
declare-styleable>
關於重名屬性,在 androidX 中不知道哪個控制元件中包含了一個 mode 屬性,所以,如果之前你的自定義控制元件中有 attr/mode,需要手動改成其他。
3.4 Glide中的註解不相容androidX
遷移到 androidX 之後,Glide中使用的 android.support.annotation.CheckResult 和 android.support.annotation.NonNull這兩個註解無法遷移。之前有使用者在Glide中提過issue:https://github.com/bumptech/glide/issues/3185
在上述issue 中有使用者表示,將Glide升級到 4.8.0 之後,可以正常遷移。但是,我這邊並不行。然後,我先升級了Glide ,又在 gralde檔案中增加了support.annotation ,這樣才能正常編譯透過。貌似在後續Glide 5.x 版本中會完成對 androidx的完全相容。
我的臨時解決方案:
//圖片載入——Glide
implementation "com.github.bumptech.glide:glide:4.8.0
annotationProcessor "com.github.bumptech.glide:compiler:4.8.0
//CnPeng 2018/9/26 下午8:38 這兩行是為瞭解決 https://github.com/bumptech/glide/issues/3185 ——Glide 中的註解還沒有完全相容androidx
implementation "com.android.support:support-annotations:28.0.0-alpha3"
annotationProcessor "com.android.support:support-annotations:28.0.0-alpha3"
3.5 規範包名(即檔案夾名)
這裡所說的包名,指的是專案中的檔案夾名稱。在之前版本中,我們命名包名時可能會出現大寫字母,雖然這並不符合Java命名規範,但起碼能正常編譯和執行。然而,升級到 AndroidStudio3.2 + androidX 環境後,必須嚴格遵守命名規範,否則,可能報錯,從而導致不能正常編譯和執行。
錯誤示例:
正確示例:
對於包名的命名規範,好像要求並非十分嚴格。因為我發現,部分包含大寫字母的報名在編譯時會報錯,部分不報錯。但是,遵守規範總會更好一點!
對於遷移這個事情,大家還是要知曉這件事的,畢竟未來將只更新androidx,不過千萬不要在一些非常關鍵的節點去更新公司專案,例如發版前,灰度前等…
●編號371,輸入編號直達本文
●輸入m獲取到文章目錄
Java程式設計
更多推薦《18個技術類公眾微信》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。