Android 中的property_get/property_set

背景

在安卓中调试Linux驱动层以及应用层之间的一些功能时,需要获取一些属性。

参考:

介绍

属性(property)被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。

属性是在整个系统中全局可见的。每个进程可以get/set属性。

在系统初始化时,Android将分配一个共享内存区来存储的属性。这些是由“init”守护进程完成的,其源代码位于:device/system/init

“init”守护进程将启动一个属性服务。

属性服务在“init”守护进程中运行。每一个客户端想要设置属性时,必须连接属性服务,再向其发送信息。

属性服务将会在共享内存区中修改和创建属性。任何客户端想获得属性信息,可以从共享内存直接读取。

当启动属性服务时,将从以下文件中加载默认属性:

/default.prop
/system/build.prop
/system/default.prop
/data/local.prop

属性将会以上述顺序加载。后加载的属性将覆盖原先的值。这些属性加载之后,最后加载的属性会被保持在/data/property中。

特别属性:

  • 如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。

  • 如果属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。

  • 如果属性名称以“net.”开头,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。(这是很巧妙的。 netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。)

  • 属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。

每一项服务必须在/init.rc中定义.系统启动时,与init守护进程将解析init.rc和启动属性服务。

一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。

这项服务的启动结果将会放入“ init.svc.<服务名>“属性中 。客户端应用程序可以轮询那个属性值,以确定结果。

使用

shell

在shell中可以使用getprop/setprop命令来操作

> adb shell
$ getprop ro.bootmode
ffbm-01
$ setprop app.imei '123'
$ getprop app.imei

C/C++

客户端应用程序可以调用libcutils中的API函数以GET/SET属性信息。libcutils的源代码位于:device/libs/cutils。API函数如下:

#include <cutils/properties.h>

int property_get(const char *key, char *value, const char *default_value);
// default_value 代表默认值,如果属性获取不到时,value会被设为 default_value
int property_set(const char *key, const char *value);

而libcutils又调用libc中的 __system_property_xxx 函数获得共享内存中的属性。libc的源代码位于:device/system/bionic。

属性服务调用libc中的__system_property_init函数来初始化属性系统的共享内存。

例子:

char buf[20]="ssssssssssss";
char tempbuf[PROPERTY_VALUE_MAX]; property_set("phone.imei",buf);
property_get("phone.imei",tempbuf,"0");

JAVA

java中使用SystemPropertiesgetset方法

String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");
SystemProperties.set("service.bootanim.exit", "0");

Android 中的property_get/property_set的更多相关文章

  1. Android中的LinearLayout布局

    LinearLayout : 线性布局 在一般情况下,当有很多控件需要在一个界面列出来时,我们就可以使用线性布局(LinearLayout)了,  线性布局是按照垂直方向(vertical)或水平方向 ...

  2. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  3. Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)

    之前的博文<Android中使用ExpandableListView实现好友分组>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...

  4. Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)

    昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...

  5. Android中Fragment和ViewPager那点事儿(仿微信APP)

    在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragm ...

  6. Android中Fragment与Activity之间的交互(两种实现方式)

    (未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...

  7. 【月入41万】Mono For Android中使用百度地图SDK

    借助于Mono For Android技术,.Net开发者也可以使用自己熟悉的C#语言以及.Net来开发Android应用.由于Mono For Android把Android SDK中绝大部分类库都 ...

  8. mono for android中使用dapper或petapoco对sqlite进行数据操作

    在mono for android中使用dapper或petapoco,很简单,新建android 类库项目,直接把原来的文件复制过来,对Connection连接报错部分进行注释和修改就可以运行了.( ...

  9. Android开发学习之路-Android中使用RxJava

    RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ...

  10. Android中的复制粘贴

    Android中的复制粘贴 The Clipboard Framework 当使用clipboard framework时,把数据放在一个剪切对象(clip object)里,然后这个对象会放在系统的 ...

随机推荐

  1. GIS中XYZ瓦片的加载流程解析与实现

    1. 什么是XYZ瓦片 XYZ瓦片是一种在线地图数据格式,常见的地图底图如Google.OpenStreetMap 等互联网的瓦片地图服务,都是XYZ瓦片,严格来说是ZXY规范的地图瓦片 ZXY规范的 ...

  2. 《HelloGitHub》第 97 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  3. vue-单独引入css文件,设置公共的css样式或者修改默认的vant,mint样式

    1.css文件夹下新建global.css文件并粘贴复制: ======================= :root{     --bgColor : #d3252a;     --pinkColo ...

  4. 堆优化模拟退火(List-Based Simulated Annealing|LBSA)

    申明 本文部分内容来自List-Based Simulated Annealing Algorithm for Traveling Salesman Problem[1] 如有侵权,请联系删除 引入 ...

  5. synchronized原理-字节码分析、对象内存结构、锁升级过程、Monitor

    本文分析的问题: synchronized 字节码文件分析之 monitorenter.monitorexit 指令 为什么任何一个Java对象都可以成为一把锁? 对象的内存结构 锁升级过程 Moni ...

  6. springboot项目启动会报4个加载不到的debug提示,可改可不改

    1. 因为启动的时候会报提示: Unable to locate LocaleResolver with name 'localeResolver': using default [org.sprin ...

  7. .NET6 Minimal API 集成Autofac

    前提 集成Autofac前需要先添加两个依赖包 可以通过 NuGet 进行安装,使用以下命令: dotnet add package Autofac dotnet add package Autofa ...

  8. Selenium4自动化测试8--控件获取数据--上传、下载、https和切换分页

    10-上传 上传不能模拟用户在页面上选择本地文件,只能先把要上传的文件先准备好在代码里上传 import time from selenium.webdriver.support.select imp ...

  9. Istio(八):istio安全之认证,启用mTLS

    目录 一.模块概览 二.系统环境 三.istio认证 3.1 证书创建与轮换 3.2 对等认证和请求认证 3.2.1 对等认证 3.2.2 请求认证 3.3 mTLS 3.3.1 双向 TLS 3.3 ...

  10. 【winform】 WeifenLuo.WinFormsUI.Docking.dll 组件学习

    这个组件是用来 对窗体的布局用的,可搭建一个管理系统的ui框架. 使用例子:https://blog.csdn.net/zzzzzzzert/article/details/80791554