java基础程序代码流程图

java基础程序代码流程图我们在开发过程中有时需要使用系统属性 例如获取系统软件版本 获取设备名名称等 有时也需要设置自定义属性 本文将基于 Android 10 Q 介绍 Android 系统属性 以下简称 prop 使用 下文围绕以下几点展开介绍 prop 的作用 如何调试和使用 prop 实现原理 代码流程 prop 存储在哪里 何时 init 如何添加自定义 prop 使用注意事项

大家好,我是讯享网,很高兴认识大家。



我们在开发过程中有时需要使用系统属性,例如获取系统软件版本,获取设备名名称等,有时也需要设置自定义属性。本文将基于Android 10(Q)介绍Android系统属性(以下简称prop)使用,下文围绕以下几点展开介绍:

  • prop的作用,如何调试和使用?
  • prop实现原理,代码流程,prop存储在哪里,何时init?
  • 如何添加自定义prop?
  • 使用注意事项。

系统属性简单来说是用来存储系统中某些数据,具有全局性、存取灵活方便的特点,因此广泛用于android系统的各个层级。

一、终端prop命令

在终端设备中,可以通过以下命令进行prop调试。

1.1、查看prop

 
讯享网 

1.2、设置prop

讯享网

1.3、监听prop

显示属性值发生变化的值

 

1.4 常用prop

PropValueFeaturepersist.sys.boot.reason“shutdown”:关机“reboot”: 重启“shutdown,userrequested”: 用户触发关机“shutdown,thermal”:过热关机“shutdown,battery”:低电量关机 “shutdown,themal,battery”“reboot,adb”:adb 触发重启“reboot,shell”: shell 触发重启“reboot,bootloader”:bootloader模式触发重启"reboot,recovery"recovery模式触发重启等<reason,subreason,detail>…记录上一次关机/启动原因persist.sys.boot.reason.history[shutdown,userrequested,reboot,shell,reboot,ota,]记录多条关机/启动原因(detail为时间戳)persist.sys.timezoneAsia/Shanghai系统时区ro.boot.serialno9212f447设备序列号ro.product.build.*date:Fri Apr 7 10:21:42 CST 2023 固件编译时间为2023-4-7 10:21:42type:userdebug等设备编译相关信息ro.product.namexxx设备名称ro.sf.lcd_density240设备显示密度sys.usb.configmtp,adbusb连接模式

1.5、init.rc 监听prop

system/core/rootdir/init.rc

讯享网

二、get和set prop代码流程

2.1、get和set prop代码流程图

涉及的代码路径汇总如下:

 

代码流程整体时序图如下:
(:流程图android_os_SystemProperties.cpp->properties.cpp 笔误,应为)
在这里插入图片描述
系统属性架构设计如下:
在这里插入图片描述

2.2、代码流程介绍

 
 
 

2.2.1、set prop流程

 

bioniclibcbionicsystem_property_set.cpp

 

java基础程序代码流程图

2.2.2、属***(property_service)

流程到了这里会发现,最终需要通过Socket与property_service来通信进行设置属性值,那么问题来了:

  • property_service是谁创建的?
  • property_service是怎么启动的?
  • property_service是如何setprop的?
    熟悉Android开机流程的同学会马上联想到init进程,property_service正是init进程来初始化和启动的。

systemcoreinitinit.cpp

 

2.2.3、属性初始化

systemcoreinitproperty_service.cpp

 

bioniclibcbionicsystem_property_api.cpp

 
 

bioniclibcsystem_propertiescontexts_serialized.cpp

 
 

2.2.4、加载开机默认属性配置

 

2.2.5、启动属***

 

2.2.6、更新和添加属性

bioniclibcbionicsystem_property_api.cpp

 

bioniclibcsystem_propertiessystem_properties.cpp

 

bioniclibcsystem_propertiesprop_area.cpp

 

从上述code可分析出设置属性流程中根据所设置的属性值是否存在分别走update()和add()流程,而add 最后调用查找属性方法,如果不存在则新建共享内存节点,将prop_info存入。自此,set prop流程结束。

2.2.7、get prop流程

 

bioniclibcsystem_propertiessystem_properties.cpp

 

bioniclibcsystem_propertiesprop_area.cpp

 

find_property后续流程同2.2.6小节。

三、代码中使用属性

在上一章节中详细介绍了获取和设置属性的代码流程,但仍有部分问题仍待解决:

  • 2.2.4小节中build.prop、default.prop在哪里生成的,如何打包进系统
  • 如何添加自定义hello.prop
  • 如何添加系统级默认属性
  • prop有哪些类型,不同前缀有什么区别
    上述疑问先保留一点神秘感,稍后介绍,先介绍在java、C++代码中如何使用属性

3.1、java代码中使用prop

 

由于SystemProperties.java的API为系统API,普通应用无法直接使用,可以通过反射来get和set prop。

 
 

获取属性值可以根据值的类型使用合适返回值类型的方法如getInt()、getBoolean()、getLong(),SystemProperties.get()获取的值为String。

3.2、C++代码中使用prop

 

在C++代码中使用prop需要:

  • include <cutils/properties.h>
  • Android.mk或Android.bp或Makefile中需要链接libcutils库
    frameworksavmedialibstagefrightAndroid.bp
 
 

3.3、特殊属性

从2.2.5小节中可以看到有些属性比较特殊,特总结如下:

3.3.1、 ro只读属性

ro即read only这类属性通常是系统默认属性,在系统编译或初始化时设置的。

 

3.3.2、persist持久属性

设置persist开头的属性,断电后仍能保存,值写入data/property/persistent_properties。

 

3.3.3、ctl 控制属性

 

3.3.4、sys.powerctl属性

sys.powerctl属性可控制设备重启关机

 

3.3.5、普通属性

设置其他格式开头的属性,断电后不能保存

 

 

3.4、添加系统默认属性

 

四、prop打包

我们已经知道如何添加系统默认属性,但项目中有许多*.prop配置文件,

  • 这些文件是如何最终打包至out/tartget/product/…/build.prop的呢?
  • 为了便于客制化属性管控,如何添加自己的prop配置文件呢?

本章将围绕上面两个问题进行介绍

4.1、prop打包流程

build.prop是在代码编译时,build/core/Makefile完成打包的

 

build/make/tools/buildinfo.sh中配置了系统编译常见信息,具体如下

 

经过Makefile,将系统中各种prop配置文件合并生成在out指定路径下。
也是在Makefile中将各路径下build.prop随系统分区一同打包进img,out argetproductxxxsystembuild.prop打包进system.img
out argetproductxxxvendorbuild.prop打包进vendor.img

五、添加定制hello.prop

涉及的代码路径汇总如下:

 

为了方便统一管理定制化属性,有时会将定制化属性都写在定制的.prop文件中,下面以添加hello.prop为例说明添加过程。

5.1、device下添加hello.prop

device/qcom/qssi/hello.prop

 

5.2 配置预置路径

 

5.3、SELinux权限配置

 

详细SELinux介绍和配置可参考Android SELinux权限概念和配置说明

5.4、配置hello.prop权限

此步骤可省略,若未配置读写权限,默认system/prop为644
这里配置与system/build.prop相同的600权限
system/core/rootdir/init.rc

 

5.5、load hello.prop

 

5.6、验证hello.prop

Android全编译后正常情况可找到生成的
out/target/product/qssi/system/hello.prop
在这里插入图片描述
检查其内容应与device/qcom/qssi/hello.prop内容保持一致。
将打包好的img烧录到设备中进行确认

 

关注公众号:Android老皮
解锁  《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版

内容如下

1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路

小讯
上一篇 2024-12-24 22:41
下一篇 2025-01-02 22:13

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/8715.html