滴滴 App 的质量优化框架 Booster,开源了!

android.view.WindowManager B a d T o k e n E x c e p t i o n :   a t   a n d r o i d . v i e w . V i e w R o o t I m p l . s e t V i e w ( V i e w R o o t I m p l . j a v a ) a t   a n d r o i d . v i e w . W i n d o w M a n a g e r G l o b a l . a d d V i e w ( W i n d o w M a n a g e r G l o b a l . j a v a ) a t   a n d r o i d . v i e w . W i n d o w M a n a g e r I m p l . a d d V i e w ( W i n d o w M a n a g e r I m p l . j a v a 4 ) a t   a n d r o i d . w i d g e t . T o a s t BadTokenException:  at android.view.ViewRootImpl.setView(ViewRootImpl.java) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java4) at android.widget.Toast BadTokenException: at android.view.ViewRootImpl.setView(ViewRootImpl.java)at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java)at android.view.WindowManagerImpl.addView(WindowManagerImpl.java4)at android.widget.ToastTN.handleShow(Toast.java)

这个问题只出现在 Android 7.0 中,在之后的版本中,为了解决这个问题,是直接将其 Catch 住这个异常来解决问题的。下面是 Android 8.0 的相关代码。

try {
mWM.addView(mView, mParams);
trySendAccessibilityEvent();
} catch (WindowManager.BadTokenException e) {
/* ignore */
}

虽然这个问题已经有了一些解决方案,但是 Booster 给了我们另外一个选择。

在 Booster 中,已经内置了一些 Transformers,其中就有一个 booster-transform-bugfix-toast,是用于修复 Android 7.0 中,Toast 导致的系统错误。

ToastBugfixTransformer 的主要源码在此:

@AutoService(ClassTransformer::class)
class ToastBugfixTransformer : ClassTransformer {

override fun transform(context: TransformContext, klass: ClassNode): ClassNode {
klass.methods.forEach { method ->
method.instructions?.iterator()?.asIterable()?.filterIsInstance(MethodInsnNode::class.java)?.filter {
it.owner == TOAST && it.name == “show” && it.desc == “()V”
}?.forEach {
it.owner = TOAST'
it.desc = “(LKaTeX parse error: Expected 'EOF', got '}' at position 48: …INVOKESTATIC }̲ } return k…TOAST”

它是将系统的 Toast 传递到另外定制的一个 com.didiglobal.booster.android.widget 包下的 Toast 来解决。

public static void show(final android.widget.Toast toast) {
if (Build.VERSION.SDK_INT == 25) {
workaround(toast).show();
} else {
toast.show();
}
}

private static android.widget.Toast workaround(final android.widget.Toast toast) {
final Object tn = getFieldValue(toast, “mTN”);
if (null == tn) {
Log.w(TAG, “Field mTN of " + toast + " is null”);
return toast;
}

final Object handler = getFieldValue(tn, “mHandler”);
if (handler instanceof Handler) {
if (setFieldValue(handler, “mCallback”, new CaughtCallback((Handler) handler))) {
return toast;
}
}

final Object show = getFieldValue(tn, “mShow”);
if (show instanceof Runnable) {
if (setFieldValue(tn, “mShow”, new CaughtRunnable((Runnable) show))) {
return toast;
}
}

Log.w(TAG, “Neither field mHandler nor mShow of " + tn + " is accessible”);
return toast;
}

当 API Level 不为 25 时,直接调用 Toast.show() 方法,为 25 时,通过反射来判断当前 Toast 的情况,进而返回一个有效的 Toast 对象,再调用 show()

到这里就将 Toast 在 7.0 上的问题修复了,我们正常开发过程中,完全不需要担心 Toast 的使用,做质量保证的和做业务的也可以区分开了。

2.3 Booster 已经内置的功能

在 Booster 开源的时候,内部已经内置了一些 Transformer 和 Task,前面介绍的 booster-transform-bugfix-toast 就是其中之一。

内置 Transformers

  • booster-transform-bugfix-toast:修复 7.0 中 Toast 导致的系统错误。
  • booster-transform-lint:检查潜在的性能问题。
  • booster-transform-shrink:用于清除 class 文件中的常量。
  • booster-transform-usage:用于扫描特定 API 的使用情况。

内置 Tasks

  • Booster-task-artifact:提供显示 artifact 的 Task。
  • Booster-task-dependency:提供显示所有依赖项的标识符以及文件路径的 Task。
  • Booster-task-permission:提供显示所有依赖项使用的 Android 权限。

这些 Booster 提供的 Transformer 和 Task,功能还有限,它们更多的是提供一些指导意义,可以让我们通过源码了解到 Booster 的使用。

有更多想法,可以自己去实现 Transformer 和 Task。

在发布的 Roadmap 中,已经提出接下来几个版本的迭代计划,例如会专注:性能优化、Lint、资源压缩、用户体验等等。在性能优化上,会对多线程的使用、SP 的使用、WebView 的预加载进行针对性的优化。
三. 小结时刻

整体来看,Booster 是一个非常好的性能优化框架,它使用的都是成熟的技术,将其包装而成,降低了我们使用的难度。并没有什么太大的深坑,有需要可以进行尝试。
更多内容可以去 Github 上阅读 Wiki 和源码,有兴趣别忘点个 star。
Github:https://github.com/didi/booster
本文对你有帮助吗?留言、点赞、转发是最大的支持,谢谢!

资源分享

一线互联网面试专题

379页的Android进阶知识大全

379页的Android进阶知识大全

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2020年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ant booster 是一款特殊的增强器,主要用于增强蚂蚁的力量和能力。它是一种小巧便携的装置,可以通过与蚂蚁的身体接触,为其提供额外的力量和能量。该装置内置了先进的技术,能够将电能转化为蚂蚁能够利用的动力,从而使它们在各种活动中更加强大和灵活。 蚂蚁作为一种小而弱的生物,在其个体能力有限的情况下,通常通过群体合作来完成各种任务。然而,ant booster 的出现为蚂蚁赋予了更大的力量,使它们能够承担更为复杂和困难的任务。 ant booster 的使用有着广泛的应用。比如,在农业领域,蚂蚁常常被用来控制害虫的数量。而使用 ant booster 可以让蚂蚁更加高效地捕食害虫,保护农作物的生长。此外,在科学研究中,ant booster 也被利用来研究蚂蚁的行为和交流方式。通过提升蚂蚁的力量,研究者们可以更好地观察和记录它们的行为,进而深入了解蚂蚁的社会结构和组织。 当然,ant booster 也带来一些潜在的问题和争议。有人担心,过度依赖这类装置会削弱蚂蚁个体的自然进化能力,并对生态系统造成负面影响。因此,在使用 ant booster 时,需要慎重考虑其影响,并充分权衡其带来的利弊。 总而言之,ant booster 是一种可以提升蚂蚁力量和能力的装置,具有广泛应用和潜在的风险。它在农业和科学研究中发挥着重要作用,但使用时需要谨慎权衡利弊,避免不可预见的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值