前言
作為 X-Library系列框架 的靈魂所在,XPage 開源兩年以來,一直致力于降低Fragment使用的難度,努力實作一個Activity多Fragment的Android開發模式,
前段時間, 在觀望了許久之后, 我終于更新了Android Studio的最新版本(北極狐), 發現專案中使用ButterKnife注解id的代碼出現了警告,警告資訊如下:
Resource IDs will be non-final in Android Gradle Plugin version 5.0, avoid using them as annotation attributes
警告資訊告訴我們在Gradle 5.0的插件中Resource 的Id值將不會再是final型別,因此應該避免在注解屬性中使用Id,這意味著如果我們把Gradle插件升級到5.0版本之后ButterKnife將無法再被使用!而且在ButterKnife的官方檔案上也看到了ButterKnife被標注棄用的資訊:

因為當初設計XPage是為了能夠更方便的使用Fragment, 所以就默認集成了ButterKnife. 如果我還想繼續使用XPage的話, 就不得不把Gradle插件降到5.0版本以下, 這在ButterKnife被廢棄, Viewbinding取而代之的大趨勢下, 顯然是不合適的.
果不其然, 我的XPage的開源專案很快就被使用者提了去除ButterKnife的issue, 具體如下:

這樣看來, XPage去除ButterKnife依賴是勢在必行的, 于是就有了這次XPage 3.3.0版本的升級.
升級后有什么變化
這次升級主要包含了兩個部分: 使用gson代替fastjson 和 去除butterknife依賴, 全方面向Google看齊,
使用gson代替fastjson
為什么使用gson代替fastjson呢? 我主要是出于以下兩點考慮:
- fastjson之前就經常爆出了好幾次比較嚴重的安全漏洞, 安全性方面存在缺陷.
- 目前Android專案使用gson的居多, 并且是Google開源維護的,充分相信Google的實力.
去除butterknife依賴
去除butterknife依賴, 使用ViewBinding代替是趨勢所向. 那么使用ViewBinding代替有哪些好處呢? 下面我簡單列舉一下:
-
型別安全: ViewBinding會基于布局中的View生成型別正確的屬性,比如,在布局中放入了一個 TextView ,視圖系結就會暴露出一個 TextView 型別的屬性供開發中使用,
-
空安全: ViewBinding會檢測某個視圖是不是只在一些配置下存在,并依據結果生成帶有 @Nullable 注解的屬性,所以即使在多種配置下定義的布局檔案,視圖系結依然能夠保證空安全,
-
減少控制元件變數的定義: ViewBinding會自動生成一個系結類, 我們可以直接通過這個系結物件去訪問布局中的控制元件, 無需再為每個控制元件的訪問去定義一個個的變數.
升級3.3.0版本注意事項
依賴發生變化
3.3.0版本之后無需依賴butterknife.
- 3.3.0及以上版本,只需要在專案中依賴XPage即可.
dependencies {
...
implementation 'com.github.xuexiangjys.XPage:xpage-lib:3.3.0'
annotationProcessor 'com.github.xuexiangjys.XPage:xpage-compiler:3.3.0'
}
- 3.2.0及以下版本,除需要在專案中依賴XPage以外, 還需要依賴butterknife.
dependencies {
...
// XPage
implementation 'com.github.xuexiangjys.XPage:xpage-lib:3.2.0'
annotationProcessor 'com.github.xuexiangjys.XPage:xpage-compiler:3.2.0'
// ButterKnife的sdk
implementation 'com.jakewharton:butterknife:10.1.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
}
介面發生變化
為了能夠讓XPage更好地使用上ViewBinding, 我對XPageFragment以及XPageActivity的部分介面做出了調整.
- 洗掉了XPageFragment中的
getLayoutId抽象方法, 取而代之的是inflateView抽象方法.
/**
* 加載控制元件
*
* @param inflater inflater
* @param container 容器
* @return 根布局
*/
protected abstract View inflateView(LayoutInflater inflater, ViewGroup container);
- 洗掉了XPageActivity中的
getLayoutId抽象方法, 取而代之的是getCustomRootView方法.
/**
* 獲取自定義根布局
*
* @return 自定義根布局
*/
protected View getCustomRootView() {
return null;
}
混淆配置發生變化
由于此次XPage升級使用gson代替了fastjson, 因此混淆配置需要進行修改.
- 3.2.0及以上版本,使用的是gson進行序列化的,所以配置如下:
# gson
-keepattributes Signature
-keepattributes *Annotation*
-dontwarn sun.misc.**
-keep class com.google.gson.examples.android.model.** { <fields>; }
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken
# xpage
-keep class com.xuexiang.xpage.annotation.** { *; }
-keep class com.xuexiang.xpage.config.** { *; }
- 3.1.1及以下版本,使用的是fastjson進行序列化的,所以配置如下:
# fastjson
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.** { *; }
-keepattributes Signature
# xpage
-keep class com.xuexiang.xpage.annotation.** { *; }
-keep class com.xuexiang.xpage.config.** { *; }
模板工程
以上的升級內容, 我已在最新的模板工程中做了相應的更新, 想偷懶的同學可以直接拿模板工程使用.
- Android應用空殼模板工程
- 簡化版Android空殼模板工程
相關鏈接
- 史上最方便的Android頁面框架XPage使用指南
- Navigation和XPage框架相比誰更香
- XPage專案地址:https://github.com/xuexiangjys/XPage
最后
非常感謝大家對XPage 的支持,喜歡的小伙伴可以到專案的Github主頁:https://github.com/xuexiangjys/XPage 點擊star支持一下哦!
我是xuexiangjys,一枚熱愛學習,愛好編程,致力于Android架構研究以及開源專案經驗分享的技術up主,獲取更多資訊,歡迎微信搜索公眾號:【我的Android開源之旅】
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/293209.html
標籤:其他
上一篇:Android手機投屏到macbook M1 - 開源軟體scrcpy
下一篇:Android學習筆記-UI開發
