无限重启-千牛app

一. 问题描述

1.1 问题JIRA

  XXX

1.2 现象

  手机无限重启,清数据后能开机,恢复数据的时候还是会无限重启.

1.3 结论

1.无限重启的原因:

  由于每次开机AccessibilityManagerService都会去解析每个有辅助功能的app,system_server每次解析到千牛时就会crash,然后陷入无限循环.

2.恢复出厂设置后能开机,恢复数据时又无限重启:

  恢复出厂设置后千牛会被卸载,开机时不会解析到它,所以能正常开机.恢复数据又会安装上千牛,安装上之后又会走到AccessibilityManagerService去解析千牛app,所以又会无限重启.

1.4导致问题的patch:

  XXX

1.5修复链接:

XXX

二. 初步分析

2.1 查看system_server crash traces

03-25 15:38:07.968 1000 2311 2311 W ResourceType: Bad string block: string #6751 is not null-terminated
03-25 15:38:07.968 1000 2311 2311 W ResourceType: CREATING STRING CACHE OF 179048 bytes
03-25 15:38:07.968 1000 2311 2311 W ResourceType: Bad string block: string #6751 decoded length is not correct -1 vs 77
03-25 15:38:07.968 1000 2311 2311 D AndroidRuntime: Shutting down VM
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.USER_SWITCHED flg=0x50000010 (has extras) } in com.android.server.accessibility.AccessibilityManagerService$2@5f00bfc
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_51571(LoadedApk.java:1314)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.$m$0(Unknown Source:4)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.run(Unknown Source:0)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:789)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:98)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at android.os.Looper.loop(Looper.java:164)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at com.android.server.SystemServer.run(SystemServer.java:438)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at com.android.server.SystemServer.main(SystemServer.java:275)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:780)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: Caused by: java.lang.IndexOutOfBoundsException
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at android.content.res.StringBlock.nativeGetString(Native Method)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at android.content.res.StringBlock.get(StringBlock.java:82)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at android.content.res.AssetManager.getPooledStringForCookie(AssetManager.java:336)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at android.content.res.TypedArray.loadStringValueAt(TypedArray.java:1274)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at android.content.res.TypedArray.getValueAt(TypedArray.java:1260)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at android.content.res.TypedArray.peekValue(TypedArray.java:1114)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at android.accessibilityservice.AccessibilityServiceInfo.<init>(AccessibilityServiceInfo.java:527)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at com.android.server.accessibility.AccessibilityManagerService.readInstalledAccessibilityServiceLocked(AccessibilityManagerService.java:1267)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at com.android.server.accessibility.AccessibilityManagerService.readConfigurationForUserStateLocked(AccessibilityManagerService.java:1848)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at com.android.server.accessibility.AccessibilityManagerService.switchUser(AccessibilityManagerService.java:1054)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at com.android.server.accessibility.AccessibilityManagerService.-wrap28(Unknown Source:0)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at com.android.server.accessibility.AccessibilityManagerService$2.onReceive(AccessibilityManagerService.java:420)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_51571(LoadedApk.java:1304)
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: ... 10 more


system_server 无限crash


对于分析java crash问题,我们首先看一下问题发生在哪一个servevice,然后再看一下具体crash的异常是什么,在这里我们能看到crash的service是AccessibilityManagerService,具体异常是IndexOutOfBoundsException.

2.2 手机断点调试

首先我们直接找到AccessibilityManagerService相关的最后的一个调用栈:

这里看上去是在解析资源文件,直接在代码里搜索了一下AccessibilityService_description是什么,找了半天没有找到这个资源.没办法自己找了个机器,然后断点调试看看这是什么东西:

首先这里会去查询packagemanager里所有关于"android.accessibilityservice.AccessibilityService"相关的service.

单步调试继续往下走:

继续点...

我们能看到每次peekedValue解析后都是一串字符串,看上去都和辅助功能有关系.点了很多次后发现一个规律,每一个有辅助功能的app都会被解析一遍.解析的内容看上去是app自己定义的,然后我找了一个com.miui.personalassistant应用看看它的AccessibilityService_description哪里来的,

首先去com.miui.personalassistant应用的AndroidManifest.xml中找到"android.accessibilityservice.AccessibilityService"

然我继续找到quickstart_accessibility


快要看到quickstart_accessibility_description的定义是什么了,如果和断点调试输出的内容"该服务为 [ 桌面信息助手 - 快捷功能卡片 ] 提供部分第三方应用页面的跳转支持,关闭该服务会导致页面跳转失效。"一样的话,那么这个AccessibilityService_description就能确定是app自定义的了.

点过去之后发现和自己的怀疑是一致的,这个资源是app自己定义的.到了这里得出了一个比较重要的信息,有可能是app自己定义了某些异常的字符串导致system_server解析失败,最终crash了.刚好有一个同事复现了这个问题,然后我拿到了现场之后继续debug,看看到底是哪一个app有问题呢?

经过多次断点调试发现每次都在解析千牛app的时候system_server crash了:

现在很怀疑就是千牛app导致的,我先把千牛这个apk从手机里pull出来(备份),然后用adb命令把这个apk卸载了,卸载完了之后立马就开机了.接着我再把千牛装上,system_server立刻又进入了无限crash的状态中.到这里已经得出了一个结论:千牛肯定和重启有关系.

2.3 找到出问题的patch

根据目前的结论"千牛肯定和重启有关系",然后调查了下是不是所有的机器都有这个问题,我随便找了几台手机装了我备份的千牛apk,装了好几台手机,全部无限重启....这问题真是相当的严重了,不知道是不是只有千牛一个app才会复现,要是还有其他app也复现,那就不得了了...

然后我们继续看数组越界这个地方是从哪里抛出来的异常:

Caused by: java.lang.IndexOutOfBoundsException
at android.content.res.StringBlock.nativeGetString(Native Method)
at android.content.res.StringBlock.get(StringBlock.java:82)
at android.content.res.AssetManager.getPooledStringForCookie(AssetManager.java:336)
at android.content.res.TypedArray.loadStringValueAt(TypedArray.java:1274)
at android.content.res.TypedArray.getValueAt(TypedArray.java:1260)
at android.content.res.TypedArray.peekValue(TypedArray.java:1114)


由于nativeGetString是个native方法,所以我们需要去对应的cpp文件中查找.一般这种方法都是放在"包名+方法+.cpp"文件中,所以我直接去找了"android_content_res_StringBlock.cpp"文件,找了一下没有找到这个文件.因为没有找到对应的文件,所以不清楚这个异常从哪里抛出来的.

因为这个问题是从某个版本才开始的,所以我逐个版本尝试装上千牛看看是不是会无限重启,最终确定了这个机器是在24号才开始复现的,接着直接去排查了那天的提交.

最终找到这个提交:

http://gerrit.pt.miui.com/#/c/262687/3/libs/androidfw/ResourceTypes.cpp


这个提交和我们的log刚好能匹配上:

03-25 15:38:07.968 1000 2311 2311 W ResourceType: Bad string block: string #6751 is not null-terminated
03-25 15:38:07.968 1000 2311 2311 W ResourceType: CREATING STRING CACHE OF 179048 bytes
03-25 15:38:07.968 1000 2311 2311 W ResourceType: Bad string block: string #6751 decoded length is not correct -1 vs 77
03-25 15:38:07.968 1000 2311 2311 D AndroidRuntime: Shutting down VM
03-25 15:38:07.969 1000 2311 2311 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main

随即revert掉这个change,然后带上有问题版本的manifest打了一个包进行了测试.结果是装上千牛也不会无限重启了.

三. 深入分析

因为没有找到抛异常的地方,所以还是不清楚这个问题的具体原因,为了继续调查原因我修改了这个patch,制造了一个native crash:

if (str[encLen] != 0x00) {
 ALOGW("Bad string block: string #%d %s is not null-terminated pzc",
  (int)idx, str);
 FILE *fd = fopen("/sys/class/switch/h2w/state", "r");
 fclose(fd);
 return NULL;
}

(系统中没有/sys/class/switch/h2w/state节点)

这里会fclose一个null的fd,然后system_server 会native crash,接着我得到了一个正确的native调用栈:

03-28 22:34:00.924 4614 4614 F DEBUG : backtrace:
03-28 22:34:00.924 4614 4614 F DEBUG : #00 pc 00000000000733f8 /system/lib64/libc.so (fclose+16)
03-28 22:34:00.924 4614 4614 F DEBUG : #01 pc 000000000001f294 /system/lib64/libandroidfw.so (_ZNK7android13ResStringPool9string8AtEmPm+264)
03-28 22:34:00.924 4614 4614 F DEBUG : #02 pc 0000000000108be0 /system/lib64/libandroid_runtime.so http://guard.pt.miui.com/opengrok2/xref/v8-n-mido-dev/frameworks/base/core/jni/android_util_StringBlock.cpp#91
03-28 22:34:00.924 4614 4614 F DEBUG : #03 pc 0000000001d30f6c /system/framework/arm64/boot-framework.oat (offset 0x1985000) (android.content.res.StringBlock.nativeGetString+136)
03-28 22:34:00.924 4614 4614 F DEBUG : #04 pc 0000000001d314cc /system/framework/arm64/boot-framework.oat (offset 0x1985000) (android.content.res.StringBlock.get+488)
03-28 22:34:00.924 4614 4614 F DEBUG : #05 pc 0000000001d091f0 /system/framework/arm64/boot-framework.oat (offset 0x1985000) (android.content.res.AssetManager.getPooledStringForCookie+92)
03-28 22:34:00.924 4614 4614 F DEBUG : #06 pc 0000000001d25ec0 /system/framework/arm64/boot-framework.oat (offset 0x1985000) (android.content.res.TypedArray.loadStringValueAt+236)
03-28 22:34:00.924 4614 4614 F DEBUG : #07 pc 0000000001d25d44 /system/framework/arm64/boot-framework.oat (offset 0x1985000) (android.content.res.TypedArray.getValueAt+240)
03-28 22:34:00.924 4614 4614 F DEBUG : #08 pc 0000000001d2ac34 /system/framework/arm64/boot-framework.oat (offset 0x1985000) (android.content.res.TypedArray.peekValue+80)
03-28 22:34:00.924 4614 4614 F DEBUG : #09 pc 000000000198ed50 /system/framework/arm64/boot-framework.oat (offset 0x1985000) (android.accessibilityservice.AccessibilityServiceInfo.<init>+1324)
03-28 22:34:00.924 4614 4614 F DEBUG : #10 pc 00000000010fb3f0 /system/framework/oat/arm64/services.odex (offset 0xee7000)

(这个地方是多线程的,我得到过很多不一样的调用栈,尝试很多次,终于得到一个对应java crash的调用栈)

然后终于找到了抛异常的地方:

解析字符串主要是在android_util_StringBlock.cpp中的android_content_StringBlock_nativeGetString方法中,会进行两次解析,解析对应的方法分别是:string8At/stringAt.

由于string8At和stringAt方法都解析失败,最终抛出了IndexOutOfBoundsException,刚好也能对应上我们的Log:

03-25 15:38:07.968 1000 2311 2311 W ResourceType: Bad string block: string #6751 is not null-terminated
03-25 15:38:07.968 1000 2311 2311 W ResourceType: CREATING STRING CACHE OF 179048 bytes



我们继续看看这个patch的改动:

这里原来并不会校验字符串的末尾,修改之后开始检验字符串的末尾了,由于末尾不等有0,所以返回了NULL.

四.总结所有的疑问

1.无限重启的原因:

  由于每次开机AccessibilityManagerService都会去解析每个有辅助功能的app,system_server每次解析到千牛时就会crash,然后陷入无限循环.

2.恢复出厂设置后能开机,恢复数据时又无限重启:

  恢复出厂设置后千牛会被卸载,开机时不会解析到它,所以能正常开机.恢复数据又会安装上千牛,安装上之后又会走到AccessibilityManagerService去解析千牛app,所以又会无限重启.


五.千牛app的资源为什么不正常

apktool反编译了千牛的app:

AndroidManifest.xml中:
</service>
<service android:exported="false" android:label="@string/as_label" android:name="com.taobao.qianniu.common.notification.as.ASMN" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" android:process=":mc">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
<meta-data android:name="android.accessibilityservice" android:resource="@xml/asc"/>
</service>

asc.xml中:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service android:description="@string/as" android:accessibilityEventTypes="typeAllMask" android:accessibilityFeedbackType="feedbackAllMask" android:notificationTimeout="100" android:accessibilityFlags="flagDefault" android:canRetrieveWindowContent="true"
xmlns:android="http://schemas.android.com/apk/res/android" />

string.xml中:
<string name="as" />

我发现as并没有值(是打包的时候出错了?),发邮件给千牛的app开发做了检查,目前还没有回复.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/256493.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

千牛服务器网站,千牛平台远程服务器

千牛平台远程服务器 内容精选 换一换 云堡垒机与RADIUS服务器对接&#xff0c;认证登录系统的用户身份。本小节主要介绍如何配置RADIUS域认证模式&#xff0c;并可对配置的RADIUS认证进行用户有效性测试。用户已获取系统模块管理权限。已获取RADIUS服务器相关信息。若需修改认证…

「从零入门推荐系统」19:HM推荐系统代码实战案例

作者 | gongyouliu 编辑 | gongyouliu 我们在上一章中利用Netflix prize数据集讲解了最基础、最简单的一些推荐系统召回、排序算法&#xff0c;大家应该对怎么基于Python实现推荐算法有了一些基本的了解了。接着上一章的思路&#xff0c;本章我们会基于一个更复杂、更近代一点的…

python clicknium 库自动化千牛桌面端

python clicknium 库自动化千牛桌面端 千牛是阿里巴巴集团卖家工作台&#xff0c;商家经营的必备工具&#xff0c;今天我们使用python来自动化千牛桌面端。 clicknium 是基于 python 实现的一套 免费的UI 自动化的库&#xff0c;功能强大、简单易用&#xff0c;可以用来操作桌…

登陆千牛时显示服务器失败,千牛登陆云服务器

千牛登陆云服务器 内容精选 换一换 本节操作介绍Linux操作系统云服务器在单用户模式下重置密码的操作步骤。本文档适用于X86架构的弹性云服务器。进入单用户模式下重置root密码前请先做好数据备份。请根据操作系统类型选择操作步骤&#xff1a;CentOS 8系列CentOS 7/EulerOS 系…

这些在 App Store 中找不到的 Mac 常用软件

由于 App Store 对软件的限制比较严格&#xff0c;加上对付费软件还会收取较高的抽成。所以很多软件都没有在 App Store 上架&#xff0c;它们有自己的官网&#xff0c;比如迅雷、搜狗输入法、谷歌浏览器、千牛、百度网盘等。 本文分享的常用软件已在下表列举&#xff0c;这些…

软考高级架构师笔记-5计算机网络

目录 1. 前言 & 考情分析2. 网络功能和分类2.1 通信技术3. OSI七层模型及协议3. 1 局域网和广域网协议3. 2 协议3. 3 交换技术、路由、传输介质4 IP地址5 网络存储技术6 其它考点8. 结语1. 前言 & 考情分析 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师笔…

OpenCV实战(25)——3D场景重建

OpenCV实战&#xff08;25&#xff09;——3D场景重建 0. 前言1. 重建 3D 场景1.1 3D 场景点重建1.2 算法原理 2. 分解单应性3. 光束平差法4. 完整代码小结系列链接 0. 前言 在《相机姿态估计》一节中&#xff0c;我们学习了如何在校准相机时恢复观察 3D 场景的相机的位置。算…

用 GPT-4 来面试,简直开挂啊!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 众所周知&#xff0c;ChatGPT 凭其超强的文本生成能力&#xff0c;成为了 2023 年最为火爆的 AI 应用之一。 几个月前&#xff0c;GPT-4 发布&#xff0c;又将 ChatGPT 的能力提升到了一个…

.Net Core——用代码写代码?

想要用代码写代码&#xff0c;肯定是绕不开反射的。反射的概念相比都不陌生&#xff0c;只是应用多少就因人而异&#xff0c;今天分享一个代码生成器的思路&#xff0c;仅供参考&#xff0c;不要过分依赖哦。 思路分析 众所周知&#xff0c;利用反射可以在程序运行时获取到任…

JAVA企业级开发 1.5 初探Spring AOP

一、提出游吟诗人唱赞歌任务 骑士执行任务前和执行任务后&#xff0c;游吟诗人唱赞歌 &#xff08;一&#xff09;采用传统方式实现 修改day04子包的勇敢骑士类 修改day04子包里的救美骑士类 执行测试类 - TestKnight &#xff08;二&#xff09;采用传统方式实现的缺…

【JavaSE】Java基础语法(三十九):网络编程入门

文章目录 1. 网络编程概述2. 网络编程三要素3. IP地址4. InetAddress5. 端口和协议 1. 网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络 操作系统&#xff0c;网络管理软件及网络通信协…

欧拉与莫比乌斯

更多文章可以在本人的个人小站&#xff1a;https://kaiserwilheim.github.io 查看。 转载请注明出处。 初稿写于2021-10-10&#xff0c; 再修改于2022-02-07 Achtung: 本文章使用p来代指“任意质数”&#xff0c;请勿混淆。 首先让我们膜拜一下莱昂哈德欧拉(Leonhard Euler)…

贝塞尔

贝塞尔曲线可视化链接 介绍&#xff1a; 贝塞尔曲线&#xff0c;又称贝兹曲线或贝济埃曲线&#xff0c;是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线&#xff0c;贝兹曲线由线段与节点组成&#xff0c;节点是可拖动的支点&#xff0c;线段像可…

详解人工智能的五大思想流派 元芳你支持哪一派?

▼ 点击上方蓝字 关注网易智能 聚焦AI&#xff0c;读懂下一个大时代&#xff01; 【网易智能讯 3月1日消息】未来的就业形势还能依靠科技巨头和首席执行官们来决定&#xff0c;而人工智能的未来&#xff0c;依旧充满了太多的不确定性。 这一状况是源自于人工智能及其在科技行业…

【科大讯飞】全球首款,Mobius莫比斯同声翻译耳机 ,AI智能运动耳机 ,支持英日法韩俄西班牙6种语音...

© 程序员严选 丨 为您甄选全球好物 科大讯飞重磅推出 翻译界的最新黑科技神器 同声翻译 智能耳机 对方说外语&#xff0c;耳机就会同声语音翻译出来哦~ 。。。 著名语音AI品牌科大讯飞与咪咕联合打造了一款智能翻译耳机&#xff0c;全球首款全语音人工智能耳机——Mobius…

DailyMart03:如何基于DDD设计商城的领域模型?

大家好&#xff0c;我是飘渺。既然有人催更那今天咱们就继续更新DDD&微服务系列&#xff01; 在面向对象开发中&#xff0c;所有事物都可以看作是对象。然而&#xff0c;在日常开发中&#xff0c;我们通常从数据出发来设计对象的表现形式&#xff0c;这种做法侧重于数据属性…

哈萨比斯的人类补完计划

在著名动漫《新世纪福音战士》里&#xff0c;碇源堂和他背后的SEELE组织始终在执行一项叫做“人类补完计划”的神秘行动。 这个计划到底是什么意思&#xff0c;粉丝们已经争吵了很多年。但大体上应该是说利用“神性”来补完人类族群&#xff0c;从而消除人类社会中的种种问题。…

阿基里斯之踵

阿基里斯是古希腊神话中最伟大的英雄之一。相传&#xff0c;他的母亲是一位女神&#xff0c;在他降生之初&#xff0c;女神为了使他长生不死&#xff0c;将他浸入冥河洗礼。阿基里斯从此刀枪不入&#xff0c;百毒不侵&#xff0c;只有一点除外———他的脚踵当时被女神提在手中…

麦比乌斯带

数学家们吐露&#xff0c;麦比乌斯带只有单面&#xff0c;如果你要将它分成两半&#xff0c;你将会感到十分可笑&#xff0c;因为分开后还是一条带。 莫比乌斯环的奇妙之处有三&#xff1a; 一、莫比乌斯环只存在一个面。 二、如果沿着莫比乌斯环的中间剪开&#xff0c;将会形成…