安卓Settings值原理源码剖析存储最大的字符数量是多少?

背景:

平常做rom相关开发时候经常需要与settings值打交道,需要独立或者存储一个settings的场景,群里有个学员朋友就问了一个疑问,那就是Settings的putString方式来存储字符,那么可以存储的最大字符是多少呢?针对这个问题我们来剖析一下Setting值存储最大字符是多少个。

Settings数据存放的变化:

Google修改了SettingsProvider,涉及到了global,secure,system 三个表;并且实现方式从之前的数据库,改为异步性能更加优良的xml,每个用户都有自己的一份SettingsProvider设置xml文档。通常位于 /data/system/users/userid/ 下面,具体如下图: 但是直接看是一般乱码,这个因为是二进制的xml。 参考这个文章使用如下命令:

bash 复制代码
abx2xml settings_global.xml settings_global-read.xml

测试Setting写入大量数据

下面就准备一个大的字符串然后写入settings的调用

cpp 复制代码
   StringBuffer stringBuffer = new StringBuffer();
	for (int i = 0;i < 75536;i++) {
		stringBuffer.append('b');
	}  
	Settings.Global.putString(decorView.getContext().getContentResolver(),"key_max1",stringBuffer.toString());

写入后可以通过查看日志方式,看看 是否有异常。

结果真的在日志中可以看到产生了如下异常:

bash 复制代码
09-19 00:14:55.127   524   598 E SettingsState: Failed to write settings, restoring backup
09-19 00:14:55.127   524   598 E SettingsState: java.io.IOException: Modified UTF-8 length too large: -75536
09-19 00:14:55.127   524   598 E SettingsState: 	at com.android.internal.util.ArtFastDataOutput.writeUTF(ArtFastDataOutput.java:85)
09-19 00:14:55.127   524   598 E SettingsState: 	at com.android.modules.utils.BinaryXmlSerializer.attribute(BinaryXmlSerializer.java:207)
09-19 00:14:55.127   524   598 E SettingsState: 	at com.android.providers.settings.SettingsState.setValueAttribute(SettingsState.java:1013)
09-19 00:14:55.127   524   598 E SettingsState: 	at com.android.providers.settings.SettingsState.writeSingleSetting(SettingsState.java:985)
09-19 00:14:55.127   524   598 E SettingsState: 	at com.android.providers.settings.SettingsState.doWriteState(SettingsState.java:872)
09-19 00:14:55.127   524   598 E SettingsState: 	at com.android.providers.settings.SettingsState.-$$Nest$mdoWriteState(SettingsState.java:0)
09-19 00:14:55.127   524   598 E SettingsState: 	at com.android.providers.settings.SettingsState$MyHandler.handleMessage(SettingsState.java:1239)
09-19 00:14:55.127   524   598 E SettingsState: 	at android.os.Handler.dispatchMessage(Handler.java:106)
09-19 00:14:55.127   524   598 E SettingsState: 	at android.os.Looper.loopOnce(Looper.java:205)
09-19 00:14:55.127   524   598 E SettingsState: 	at android.os.Looper.loop(Looper.java:294)
09-19 00:14:55.127   524   598 E SettingsState: 	at android.os.HandlerThread.run(HandlerThread.java:67)

源码分析:

可以看出明显是打开xml写入xml的过程,再看看writeSingleSetting方法。 最后调用到了 frameworks/base/core/java/com/android/internal/util/ArtFastDataOutput.java 这里的MAX_UNSIGNED_SHORT值是65535

修改一下写入代码变成比65535小的话就可以写入: 导出xml看看结果:

总结:

1、settings相关的数据最后是存在xml中,app层面都是通过SettingProvider调用到systemserver进程进行保存

2、xml中写入相关字符时候,对字符长度有限制,是65535,一旦比这个大则会写入异常

更多framework技术干货,请关注下面"千里马学框架"

相关推荐
雪碧聊技术6 分钟前
Vue + Element Plus 实现文本溢出显示省略号及悬浮提示
前端·javascript·css·vue.js·文本溢出省略
eric-sjq8 分钟前
0.6B 前端生成模型本地部署实战:消费级显卡跑通 WanlyFrontend 全流程
前端·本地部署
小妖6661 小时前
设置了 box-sizing: border-box; 不管用,下边框还是被挤压没了
前端·css·html
雪隐2 小时前
个人电脑玩AI-16让5060 Ti给你打工——5060Ti 16G 跑 MiniMax-Music-3:从下载到 60s 出歌的全流程
前端·人工智能·后端
CAD老兵3 小时前
让 AI Coding Agent 直接访问 CAD 文档:GitMCP 实战指南
前端·人工智能·github
程序员鱼皮3 小时前
DeepSeek Harness 最新邪修曝光!被吹成核弹的极简模式,真的夯吗?
前端·后端·ai编程
无己心3 小时前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
袅沫3 小时前
Nginx中部署多个前端项目——区分路径
服务器·前端
Asize3 小时前
为什么写代码前要先规划组件树?Next.js + Redis 笔记系统实战
前端·javascript·next.js
用户921080262863 小时前
6. 数据大屏 WebSocket 稳定性优化:心跳检测、断点续传和消息去重
前端