android系统中data下的xml乱码无法查看问题剖析及解决方法

背景:

Android12高版本以后系统生成的很多data路径下的xml都变成了二进制类型,根本没办法看xml的内容具体如下:

比如想要看当前系统的widget的相关数据

./system/users/0/appwidgets.xml

以前老版本都是可以直接看的,这些system的xml其实对于调试和分析等有时候还是很有作用的

那么这到底是为什么呢,要把这种用户可读的xml变成这种乱码二进制的xml,难道是为了安全加密???具体啥原因我们来分析分析

具体原因分析

代码路径:

frameworks/base/core/java/android/util/Xml.java

具体原因可以从相关的注释看出:

使用BinaryXmlSerializer最重要原因是:

1、可以有更快的速度

2、更小的体积

如何把二进制变成正常可读xml

方法1:

适合debug等版本上,可以随意进行恢复出厂删除相关的xml的场景

具体操作:

改变属性,删除原来的xml,或者恢复出厂,让系统重新生成xml,

属性修改如下:

adb shell setprop persist.sys.binary_xml false

修改后在把相关的xml要进行删除重启触发重新生成xml

或者去相关代码中

修改如下:

修改前看看appwidget.xml的展示数据
一堆的乱码根本没办法看

修改后的看看appwidget.xml的展示数据
明显可以看出是可以读了

方法2:

这种属于已有了这种二进制格式的xml,也不想清除这个xml让重新生成,因为这样可能重新生成的数据就不是原来xml的数据。

所以得考虑把原来的二进制格式的xml 转化成可读xml文件

实际两种xml本事是有标识头的,根据xml的标识头就可以确定是二进制xml还是普通xml,从而选择正确解析方法

不过这种工具还没有找到现成的,如果实在没有考虑后续写个这种转换工具进行开源

总结:

高版本安卓主要是考虑到使用二进制xml

1、二进制xml的性能方面速度比传统xml快

2、占用数据体积比传统xml要小

以上两个优势就是使用二进制xml根本原因,系统默认二进制xml也是可以通过标志位修改变成普通xml,但是要清除数据重新生成,想要二进制xml直接变成普通xml需要对原来的二进制xml进行解析后重新写入新的普通xml

更多framework详细代码和资料参考如下链接

hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg

其他课程七件套专题:

点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

更多framework假威风耗:androidframework007

相关推荐
行墨8 分钟前
Kotlin 主构造函数
android
前行的小黑炭11 分钟前
Android从传统的XML转到Compose的变化:mutableStateOf、MutableStateFlow;有的使用by有的使用by remember
android·kotlin
_一条咸鱼_15 分钟前
Android Compose 框架尺寸与密度深入剖析(五十五)
android
XiaoLeisj22 分钟前
【MyBatis】深入解析 MyBatis XML 开发:增删改查操作和方法命名规范、@Param 重命名参数、XML 返回自增主键方法
xml·java·数据库·spring boot·sql·intellij-idea·mybatis
在狂风暴雨中奔跑28 分钟前
使用AI开发Android界面
android·人工智能
行墨29 分钟前
Kotlin 定义类与field关键
android
信徒_1 小时前
Mysql 在什么样的情况下会产生死锁?
android·数据库·mysql
大胡子的机器人2 小时前
安卓中app_process运行报错Aborted,怎么查看具体的报错日志
android
goto_w2 小时前
uniapp上使用webview与浏览器交互,支持三端(android、iOS、harmonyos next)
android·vue.js·ios·uni-app·harmonyos
QING6183 小时前
Kotlin Random.Default用法及代码示例
android·kotlin·源码阅读