5g互联如何取消网站备案,做宣传页的软件是什么,三木做网站,网页设计素材源文件背景#xff1a;
平常做rom相关开发时候经常需要与settings值打交道#xff0c;需要独立或者存储一个settings的场景#xff0c;群里有个学员朋友就问了一个疑问#xff0c;那就是Settings的putString方式来存储字符#xff0c;那么可以存储的最大字符是多少呢#xff1…背景
平常做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 halperfettosurfaceflinger
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