关于android:XPage系列是时候抛弃ButterKnife了

38次阅读

共计 3543 个字符,预计需要花费 9 分钟才能阅读完成。

前言

作为 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 开源之旅】

正文完
 0