XPage系列|是时候抛弃ButterKnife了

简介: XPage系列|是时候抛弃ButterKnife了

微信截图_20220518191034.png

前言


作为 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被标注弃用的信息:


微信截图_20220518191207.png


因为当初设计XPage是为了能够更方便的使用Fragment, 所以就默认集成了ButterKnife. 如果我还想继续使用XPage的话, 就不得不把Gradle插件降到5.0版本以下, 这在ButterKnife被废弃, Viewbinding取而代之的大趋势下, 显然是不合适的.


果不其然, 我的XPage的开源项目很快就被使用者提了去除ButterKnife的issue, 具体如下:


微信截图_20220518191250.png


这样看来, 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.** { *; }


模板工程


以上的升级内容, 我已在最新的模板工程中做了相应的更新, 想偷懒的同学可以直接拿模板工程使用.




相关链接





最后


非常感谢大家对XPage 的支持,喜欢的小伙伴可以到项目的Github主页:github.com/xuexiangjys… 点击star支持一下哦!



相关文章
|
13天前
|
搜索推荐 Android开发 开发者
Android应用开发:实现自定义ViewPager2的完全指南
【5月更文挑战第23天】 在移动应用开发的领域中,为用户提供流畅且直观的界面体验至关重要。Android平台上的ViewPager2组件提供了一个强大的方式来实现可滑动的页面,但有时候默认的行为和样式可能无法满足特定的设计要求。本文将深入探讨如何通过创建一个自定义的ViewPager2来扩展其功能,包括实现新的转换效果、修改指示器样式以及增加触摸事件响应等。我们将提供详尽的步骤和代码示例,帮助开发者掌握创建高度定制的ViewPager2所需的关键概念和技术。
|
11月前
|
容器
laypage静态数据分页组件的调用实战代码
laypage静态数据分页组件的调用实战代码
49 0
|
Android开发
View事件分发相关结论的源码解析
View事件分发的三个核心方法有三个,分别是`dispatchTouchEvent`方法,`onInterceptTouchEvent`方法和`onInterceptTouchEvent`方法。 dispatchTouchEvent方法主要用来进行事件的分发。如果事件能够传递给当前View,那么此方法一定会被调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法的影响,表示是否消耗当前事件。 onInterceptTouchEvent方法在dispatchTouchEvent方法内部调用,用来判断是否拦截某个事件,返回结果表示是否拦截
|
Java
viewpage 添加fragment 报错 viewpage demo LayoutInflater 自定义控件轮播图demo
viewpage 添加fragment 报错 viewpage demo LayoutInflater 自定义控件轮播图demo
86 0
viewpage 添加fragment 报错 viewpage demo LayoutInflater 自定义控件轮播图demo
|
Android开发
ViewPager源码分析(2):滑动及冲突处理
我的简书同步发布:ViewPager源码分析(2):滑动及冲突处理 转载请注明出处:【huachao1001的专栏:http://blog.csdn.net/huachao1001】 上一篇介绍了ViewPager的onMeasure和onLayout两个方法,这是自定义View最基本的两个函数。但是我们的ViewPager有个需求就是滑动,接下来我们一起去学习ViewPager在滑动方面做了哪些工作,以及ViewPager如何处理与子View之间的滑动冲突。由于ViewPager的子View有Decor View还有普通的子View,而本篇文章讲的主要是普通子View,因此,不再去刻意区
ViewPager源码分析(2):滑动及冲突处理
|
缓存
ViewPager懒加载的实现,理解setUserVisibleHint,而不只是会用就好
Viewpager默认会缓存临近操作的两个页面,也就是至少会缓存一个页面。
160 0
ViewPager懒加载的实现,理解setUserVisibleHint,而不只是会用就好
Selenium成长之路-10简单对象定位之partial link text方法
Selenium成长之路-10简单对象定位之partial link text方法
121 0
Selenium成长之路-10简单对象定位之partial link text方法
|
存储 XML 设计模式
Jetpack 系列(7)—— AndroidX Fragment 核心原理分析
Jetpack 系列(7)—— AndroidX Fragment 核心原理分析
422 0
Jetpack 系列(7)—— AndroidX Fragment 核心原理分析
|
测试技术
软件测试面试题:page object设置模式中,是否需要在page里定位的方法中加上断言?
软件测试面试题:page object设置模式中,是否需要在page里定位的方法中加上断言?
100 0
|
缓存 Android开发 容器
ViewPager刷新问题原理分析及解决方案(FragmentPagerAdapter+FragementStatePagerAdapter)
ViewPager刷新问题原理分析及解决方案(FragmentPagerAdapter+FragementStatePagerAdapter)
521 0
ViewPager刷新问题原理分析及解决方案(FragmentPagerAdapter+FragementStatePagerAdapter)