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