一文学习Android中的Property

news2024/11/12 21:46:18

在 Android 系统中,Property 是一种全局的键值对存储系统,允许不同组件和进程间以轻量级的方式进行数据传递。它主要用于系统配置、状态标识等场景,使得不同进程能够通过属性的设置或获取来通信。property 的核心特性是快速、高效,并且对所有进程都可见,非常适合配置、标志位等需求。

在这里插入图片描述

一、Property 基础概念

1. 结构和特性

  • 键值对形式:每个 property 由一个键和一个值组成,键名一般是一个字符串,用点号分隔,用于标识模块和配置项(如 ro.build.version.sdk)。
  • 存储类型:所有 property 的键和值都是字符串。
  • 系统全局可见:property 在整个 Android 系统内都是可见的,任何进程可以读取大部分属性,但写入权限受到限制。

2. 属性命名约定

  • ro. 开头:表示只读属性,通常在系统启动时由系统设置,应用启动后无法更改。常用于设备和系统版本信息。
  • sys. 开头:表示系统级属性,系统内大部分组件可以设置和读取,适用于状态标识和通信。
  • persist. 开头:表示持久化属性,会被保存到设备的持久化存储中,即使重启设备也会保留。
  • ctl. 开头:用于控制系统服务的启动和停止。

二、Property 的使用场景

  • 系统版本信息:如 ro.build.version.release,表示 Android 系统的版本信息。
  • 设备硬件信息:如 ro.product.model,表示设备型号。
  • 进程间通信:在特定条件下,应用可以通过设置或监听属性来触发或响应事件。
  • 调试和开发:很多系统属性可以用于调试,例如 debug 开头的属性,常用于控制调试输出。

三、使用方式

Android 中的 property 操作主要有三种方法:adb shell 命令、SystemProperties 类,以及 prop 文件。

1. 使用 adb shell 命令

在调试过程中,可以使用 adb shell 命令直接操作 property

# 获取属性值
adb shell getprop ro.build.version.release

# 设置属性值(仅限系统允许的属性)
adb shell setprop sys.example.property "Hello"

2. 使用 SystemProperties 类

在 Android 应用开发中,可以使用 SystemProperties 类来获取或设置 property

import android.os.SystemProperties;

public class PropertyExample {
    public static void main(String[] args) {
        // 获取属性值
        String sdkVersion = SystemProperties.get("ro.build.version.sdk");
        System.out.println("SDK Version: " + sdkVersion);

        // 设置属性值(仅限允许设置的属性)
        SystemProperties.set("sys.example.property", "Hello Android");
    }
}

注意:大部分系统属性是只读的,应用进程一般无权限写入。

3. 通过 prop 文件配置

在 Android 系统启动过程中,系统会从 /system/build.prop 等多个文件中读取属性,这些文件存储了默认的系统属性。

常见的文件:

  • /system/build.prop:包含系统的核心属性,例如系统版本信息。
  • /vendor/build.prop:包含供应商相关的硬件信息。
    开发者可以在定制 ROM 时修改这些文件,以设定设备的默认属性。

四、Property 的实现机制

1. 内存区域

Android 系统为 property 分配了一个专用的共享内存区域,通过匿名共享内存和内核进程间通信 (IPC) 机制,实现进程间的高效数据共享。

2. 属性服务

属性服务是 Android 中管理和维护属性的核心组件。它负责初始化属性、响应 get/set 请求,并确保属性的安全性和访问权限。属性服务通常在 init 进程启动时初始化。

3. 属性变化通知

Android 提供了一种机制,允许进程监听属性的变化。应用可以通过轮询或者绑定回调来监听属性值的变化,适用于特定事件触发和系统状态更新。

五、常用属性示例

属性名说明示例值
ro.build.version.sdk系统 SDK 版本33
ro.product.model设备型号Pixel 6
persist.sys.timezone默认时区America/Los_Angeles
sys.boot_completed系统启动完成标志1
debuggable系统是否可调试1
ro.build.version.release系统版本号13

六、限制与注意事项

  1. 权限限制:应用不能随意设置 property,大多数属性是系统属性,只有系统进程或具有特殊权限的应用才能设置。
  2. 性能影响:频繁地设置属性可能会影响系统性能,因此在设计中应谨慎。
  3. 只读属性:以 ro. 开头的属性一般是只读的,应用和系统进程均无法更改。

七、总结

Android 中的 property 是一种灵活的全局键值对配置方式,具有高效的读取性能。它被广泛用于系统信息标识、设备信息存储以及进程间通信等。了解 property 的命名规范、使用方法及其背后的实现机制有助于更好地控制和优化 Android 系统。

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

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

相关文章

使用PEFT在多个AMD GPU上进行StarCoder的指令微调

Instruction fine-tuning of StarCoder with PEFT on multiple AMD GPUs — ROCm Blogs 2024年4月16日,由 Douglas Jia撰写。 在这篇博客中,我们将向您展示如何使用指令-答案对数据集在AMD GPU上微调StarCoder基础模型,以便它能够根据指令生…

后台管理系统窗体程序:文章管理 > 文章列表

目录 文章列表的的功能介绍: 1、进入页面 2、页面内的各种功能设计 (1)文章表格 (2)删除按钮 (3)编辑按钮 (4)发表文章按钮 (5)所有分类下拉框 &a…

微软的新模拟器将为 Windows on Arm 带来更多游戏

微软正在测试一项重大的 Windows on Arm 更新,以便让更多 x64 软件和游戏在配备高通 Snapdragon X Elite 或 X Plus 处理器的 Copilot Plus PC 上的 Prism 仿真下运行。 该功能是 Windows 11 Insider Preview Build 27744 的一部分,已向 Canary Channel …

NVR小程序接入平台/设备EasyNVR多品牌NVR管理工具/设备汇聚公共资源场景方案全析

随着信息技术的飞速发展,视频监控已经成为现代社会安全管理和业务运营不可或缺的一部分。特别是在公共资源管理方面,视频监控的应用日益广泛,涵盖了智慧城市、智能交通、大型企业以及校园安防等多个领域。NVR小程序接入平台EasyNVR作为一款功…

从单层到 MVC,再到 DDD:架构演进的思考与实践

引言 在日常开发中,我们之前工作中经常接手的大多数都是传统 MVC 架构体系的项目。然而,随着现在分布式和微服务架构的普及,越来越多的项目开始重构、拆分,传统的 MVC 架构也逐渐向 DDD 架构演进。为什么需要将传统架构重构为 DD…

CDN到底是什么?

文章目录 CDN到底是什么?一、引言二、CDN的基本概念1、CDN的定义2、CDN的作用3、代码示例:配置CNAME记录 三、CDN的工作原理1、请求流程2、代码示例:DNS解析过程3、完整的CDN工作流程 四、总结 CDN到底是什么? 一、引言 在互联网…

uniapp—android原生插件开发(3Android真机调试)

本篇文章从实战角度出发,将UniApp集成新大陆PDA设备RFID的全过程分为四部曲,涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程,轻松应对安卓原生插件开发与打包需求! 一、打包uniapp资源包: 打包…

嵌入式采集网关(golang版本)

为了一次编写到处运行,使用纯GO编写,排除CGO,解决在嵌入式中交叉编译难问题 硬件设备:移远EC200A-CN LTE Cat 4 无线通信模块,搭载openwrt操作系统,90M内存

IDEA中maven更新pom文件后使其生效(自动 + 手动)

pom文件更新后默认是不生效的,需要手动刷新maven,即点击Reload Project,注意尽量不要用最上面那个Reload all project,这样的话刷新会很慢,因为会对整个项目Reload Project 如果懒得每次手动Reload,那么可…

单调栈—acwing

一、题目: AcWing 830. 单调栈 - AcWing 暴力算法思想 双指针算法,本质上是比较操作,两个循环,时间复杂度高。通过栈可以一次遍历。 可以知道,只要前面有一个小于我的数,就可以。如果前面的数&#xff…

Linux内核中IRQ Domain的结构、操作及映射机制详解

往期内容 本专栏往期内容,interrtupr子系统: 深入解析Linux内核中断管理:从IRQ描述符到irq domain的设计与实现 pinctrl和gpio子系统专栏: 专栏地址:pinctrl和gpio子系统 编写虚拟的GPIO控制器的驱动程序:…

C++ 继承:代码传承的魔法棒,开启奇幻编程之旅

文章目录 一.继承的概念及定义1.1继承的概念1.2继承类1.2.1继承方法 1.3继承模板 二.基类和派生类的转换三.继承中的作用域四.派生类的默认成员函数4.1默认成员函数的行为4.2实现一个无法被继承的类 五.继承与友元六.继承与静态成员七.多继承和菱形继承7.1多继承和菱形继承7.2虚…

无人车之编队控制算法篇

一、编队控制算法概述 无人车编队控制算法旨在实现多辆无人车之间的协同行驶,保持预定的队形和间距,以应对各种复杂环境和任务需求。该算法通常包括队形生成、队形保持、队形变换和编队模式切换等关键步骤。 二、编队控制算法的核心要素 队形生成&…

【大数据学习 | kafka高级部分】kafka的数据同步和数据均衡

1. 数据同步 通过上图我们发现每个分区的数据都不一样,但是三个分区对外的数据却是一致的 这个时候如果第二个副本宕机了 但是如果是leader副本宕机了会发生什么呢? 2. 数据均衡 在线上程序运行的时候,有的时候因为上面副本的损坏&#xff…

计算机网络——TCP篇

TCP篇 基本认知 TCP和UDP的区别? TCP 和 UDP 可以使用同一个端口吗? 可以的 传输层中 TCP 和 UDP在内核中是两个完全独立的软件模块。可以根据协议字段来选择不同的模块来处理。 TCP 连接建立 TCP 三次握手过程是怎样的? 一次握手:客户端发送带有 …

Xserver v1.4.2发布,支持自动重载 nginx 配置

Xserver——优雅、强大的 php 集成开发环境 本次更新为大家带来了更好的用户体验。 🎉 下载依赖组件时,显示进度条,展示下载进度。 🎉 保存站点信息和手动修改 vhost 配置文件之后,自动重载 nginx 配置 &#x1f41e…

Day107:代码审计-PHP模型开发篇MVC层RCE执行文件对比法1day分析0day验证

知识点: 1、PHP审计-MVC开发-RCE&代码执行 2、PHP审计-MVC开发-RCE&命令执行 3、PHP审计-MVC开发-RCE&文件对比 MVC 架构 MVC流程: Controller截获用户发出的请求;Controller调用Model完成状态的读写操作;Contr…

飞书API-获取tenant_access_token

1.在飞书工作台创建应用,跳到开发者后台,选创建企业自建应用 2.设置并发布应用 必须要发布应用才可以开始使用了!!! 3.调用获取token的API 参考链接: 开发文档 - 飞书开放平台https://open.feishu.cn/do…

推荐 4 个 YYDS 的开源项目!

如下是本期盘点的几个好玩有趣的开源项目,目录: 1. 网页截屏转为代码 2. 将文档转为 Markdown 和 JSon 格式 3. 帮你写代码的 AI 助手 4. 开源 RAG 工具 01 网页截屏转为代码 screenshot-to-code 利用先进的大模型识别屏幕截图中的 UI 元素、布局以及其他…

Android关机流程知多少?

在 Android 中,关机流程涉及系统各个组件的协同工作,确保设备在断电之前能够安全地关闭所有活动并保存数据。以下是 Android 系统中关机流程的详细介绍: 1. 用户触发关机请求 关机流程由用户的操作触发,通常有以下几种方式&#…