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

背景:

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

Settings数据存放的变化:

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

abx2xml settings_global.xml settings_global-read.xml

在这里插入图片描述

测试Setting写入大量数据

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

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

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

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

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详细代码和资料参考如下链接
投屏专题部分:
https://mp.weixin.qq.com/s/IGm6VHMiAOPejC_H3N_SNg
hal+perfetto+surfaceflinger

https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

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

参考相关链接:
https://blog.csdn.net/zhimokf/article/details/137958615

更多framework假威风耗:androidframework007

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel锁定单元格,使其不可再编辑

‌在Excel中&#xff0c;锁定单元格后仍然可以编辑‌&#xff0c;这主要涉及到对特定单元格或区域的锁定与保护工作表的设置。以下是实现这一功能的具体步骤&#xff1a; ‌解除工作表的锁定状态‌&#xff1a;首先&#xff0c;需要全选表格&#xff08;使用CtrlA快捷键&#x…

[数据集][目标检测]中草药类型识别检测数据集VOC+YOLO格式7976张45类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7976 标注数量(xml文件个数)&#xff1a;7976 标注数量(txt文件个数)&#xff1a;7976 标注…

2024新动态:低代码开发占领新常态市场

随着技术的不断进步和数字化转型的加速&#xff0c;企业对于快速开发和部署应用程序的需求日益增长。2024年&#xff0c;低代码开发平台已经成为新常态市场的重要力量&#xff0c;它通过简化应用程序的开发过程&#xff0c;让非技术背景的业务用户也能参与到软件开发中来&#…

【C++】哈希桶

前言 哈希桶是哈希表中用于存储数据的基本单元&#xff0c;也称为哈希槽或存储桶。 哈希桶&#xff08;Hash Bucket&#xff09;** 是哈希表数据结构中的一个概念。、哈希表通过哈希函数将输入数据映射到一个存储位置&#xff0c;而哈希桶就是这些存储位置中的一个单元。哈希桶…

WPF入门教学六 Grid布局进阶

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;Grid布局是一种非常强大且灵活的布局控件&#xff0c;它允许你创建复杂的用户界面。以下是Grid布局的一些进阶技巧和教学&#xff1a; 一、基本概念回顾 Grid定义&#xff1a;Grid是一个用于布局…

深度学习(6):Dataset 和 DataLoader

文章目录 Dataset 类DataLoader 类 Dataset 类 概念&#xff1a; Dataset 是一个抽象类&#xff0c;用于表示数据集。它定义了如何获取数据集中的单个样本和标签。 作用&#xff1a; 为数据集提供统一的接口&#xff0c;便于数据的读取、预处理和管理。 关键方法&#xff…

AI公司的妄念:招个AI产品经理来想idea

AI公司在探索方向时&#xff0c;一旦老板或负责人的想法陷入瓶颈&#xff08;或没时间想特别细分的方向&#xff09;&#xff0c;往往会希望招一个AI产品经理来想idea&#xff08;创新/探索新方向&#xff09;&#xff0c;预期他某天突然想出个特别好的idea。 一、这个思路&…

【机器学习】12-决策树1——概念、特征选择

机器学习10-决策树1 学习样本的特征&#xff0c;将样本划分到不同的类别&#xff08;分类问题&#xff09;或预测连续的数值&#xff08;回归问题&#xff09;。 选择特征&#xff0c;划分数据集&#xff0c;划分完成形成模型&#xff08;树结构&#xff09;&#xff0c;一个…

OSI 七层模型和TCP/IP 四层模型的区别

目录 OSI 七层模型 介绍 1. 物理层&#xff08;Physical Layer&#xff09; 2. 数据链路层&#xff08;Data Link Layer&#xff09; 3. 网络层&#xff08;Network Layer&#xff09; 4. 传输层&#xff08;Transport Layer&#xff09; 5. 会话层&#xff08;Session …

【网络安全】基础知识详解(非常详细)零基础入门到精通,收藏这一篇就够了

一、什么是网络安全&#xff1f; 百度上对“网络安全”是这么介绍的&#xff1a; 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露、系统连续可靠正常地运行&#xff0c;网络服务不中断。” 嗯…是不…

地表最强开源大模型!Llama 3.2,如何让你的手机变身私人智能助理

你有没有想过&#xff0c;为什么现在的手机越来越像小型电脑&#xff1f;无论是拍照、看视频&#xff0c;还是用各种APP&#xff0c;甚至是AI助手&#xff0c;手机的功能几乎无所不能。其实&#xff0c;这一切的背后有一个技术正在悄悄改变我们的生活&#xff0c;那就是Llama 3…

开发手札:内网开发Unity导致操作和编译卡顿的问题

最近一个工程切换了最新的unity和packages&#xff0c;在外网开发没什么问题&#xff0c;切换到内网接入保密开发后&#xff0c;发现不论是操作编辑器还是编译代码&#xff0c;巨卡无比。 以上是仅仅写了一句int a 1;后&#xff0c;编译代码的速度。 经过分…

初试Bootstrap前端框架

文章目录 一、Bootstrap概述二、Bootstrap实例1、创建网页2、编写代码3、代码说明4、浏览网页&#xff0c;查看结果5、登录按钮事件处理6、浏览网页&#xff0c;查看结果 三、实战小结 一、Bootstrap概述 大家好&#xff0c;今天我们将一起学习一个非常流行的前端框架——Boot…

在虚幻引擎中实时显示帧率

引擎自带了显示帧率的功能 但是只能在编辑器中显示 , 在游戏发布后就没有了 , 所以我们要自己做一个 创建一个控件蓝图 创建画布和文本 , 修改文本 文本绑定函数 , 点击创建绑定 添加一个名为 FPS 的变量 格式化文本 用大括号把变量包起来 {FPS Int} FPS 然后转到事件图表…

【论文串烧】多媒体推荐中的模态平衡学习 | 音视频语音识别中丢失导致的模态偏差对丢失视频帧鲁棒性的影响

文章目录 一、多媒体推荐中的模态平衡学习1.1 研究背景1.2 解决问题1.3 实施方案1.4 文章摘要1.5 文章重点1.6 文章图示图 1&#xff1a;不同模型变体在 AmazonClothing 数据集上的初步研究图 2&#xff1a;CKD模型架构的说明图 3&#xff1a;在 Amazon-Clothing 数据集上训练过…

Android 内核开发之—— repo 使用教程

前言 repo 是一个用于管理多个 Git 仓库的工具&#xff0c;特别适用于管理大型项目如 Android 的源码。它是由 Google 开发的&#xff0c;用于解决多个 Git 仓库的同步、管理和代码审查等问题。因此&#xff0c;做 Android 内核开发&#xff0c;首先要了解 repo 是什么&#x…

企业级-pdf预览-前后端

作者&#xff1a;fyupeng 技术专栏&#xff1a;☞ https://github.com/fyupeng 项目地址&#xff1a;☞ https://github.com/fyupeng/distributed-blog-system-api 留给读者 本文 一、介绍 对于PDF预览&#xff0c;有很多开发者都遇到过头疼的难题&#xff0c;今天给大家介绍…

数据库的全透明加密和半透明加密主要是针对数据存储安全的不同处理方式

数据库的全透明加密和半透明加密主要是针对数据存储安全的不同处理方式。 全透明加密&#xff08;也称作无损加密或自动加密&#xff09;就像是给文字戴上了一层无形的面具。在用户看来&#xff0c;他们在数据库中输入的是明文&#xff08;比如姓名、密码&#xff09;&#xf…

科研绘图系列:R语言多个AUC曲线图(multiple AUC curves)

文章目录 介绍加载R包导入数据数据预处理画图输出结果组图系统信息介绍 多个ROC曲线在同一张图上可以直观地展示和比较不同模型或方法的性能。这种图通常被称为ROC曲线图,它通过比较不同模型的ROC曲线下的面积(AUC)大小来比较模型的优劣。AUC值越大,模型的诊断或预测效果越…

《C++编程魔法:构建绿色主题的奇幻游戏世界》

在游戏开发的浩瀚宇宙中&#xff0c;色彩扮演着至关重要的角色。它不仅能营造氛围、激发情感&#xff0c;还能为玩家带来沉浸式的体验。想象一下&#xff0c;一个以绿色为主色调的游戏场景&#xff0c;充满生机与活力&#xff0c;仿佛让人置身于神秘的自然世界。本文将带你深入…