存储优化和Protobuf

存储优化和Protobuf

本文链接:https://blog.csdn.net/feather_wch/article/details/131649688

文章目录

  • 存储优化和Protobuf
    • Android存储方式
    • Protobuf
      • 介绍
      • 使用
      • 原理
    • 7z压缩

Android存储方式

1、Android存储方式

  1. SharePreference
  2. SQLite: 复杂的数据结构
  3. File -> protobuf,7z
  4. ContentProvider -> 和SQLite密切使用
  5. ContentResolver.call 可以实现AIDL效果,手机厂商做系统开发用的还蛮多。
  6. 网络 -> 序列化、反序列化 -> protobuf、xml、json

2、SharePreference的commit和apply是什么?

  1. apply没有返回值,commit返回boolean代表是否成功
  2. commit同步提交到硬盘;apply立即提交到内存,开启异步线程提交到硬盘,提交失败也不会通知
  3. commit同步;apply异步
  4. 主线程commit会出现anr

3、SharePreference支持多进程吗?

  1. 读支持
  2. 写不支持
  3. 总结:不支持

4、SQLite

  1. SQLiteStatement: 1000数据提高5s
  2. 事务
  3. 索引: 索引的原理

5、序列化

Protobuf

介绍

1、Protobuf相比于json、xml优点

  1. 使用简洁
  2. 体积小:大小只有xml 10%~33%(可变编码)
  3. 速度快:比xml快60~100倍
  4. Protobuf编译系统,编译成Java代码
  5. 兼容性好:更好线上线下兼容
  6. 缺点:可读性差

使用

  1. 根目录build.gradle文件中引入protobuf插件的classpath
buildscript {dependencies {classpath 'com.google.protobuf:protobuf-gradle-plugin:0.9.3'}
}
  1. app目录build.gradle中应用插件
plugins {id 'com.google.protobuf'
}
  1. app目录build.gradle引入支持库
///引入支持库
implementation 'com.google.protobuf:protobuf-java:3.5.1'
  1. app目录build.gradle中配置compileOptions、packagingOptions、sourceSets
android {// 省略compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}packagingOptions {exclude 'META-INF/NOTICE' // will not include NOTICE fileexclude 'META-INF/LICENSE' // will not include LICENSE file}sourceSets {main {java {srcDir 'src/main/java'}resources  {srcDir 'src/main/proto'//这里main下面存放.proto文件的目录名称不能为protobuf}}}
}
  1. app目录build.gradle中配置protoc编译器
protobuf {//配置protoc编译器protoc {artifact = 'com.google.protobuf:protoc:3.5.1'}//这里配置生成目录,编译后会在build的目录下生成对应的java文件generateProtoTasks {all().each { task ->task.builtins {remove java}task.builtins {java {}}}}
}
  1. 创建目录:src/main/proto
  2. 放入编写的proto文件: package、java_package目录要和我们的一样
syntax = "proto3";
package com.test.myproto;//包名option java_package = "com.test.myproto";
option  java_outer_classname = "Person";
option csharp_namespace = "android";
message _Person{string name = 1;int32 id = 2;string email = 3;enum _PhoneType{MOBILE = 0;HOME = 1;WORK = 2;}message _PhoneNumber{string number =1;_PhoneType type = 2;}repeated _PhoneNumber phone = 4;//数组
}
  1. 编写测试代码 kotlin版本
// Bean -> protobufvar personBuilder = Person._Person.newBuilder().setName("wch").setId(2).setEmail("xxx@qq.com")var phoneNumberBuilder = Person._Person._PhoneNumber.newBuilder().setNumber("110").setType(Person._Person._PhoneType.HOME);var person = personBuilder.addPhone(phoneNumberBuilder) // 集合中添加数据.build()var byteArray = person.toByteArray()println(Arrays.toString(byteArray))// protobuf -> Beanvar newPerson = Person._Person.parseFrom(byteArray)println(newPerson.toString())

原理

1、protobuf原理:变长编码

tag-length-value
  1. 采用小端字节序

7z压缩

  • 7zip实战: JNI+NDK
  • 用命令行方式让底层去处理

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

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

相关文章

以太网(Ethernet)入门了解

以太网(Ethernet)是一种常见的局域网(LAN)通信协议,它是由Xerox公司于1970年代中期开发的。以太网是一种基于广播技术的开放式网络协议,它允许设备在共享通信介质上进行通信。以下是关于以太网的基本概念、…

MySQL 多表查询练习

1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) );创建score表。SQL代码如下: CREATE TABLE s…

OpenCV 入门教程:Laplacian算子和Canny边缘检测

OpenCV 入门教程: Laplacian 算子和 Canny 边缘检测 导语一、Laplacian 算子二、Canny 边缘检测三、示例应用3.1 图像边缘检测3.2 边缘增强 总结 导语 边缘检测在图像处理和计算机视觉领域中起着重要的作用。 Laplacian 算子和 Canny 边缘检测是两种常用的边缘检测…

CAT1模块 EC800M HTTP使用总结记录

分享记录一下 CAT1 模块EC800 HTTP 协议使用流程 ...... by 矜辰所致目录 前言一、基础说明1.1 CAT1 与 4G1.2 EC800M 模块1.3 HTTP 二、开始使用2.1 硬件设计部分2.2 模块上电流程2.3 PDP 上下文2.3.1 什么是 SGSN 和 GGSN ? 三、 HTTP 流程3.1 客户端3.1.1 PDP 上…

Spring MVC JSON 数据交互

🔔 JSON 语法 | 菜鸟教程 为实现浏览器与控制器类之间的 JSON 数据交互, Spring MVC 提供了 MappingJackson2HttpMessageConverter 实现类默认处理 JSON 格式请求响应。该实现类利用 Jackson 开源包读写 JSON 数据,将 Java 对象转换为 JSO…

k8s发生故障,可以从哪些方面排查

目录 第一方面:审视集群状态 第二方面:追踪事件日志 第三方面:聚焦Pod状态 第四方面:检查网络连通性 第五方面:审视存储配置 第六方面:研究容器日志 第一方面:审视集群状态 K8S的集群状态…

Ubuntu18.04 系统安装 Docker

1、首先更新软件源: sudo apt-get updatesudo apt-get upgrade 2、安装Docker: sudo apt install docker -y 3、查看安装的Docker apt list docker 4、查看docker 进程 ps -ef|grep docker 5、查看docker 版本有问题 6、开启Docker服务 systemctl…

10_SPI_Flash 连续写实验

10_SPI_Flash 连续写实验 1. 实验目标2. 连续写方法3. 操作时序4. 流程框图4.1 顶层模块4.2 连续写模块 5. 波形图6. RTL6.1 flash_seq_wr_ctrl6.2 spi_flash_seq_wr 7. Testbench 1. 实验目标 使用页写指令,将串口发送过来的连续不定量数据写入 Flash。本实验中&a…

Web安全——数据库mysql学习

数据库mysql基础 Web安全分享一、数据库的基本操作1、MYSQL登录与退出2、MYSQL数据库的一些解释3、MYSQL注释符有三种: 二、数据库的一些基本操作1、数据库的增删改查(sql语句) 三、table 表的操作1、查看表结构2、查看表的内容3、建立表4、约束条件5、修改表的操作…

网络通信原理系统的认知(NEBASE第十四课)

1 物理层 第一层 物理层:建立、维护、断开物理连接,定义了接口及介质,实现了比特流的传输。 1.1传输层介质分类 有线介质:网线 (双绞线)光纤 无线: 无线电 1.2 双绞线 五类线 cat5 :适用 10…

“深入解析Redis的数据结构与应用场景“

标题:深入解析Redis的数据结构与应用场景 摘要:本文将深入解析Redis的数据结构与应用场景,包括字符串、列表、哈希表、集合和有序集合。通过详细介绍每种数据结构的特点和常见使用场景,帮助开发工程师更好地理解和应用Redis。 正…

Docker的使用

1. Docker的含义 1. 镜像:别人开发好的基础,类似C中的类 2. 容器:自己创建的实例 2.如何使用docker 可以从网上拉取相应的镜像,然后宿主机以下命令:创建Dockerfile文件docker build -t image_name:tag . 创建自己的do…

RxJava 2.0 全体系梳理(持续更新ing)

事件流 数据流 如何组合和变换流 如何订阅任何可观察的数据流 目录 一.源码解析 二.基本使用 步骤 一、创建Observable 二、创建Observer 三、使用subscribe进行订阅 四、取消订阅 Disposable 五种Observable(被观察者) Observable 和 Observer Cold Observable …

第二次CCF计算机软件能力认证

第一题:相邻数对 给定 n 个不同的整数,问这些数中有多少对整数,它们的值正好相差 1。 输出格式 输入的第一行包含一个整数 n,表示给定整数的个数。 第二行包含所给定的 n 个整数。 输出格式 输出一个整数,表示值正好相…

KMP算法

KMP KMP 算法是一个快速查找匹配串的算法,它的作用其实就是本题问题:如何快速在「原字符串」中找到「匹配字符串」。 而 KMP 算法的复杂度为 O(mn)实际上是O(N),因为O(M)不可能大于O(N) KMP 之所以能够在 O(mn)复杂度内完成查找,是因为其能…

uniapp:tabBar配置后不显示的问题

问题描述 uniapp的tabBar配置后不显示 问题解决 tabBar.list 数组的第一项必须和pages配置中的第一项要相同 参考文章 uniapp tabBar配置后不显示,无效的问题

巴斯夫与长三角物理研究中心开展合作,专注固态和钠离子电池领域

“巴斯夫,全球知名化学公司,宣布与长三角物理研究中心合作,在江苏溧阳市成立联合研究中心,专注于固态电池和钠离子电池的科研。” 根据巴斯夫官方微博消息,新成立的研究中心名为“巴斯夫–长三角物理研究中心新能源汽车…

高德地图的使用

JS API 结合 Vue 使用 高德地图 jsapi 下载、引入 npm add amap/amap-jsapi-loaderimport AMapLoader from amap/amap-jsapi-loader 使用2.0版本的loader需要在window对象下先配置 securityJsCode JS API 安全密钥使用 JS API 使用 script 标签同步加载增加代理服务器设置…

【计算机网络】网络编程套接字(二)

文章目录 网络编程套接字(二)简单TCP服务器实现创建套接字服务器绑定服务器监听服务器接收连接服务器处理请求 简单TCP客户端实现创建套接字客户端发起连接客户端发起请求 服务器简单测试服务器简单测评多进程版TCP服务器捕捉SIGCHLD信号孙子进程提供服务…

【RuoYi-Cloud-Plus】学习笔记 09 - Sentinel(四)熔断降级知识整理

文章目录 前言参考目录版本说明学习笔记1、包结构2、DegradeSlot3、DegradeRule4、DegradeRuleManager5、CircuitBreaker5.1 CircuitBreaker.State6、AbstractCircuitBreaker6.1、AbstractCircuitBreaker#fromCloseToOpen6.2、AbstractCircuitBreaker#fromHalfOpenToOpen6.3、A…