Android 的系统属性(SystemProperties)设置分析

VMware vsphere client部署 1、把服务器的管理口用网线连接到自己电脑,在到IDRC中打开虚拟控制台,把镜像文件虚拟映射进去,在重启服务器按F11进入安装系统,安装系统时,需要选择做好的超融合系统盘,如果未显示则需要需要把阵列删除再重新融合成系统盘,在安装系统,显示则选择超融合系统盘,系统安装成功后,会生成一个随机IP,需要按F12进入系统管理界面,先选择配置的网口,再根据需求进行修改IPv4的网段。8、客户端加入域:右击此电脑,选择属性、更改隶属于为“域”,输入域名,确认之后输入域环境下的用户名和密码,成功之后重启。 阅读详情

看到篇不错的文章,转载过来方便学习交流 http://www.blogjava.net/anymobile/articles/301989.html



作者:徐建祥(netpirate@gmail.com)
日期:2009/11/11
网址:http://www.anymobile.org


Android 的系统属性包括两部分:文件保存的持久属性和每次开机导入的cache属性。前者主要保存在下面几个文件中:

bionic/libc/include/sys/_system_properties.h

1       #define  PROP_SERVICE_NAME "property_service"
2       #define  PROP_PATH_RAMDISK_DEFAULT  "/default.prop"
3       #define  PROP_PATH_SYSTEM_BUILD     "/system/build.prop"
4       #define  PROP_PATH_SYSTEM_DEFAULT   "/system/default.prop"
5       #define  PROP_PATH_LOCAL_OVERRIDE   "/data/local.prop"

后者则通过frameworks/base/core/java/android/os/SystemProperties.java的接口定义,

 1       private   static   native  String native_get(String key);
 2       private   static   native  String native_get(String key, String def);
 3       private   static   native   void  native_set(String key, String def);
 4       public   static   void  set(String key, String val) {
 5           if  (key.length()  >  PROP_NAME_MAX) {
 6               throw   new  IllegalArgumentException( " key.length >  "   +  PROP_NAME_MAX);
 7          }
 8           if  (val  !=   null   &&  val.length()  >  PROP_VALUE_MAX) {
 9               throw   new  IllegalArgumentException( " val.length >  "   +
10                  PROP_VALUE_MAX);
11          }
12          native_set(key, val);
13      }

该接口类在初始化运行环境中注册对应的cpp接口android_os_SystemProperties.cpp,实际操作通过JNI调用的是cpp文件对应的接口:

frameworks/base/core/jni/AndroidRuntime.cpp
1       namespace  android {
2       extern   int  register_android_os_SystemProperties(JNIEnv  * env);
3      }

frameworks/base/core/jni/android_os_SystemProperties.cpp
 1       static   void  SystemProperties_set(JNIEnv  * env, jobject clazz, jstring keyJ, jstring valJ)
 2      {
 3           int  err;
 4           const   char *  key;
 5           const   char *  val;
 6          key  =  env -> GetStringUTFChars(keyJ, NULL);
 7           if  (valJ  ==  NULL) {
 8              val  =   "" ;        /*  NULL pointer not allowed here  */
 9          }  else  {
10              val  =  env -> GetStringUTFChars(valJ, NULL);
11          }
12          err  =  property_set(key, val);
13          env -> ReleaseStringUTFChars(keyJ, key);        
14           if  (valJ  !=  NULL) {
15              env -> ReleaseStringUTFChars(valJ, val);
16          }
17      }

设置key的value时,需要作鉴权,根据设置程序所在进程的fd获知uid值,比如system server进程可以设置net打头的key,不可以设置gsm打头的key,相关的定义如下:

system/core/include/private/android_filesystem_config.h
1       #define  AID_ROOT             0  /* traditional unix root user */
2       #define  AID_SYSTEM        1000  /* system server */
3       #define  AID_RADIO         1001  /* telephony subsystem, RIL */
4       #define  AID_DHCP          1014  /* dhcp client */
5       #define  AID_SHELL         2000  /* adb and debug shell user */
6       #define  AID_CACHE         2001  /* cache access */
7       #define  AID_APP          10000 /* first app user */

system/core/init/property_service.c
 1       #define  PERSISTENT_PROPERTY_DIR  "/data/property"
 2       struct  {
 3           const   char   * prefix;
 4          unsigned  int  uid;
 5      } property_perms[]  =  {
 6          {  " net.rmnet0. " ,    AID_RADIO },
 7          {  " net.gprs. " ,      AID_RADIO },
 8          {  " ril. " ,           AID_RADIO },
 9          {  " gsm. " ,           AID_RADIO },
10          {  " net.dns " ,        AID_RADIO },
11          {  " net.usb0 " ,       AID_RADIO },
12          {  " net. " ,           AID_SYSTEM },
13          {  " dev. " ,           AID_SYSTEM },
14          {  " runtime. " ,       AID_SYSTEM },
15          {  " hw. " ,            AID_SYSTEM },
16          {  " sys. " ,        AID_SYSTEM },
17          {  " service. " ,    AID_SYSTEM },
18          {  " wlan. " ,        AID_SYSTEM },
19          {  " dhcp. " ,        AID_SYSTEM },
20          {  " dhcp. " ,        AID_DHCP },
21          {  " debug. " ,        AID_SHELL },
22          {  " log. " ,        AID_SHELL },
23          {  " service.adb.root " ,    AID_SHELL },
24          {  " persist.sys. " ,    AID_SYSTEM },
25          {  " persist.service. " ,   AID_SYSTEM },
26          { NULL,  0  }
27      };
28       int  property_set( const   char   * name,  const   char   * value)
29      {
30          property_changed(name, value);
31           return   0 ;
32      }
33       int  start_property_service( void )
34      {
35           int  fd;
36 
37          load_properties_from_file(PROP_PATH_SYSTEM_BUILD);
38          load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT);
39          load_properties_from_file(PROP_PATH_LOCAL_OVERRIDE);
40           /*  Read persistent properties after all default values have been loaded.  */
41          load_persistent_properties();
42 
43          fd  =  create_socket(PROP_SERVICE_NAME, SOCK_STREAM,  0666 ,  0 ,  0 );
44           if (fd  <   0 )  return   - 1 ;
45          fcntl(fd, F_SETFD, FD_CLOEXEC);
46          fcntl(fd, F_SETFL, O_NONBLOCK);
47 
48          listen(fd,  8 );
49           return  fd;
50      }
51       void  handle_property_set_fd( int  fd)
52      {
53           switch (msg.cmd) {
54           case  PROP_MSG_SETPROP:
55              msg.name[PROP_NAME_MAX - 1 ]  =   0 ;
56              msg.value[PROP_VALUE_MAX - 1 ]  =   0 ;
57 
58               if (memcmp(msg.name, " ctl. " , 4 )  ==   0 ) {
59                   if  (check_control_perms(msg.value, cr.uid)) {
60                      handle_control_message(( char * ) msg.name  +   4 , ( char * ) msg.value);
61                  }  else  {
62                      ERROR( " sys_prop: Unable to %s service ctl [%s] uid: %d pid:%d\n " ,
63                              msg.name  +   4 , msg.value, cr.uid, cr.pid);
64                  }
65              }  else  {
66                   if  (check_perms(msg.name, cr.uid)) {
67                      property_set(( char * ) msg.name, ( char * ) msg.value);
68                  }  else  {
69                      ERROR( " sys_prop: permission denied uid:%d  name:%s\n " ,
70                            cr.uid, msg.name);
71                  }
72              }
73               break ;
74 
75           default :
76               break ;
77          }
78      }

在开机启动后的init操作中,会执行一个loop循环,当检测到有新的设置时,进入设置流程,鉴权失败会提示相关的异常,如sys_prop: permission denied uid:1000  name:gsm.phone.id

system/core/init/init.c
 1       void  property_changed( const   char   * name,  const   char   * value)
 2      {
 3           if  (property_triggers_enabled) {
 4              queue_property_triggers(name, value);
 5              drain_action_queue();
 6          }
 7      }
 8       int  main( int  argc,  char   ** argv)
 9      {
10          parse_config_file( " /init.rc " );
11          qemu_init();
12          device_fd  =  device_init();
13          property_init();
14          fd  =  open(console_name, O_RDWR);
15          property_set_fd  =  start_property_service();
16          ufds[ 0 ].fd  =  device_fd;
17          ufds[ 0 ].events  =  POLLIN;
18          ufds[ 1 ].fd  =  property_set_fd;
19          ufds[ 1 ].events  =  POLLIN;
20          ufds[ 2 ].fd  =  signal_recv_fd;
21          ufds[ 2 ].events  =  POLLIN;
22          fd_count  =   3 ;
23           for (;;) {
24               if  (ufds[ 0 ].revents  ==  POLLIN)
25                  handle_device_fd(device_fd);
26 
27               if  (ufds[ 1 ].revents  ==  POLLIN)
28                  handle_property_set_fd(property_set_fd);
29               if  (ufds[ 3 ].revents  ==  POLLIN)
30                  handle_keychord(keychord_fd);
31          }
32           return   0 ;
33      }

OVER!


java输出指定年份的日历 实验4:输出指定年份的日历 关键字: Java基本语法 输入输出 算术运算 关系运算 选择语句 循环语句 内容要求: 编写程序,实现如下功能: 提示用户输入一个年份和代表该年第一天是星期几的数字。说明星期日到星期六用0-6表示。 程序依次输出该年的每个月的日历。 运行实例: 输入年份: 2017 该年第1天是星期几: 0 package rili; import java.util.Scanne... 阅读详情

相关推荐

c# 输入年份输出一年的日历

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Day01 { class Program { static void Main(string[] args) { Console....

weixin_41009655的博客 1154

android 关于SystemProperties的使用

SystemProperties在android系统里面使用的很广泛,用来保存一些简单的数据,使用起来非常简单 SystemProperties.set("persist.test.flycom", "1"); SystemProperties.get("persist.test.flycom", "2"); 还可以获取Boolean,Int,Long值 /** ...

jueme的博客 2245

2. 计算出1900年1月1日至当前日期之间总共间隔多少天,将其除以7取余数,该结果即为当月第一天是星期几,按日历格式输出

//输入一个日期,2010-10 输出该月的月历: //********************************** // 10月 //********************************** //日 一 二 三 四 五 六 // 1 2 //3 4 5 6 7 8 9 //10 11 12 13 14 15 16 //17 18 19 20 21 22 23 /

csiyou的专栏 1万+

dell服务器设置bios中cpu为性能模式

温馨提示:开启cpu性能模式可能会增加耗电量、设备温度升高、风扇转速加快等情况。

dwl643859的博客 5075

用java实现指定年月的日历

Java入门实现目标导入内容源代码 实现目标 打印出指定某年某月的日历(不含GUI) 导入内容 import java.util.Scanner; import java.util.Calendar; 源代码 // An highlighted block public static void main(String[] args) { Calendar calendar...

Yangwinnie的博客 727

HarmonyOS应用开发—如何基于ArkUI框架实现日历应用

日历应用实现在一页42个格子上显示上个月、当前月、下个月的日期,通过日历应用的开发了解到了ArkUI组件的一些用法,生命周期和数据的加载过程,对之后的应用开发有很大的帮助。【OpenHarmony多媒体技术、Stage模型、ArkUI多端部署、分布式应用开发、音频、视频、WebGL、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战】等技术知识点。鸿蒙Next全套VIP学习资料←点击领取!(安全链接,放心点击。

2401_82546228的博客 1723

Android权限机制,你真的了解吗?

一、Android的权限机制 Android是目前最流行的智能手机软件平台之一,在智能移动终端如火如荼发展的同时,其安全态势也日益严峻。有调查表明,恶意软件的数量在持续的上升,Google在Android安全机制上面也做了很多工作,并且一直在持续的更新,其Android的安全模型由3个部分组成:Linux安全机制、Android本地库及运行环境安全与Android特有的安全机制,如下图:

VincentWang的博客 1万+

[特殊字符] 【C语言实战】手把手教你实现多功能日历程序!附完整源码及思路解析

在编程学习中,日历程序是一个非常经典且实用的项目。它不仅可以帮助我们更好地理解和运用编程语言,还能在实际生活中发挥作用。今天,我将分享一个用C语言编写的日历程序,它能够实现年份、月份和具体日期的查询与打印功能。

2301_76390139的博客 820

C语言实战:从零构建万年历系统(含完整代码解析)

本文通过C语言实战项目——构建万年历系统,详细解析了从核心算法(闰年判断与蔡勒公式)到模块化设计(数据管理、打印排版)的完整开发流程。文章提供了可运行的完整源码,并深入解读了代码细节与编程思维,旨在帮助初学者将C语言语法知识串联起来,完成从理论到实践的蜕变。

weixin_28025327的博客 302

C#做的一个万年历

实现输出一个年份后,输出这个年份的月份、星期、日期; 提示:1900.1.1刚好是星期一。 编码工具:VS2015 下面是代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 万年历 ...

孔琳桂的博客 2140

2026年日历打印版PDF与Excel模板制作全攻略

日历类工具看似简单,实质是数据准确性与排版效率的双重考验。通过编程语言生成农历与节气数据,再借助Excel公式自动填充日期、条件格式区分节假日,配合PDF锁定版式输出,可以实现一套数据源驱动全年多版本日历的高效工作流。这种思路不仅适用于家庭年度计划、办公排班表、店铺收银台标注等日常场景,也适合需要送印刷厂制作实体台历的商用需求。本文从数据生成、版式设计到打印避坑,完整拆解了一套2026年(丙午马年)日历从零到成品的过程,覆盖全年总览图、按月打印版、可编辑Excel表格及马年主题电子台历,为需要制作年度日历素

weixin_34233974的博客 1154

Python万年历实验报告:探索与启示

设计Python万年历实验的主要目的在于,通过编程实践,掌握Python编程语言的基本语法和常用库的使用,提高编程能力和解决问题的能力。从这个角度出发,通过本次实验,我还能够加深对日历算法的理解,掌握日期计算的基本方法,为今后的学习和工作打下坚实的基础。在实验过程中,我不仅提高了自己的编程能力和解决问题的能力,还学到了很多实用的知识和技能。在设计Python万年历的过程中,我首先进行了需求分析,明确了万年历应该具备的基本功能,如日期的输入与显示、月份和年份的切换、节假日的标注等。

Li91314的博客 442

YYYY与yyyy在日期格式化中的陷阱:如何避免跨年数据错误

本文深入解析了日期格式化中YYYY与yyyy的差异及其引发的跨年数据错误。通过实际案例,揭示了YYYY代表ISO周年而非日历年,在年底年初易导致数据归属混乱。文章提供了Java等语言的对比示例,并给出了代码规范、单元测试等实战防御指南,帮助开发者彻底规避这一隐蔽陷阱。

dream的博客 892

python语言:万年表制作

python语言:万年表制作

m0_74393239的博客 328

【Python】calendar 模块

在计算机科学与日常生活中,时间与日期是无处不在的基础概念。从文件的时间戳到数据库记录的创建日期,从会议日程安排到金融交易结算,无一不涉及精确的时间与日期处理。Python 提供了多个内建模块来处理这些需求,其中 模块擅长处理具体的日期时间点, 模块则更侧重于时间戳和时间操作,而我们今天的主角—— 模块,则专注于提供与日历相关的通用功能。想象一下,你可能需要完成以下任务:这些任务看似简单,但如果从零开始自行实现,会面临诸多挑战:闰年的复杂规则、不同月份的天数差异、星期几的计算、甚至不同文化背景下周起始日的习

宅男很神经 1307

【打印万年历】输入年,月,打印当月的万年历

import java.util.Calendar; import java.util.Scanner; public class Menology { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("请输入年份:"); int year = sc.nextInt(); System.o...

xjh15053412243的博客 509

Scala打印万年历

package scala import scala.io.StdIn object Calendar{ def main(args: Array[String]): Unit = { var year=0 var month=0 var dayNum=0 var firstDay=0 println("请输入年份") year = StdIn.readInt()//获取当前年份 println("请输入月份") month = StdI.

qq_50105179的博客 362

win10 运行lisflood_8踩过的坑

1、安装cuda及VS2019 https://www.bilibili.com/read/cv7335974/ 2、netcdf.h头文件找不到问题 https://www.cnblogs.com/lyggqm/p/12926974.html https://blog.youkuaiyun.com/u011954296/article/details/54617048 3、编码问题 https://blog.youkuaiyun.com/qq_33485434/article/details/81196843 4、

我的笔记 4115
上一篇: 点滴记录之-android默认时区设置
下一篇: android强制修改话机语言
jacklce
博客等级 码龄15年 18粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值