Android 系统属性读取和设置详解

    • 一、在adb中进行属性读取和设置
      • 1、Settings Provider设置和读取
        • 获取
        • 设置
      • 2、SystemProperties属性读取和设置
    • 二、Android代码中进行属性读取和设置
      • 1、Settings Provider设置和读取
        • 2、SystemProperties设置和读取
        • SystemProperties在底层代码中读取和设置,示例:
    • 三、在文件中进行读取和设置
      • 1、Settings Provider设置和读取
        • Android 6之前的Settings Provider的文件目录:
        • Android 7之后,Settings Provider的文件目录:
      • 2、SystemProperties设置和读取
    • 四、SystemProperties属性简介
      • 如何将android程序的权限提升到system权限?方法是这样的:
    • 五、Settings Provider属性简介
      • 1、使用Settings Provider的好处
      • 2、系统中常用的Settings Provider 属性Key列表
        • settings_system.xml 表格中部分定义如下:
        • settings_global.xml 表格中部分定义如下:
        • settings_secure.xml 表格中部分定义如下:
    • 六、其他:
      • 1、简单总结一下Settings Provider和SystemPropertier
      • 2、Settings.java源码
      • 3、SystemProperties.java
      • 4、Android 源码网址
      • 6、Android其他数据存储
  • 共勉:人生只有一次。

Android 系统属性主要有两种:SettingsProvider 和 SystemProperties 。

一、在adb中进行属性读取和设置

1、Settings Provider设置和读取

获取

//譬如查看screen_off_timeout的值,可以使用下面的命令

adb shell settings get system  screen_off_timeout
2147483647 //无穷大的值,表示永不休眠

这里属性值是严格区分大小写的(全部都是小写),不存在的值或者写错就获取到null。

设置

//修改休眠时间

adb shell settings put system screen_off_timeout 120000  //120秒,2分钟

2、SystemProperties属性读取和设置


//读取
//方式1
adb shell getprop//方式2,可以过来关键字,-i表示不区分大小写
##adb shell
##getprop | grep -i xxx//设置
//方式1,这个方式重启后保存的属性是会消失的
adb shell setprop XXX value//方式2,修改/system/build.prop 文件属性
命令找不到了!把文件pull出来修改再push回去吧。

二、Android代码中进行属性读取和设置

1、Settings Provider设置和读取

读取用get、设置用put

Settings Provider是指通过如下方式设置的系统变量数据库:

//读取
Settings.System.getInt(Context.getContentResolver(), "xxx", 1);
Settings.System.getString(Context.getContentResolver(), "xxx", "1");
Settings.System.getLong(Context.getContentResolver(), "xxx", 1);
Settings.System.getFloat(Context.getContentResolver(), "xxx", 1);//设置
Settings.System.putInt(Context.getContentResolver(), "xxx", 1);
Settings.System.putString(Context.getContentResolver(), "xxx", "1");
Settings.System.putLong(Context.getContentResolver(), "xxx", 1);
Settings.System.putFloat(Context.getContentResolver(), "xxx", 1);。。。

xxx表示属性,比如:screen_off_timeout

2、SystemProperties设置和读取

import android.os.SystemProperties; //需要uid系统权限//读取
String Systemproperties.get(String key);
int Systemproperties.getInt(String key, int def)
long Systemproperties.getLong(String key, long def)
boolean Systemproperties.getBoolean(String key, boolean def) //设置
void Systemproperties.set(String key, String val)

读取有多个方法,但是设置只有一个,并且value值是String类型,
比如:

设置boolean,使用Systemproperties.set("system_debug", "true")设置数值,使用Systemproperties.set("test_number", "10")即可。

SystemProperties在底层代码中读取和设置,示例:

//读取数值
char flag[PROPERTY_VALUE_MAX];
property_get("persist.sys.camera.port", flag, "0");
int port = flag[0] - '0'; //适用于flag字符串数值小于10的情况//设置
property_get("persist.sys.camera.port", "0");

三、在文件中进行读取和设置

1、Settings Provider设置和读取

Android 6之前的Settings Provider属性是通过数据库文件,开发者读取比较麻烦,需要使用三方工具;
Android 7.xx平台直接进入/data/system/users/0里面查看xml文件,即可看大属性值。

Android 6之前的Settings Provider的文件目录:

//5.xx平台,如果借助第三方sql工具
root@XXX:/data/data/com.android.providers.settings/databases # ls
settings.db
settings.db-journal
root@XXX:/data/data/com.android.providers.settings/databases #

Android 7之后,Settings Provider的文件目录:

//7.xx平台,可以直通cat查看settings_system.xml,settings_global.xml,settings_secure.xml三个文件
XXX:/data/system/users/0 # ls
app_idle_stats.xml       runtime-permissions.xml settings_system.xml
appwidgets.xml           settings_global.xml     wallpaper_info.xml
package-restrictions.xml settings_secure.xml
XXX:/data/system/users/0 #

比如,我们要修改settings_system的值,可以把settings_system.xml文件打开,编辑保存后,
push到这个目录,并重启,系统就会重新读取这个属性。

2、SystemProperties设置和读取

SystemProperties的属性分布在多个不同的配置文件中,也有动态设置进去的属性。
其中主要的属性都设置在/system/build.prop,根据不同系统差异也会在vendor、cus目录下存在.prop属性文件,系统中所有的属性都可以通过getprop获取

读取和设置/system/build.prop的属性示例如下:


//1、pull获取配置文件
adb root
adb remount
adb pull /system/build.prop D:/temp///2、修改build.prop
修改属性并保存//3、push导入文件,并重启
adb push D:/temp/build.prop /system/build.prop
adb reboot

这种方式保存的属性,重启后还是存在的。

四、SystemProperties属性简介

SystemProperties主要是系统状态相关属性保存。

Systemproperties类在android.os下,但这个类是隐藏的,上层程序开发无法直接使用。其实用java的反射机制是可以使用这个类。

.prop定义的主要属性特征如下:


(1)gsm开头的是移动电话的一些版本信息(软硬件,基带版本等信息)、所在国家、漫游状态、序列号等信息等一系列与sim相关的信息(2)ro开头的是只读属性,一旦赋值不能修改(3)sys开头的是系统信息(4)persist设置这个属性时,其值也将写入/data/property(5)init.svc手机当前进程的状态(启动的显示running未启动的显示stopped)。进程是否启动是有init.rc文件中定义的(6)net开头的是与网络相关的信息,比如dns、主机名、为各功能预留的缓冲区大小,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。(7)dhcp.wlan 是网关、IP地址等无线网络相关信息;(8)还要其他自定义的。。。

SystemProperties通过反射读取和设置数据:

https://blog.csdn.net/wenzhi20102321/article/details/80503568

SystemProperties数据的读取和设置需要系统权限。

调用反射方法也是需要系统权限的。

在系统应用中,导入SystemProperties类和空方法,也是可以调用到系统的SystemProperties属性的。

如何将android程序的权限提升到system权限?方法是这样的:


1、在AndroidManifest.xml中,在manifest加入android:sharedUserId="android.uid.system "。2、在Android.mk中,將LOCAL_CERTIFICATE := XXX修改成LOCAL_CERTIFICATE := platform 。

经过以上两步就可以把ap的权限提升到system权限了。一般能做这两点的,基本上都是开发人员!

在Android Studio也是可以添加uid编译生成系统apk的,但是要系统对应的签名文件。

五、Settings Provider属性简介

SettingsProvider顾名思义是一个提供设置数据共享的Provider,里面存放了许多Android的一些默认初始值。

Settings共有三种分类,分别如下:

Global:所有的偏好设置对系统的所有用户公开,第三方APP有读没有写的权限;
System:包含各种各样的用户偏好系统设置;
Secure:安全性的用户偏好系统设置,第三方APP有读没有写的权限。

如我们不知道此时我们要查询的具体字段是什么的时候,我们也可以通过list将相关的字段遍历出来,如下:

//获取Settings_system所有属性值,system大小写都可以
XXX:/ # settings list system //获取Settings_global所有属性值
XXX:/ # settings list global //获取Settings_secure所有属性值
XXX:/ # settings list secure 

Settings Provider的读取和设置本文开头已经说明,这里就不再重复。

1、使用Settings Provider的好处

主要代码如下:


String SCREEN_OFF_TIMEOUT = screen_off_timeout;//这里以监听屏幕休眠时间为示例说明// (1)首先自定义一个类继承ContentObserver。在onChange()方法里面再次去获取Settings的值。
class SettingsValueChangeContentObserver extends ContentObserver {public SettingsValueChangeContentObserver() {super( new Handler());}@Overridepublic void onChange(boolean selfChange) { //selfChange没啥意义super.onChange(selfChange);Toast.makeText(MainActivity.this, Settings.System.getString(getContentResolver(), SCREEN_OFF_TIMEOUT), Toast.LENGTH_SHORT).show();}
}// (2)注册监听
SettingsValueChangeContentObserver mContentOb;private void registObServer(){mContentOb = new SettingsValueChangeContentObserver();getContentResolver().registerContentObserver(Settings.System.getUriFor(SCREEN_OFF_TIMEOUT),true, mContentOb);//注册监听}// (3)反注册监听private void unregistObServer(){getContentResolver().unregisterContentObserver(mContentOb);}

注意:getContentResolver()需要上下文Context

2、系统中常用的Settings Provider 属性Key列表

settings_system.xml 表格中部分定义如下:

<?xml version="1.0" encoding="UTF-8" standalone="true"?><settings version="146"><setting defaultSysSet="true" defaultValue="6" package="android" value="6" name="volume_alarm" id="4"/>  //提示音声音大小,范围0-15<setting defaultSysSet="true" defaultValue="11" package="android" value="11" name="volume_music" id="0"/>  //音乐声音大小<setting defaultSysSet="true" defaultValue="4" package="android" value="4" name="volume_voice" id="3"/>  //通话声音大小<setting defaultSysSet="true" defaultValue="5" package="android" value="5" name="volume_ring" id="1"/>  //铃声声音大小<setting defaultSysSet="true" defaultValue="5" package="android" value="5" name="volume_notification" id="5"/>  //通知声音大小<setting defaultSysSet="true" defaultValue="7" package="android" value="7" name="volume_system" id="2"/>  //系统声音大小,已废弃<setting defaultSysSet="true" defaultValue="0" package="android" value="0" name="accelerometer_rotation" id="19"/>  //是否自动旋转,0表示false<setting defaultSysSet="true" defaultValue="2147483647" package="android" value="2147483647" name="screen_off_timeout" id="11"/>  //屏幕多久息屏,2147483647表示永不息屏,比如60000表示60秒后息屏<setting defaultSysSet="true" defaultValue="0" package="android" value="0" name="pointer_speed" id="25"/><setting defaultSysSet="true" defaultValue="1.0" package="android" value="1.0" name="transition_animation_scale" id="18"/><setting defaultSysSet="true" defaultValue="102" package="android" value="102" name="screen_brightness" id="15"/>  //屏幕亮度,0-255
</settings>

其中,defaultValue表示默认值,value表示当前值。

从这个文件可以看出,Setting目录里面的二级目录主要开关在这个文件定义。

settings_global.xml 表格中部分定义如下:

<?xml version="1.0" encoding="UTF-8" standalone="true"?><settings version="146"><setting defaultSysSet="true" defaultValue="0" package="android" value="0" name="low_battery_sound_timeout" id="41"/>  //低电量超时设置<setting defaultSysSet="true" defaultValue="0" package="android" value="0" name="wifi_display_on" id="21"/>  //wifi是否打开,0false,1true<setting defaultSysSet="true" defaultValue="metalbutton" package="android" value="metalbutton" name="device_name" id="44"/>  //设备名称<setting defaultSysSet="true" defaultValue="1" package="android" value="1" name="wifi_networks_available_notification_on" id="12"/><setting defaultSysSet="true" defaultValue="0" package="android" value="0" name="bluetooth_on" id="13"/>  //蓝牙是否打开<setting defaultSysSet="true" defaultValue="1" package="android" value="1" name="adb_enabled" id="55"/>  //是否可以进行adb调试<setting defaultSysSet="true" defaultValue="0" package="android" value="0" name="bluetooth_disabled_profiles" id="48"/><setting defaultSysSet="true" defaultValue="0" package="android" value="0" name="wifi_wakeup_available" id="50"/><setting defaultSysSet="true" defaultValue="com.google.android.webview" package="android" value="com.google.android.webview" name="webview_provider" id="56"/><setting defaultSysSet="true" defaultValue="2" package="android" value="2" name="wifi_sleep_policy" id="8"/><setting defaultSysSet="true" defaultValue="3" package="android" value="3" name="ethernet_on" id="54"/>  //有线网,3表示连接,2表示未连接<setting defaultSysSet="true" defaultValue="0" package="android" value="0" name="wifi_scan_always_enabled" id="42"/><setting defaultSysSet="true" defaultValue="0" package="android" value="0" name="network_recommendations_enabled" id="64"/><setting defaultSysSet="true" defaultValue="/system/media/audio/ui/Dock.ogg" package="android" value="/system/media/audio/ui/Dock.ogg" name="car_dock_sound" id="31"/><setting defaultSysSet="true" defaultValue="4" package="android" value="4" name="wifi_ap_on" id="51"/>  //热点开关<setting defaultSysSet="true" defaultValue="0" package="android" value="0" name="airplane_mode_on" id="0"/>  //飞行模式开关<setting defaultSysSet="true" defaultValue="1" package="android" value="1" name="netstats_enabled" id="18"/><setting defaultSysSet="true" defaultValue="1" package="android" value="1" name="wifi_wakeup_enabled" id="49"/><setting defaultSysSet="true" defaultValue="0" package="android" value="0" name="assisted_gps_enabled" id="4"/>  //GPS<setting defaultSysSet="true" defaultValue="1" package="android" value="1" name="auto_time_zone" id="6"/>  //自动更新时区<setting defaultSysSet="true" defaultValue="1" package="android" value="1" name="wifi_on" id="11"/>  //wifi开关<setting defaultSysSet="true" defaultValue="1" package="android" value="1" name="auto_time" id="5"/>  //自动更新时间</settings>

从这个文件可以看出,Setting目录里面的主要开关在这个文件定义。

settings_secure.xml 表格中部分定义如下:


<?xml version="1.0" encoding="UTF-8" standalone="true"?><settings version="146"><setting defaultSysSet="true" defaultValue="1" package="android" value="1" name="lock_screen_show_notifications" id="25"/>  //锁屏状态是否显示通知<setting defaultSysSet="true" defaultValue="-1" package="android" value="-1" name="sleep_timeout" id="27"/>  //休眠时间,-1表示不休眠<setting defaultSysSet="true" defaultValue="1" package="android" value="1" name="lock_screen_allow_private_notifications" id="26"/><setting defaultSysSet="true" defaultValue="1" package="android" value="1" name="double_tap_to_wake" id="29"/><setting defaultSysSet="true" defaultValue="1" package="android" value="1" name="speak_password" id="10"/><setting defaultSysSet="true" defaultValue="1" package="android" value="1" name="wake_gesture_enabled" id="24"/>  //是否可以手势唤醒<setting package="android" name="backup_enabled" id="47"/>  //是否默认备份<setting defaultSysSet="true" defaultValue="1" package="android" value="1" name="lockscreen.disabled" id="11"/>  //是否锁屏<setting defaultSysSet="true" defaultValue="0" package="android" value="0" name="lock_screen_owner_info_enabled" id="37"/><setting defaultSysSet="true" defaultValue="0" package="android" value="0" name="selected_spell_checker_subtype" id="46"/><setting defaultSysSet="true" defaultValue="400" package="android" value="400" name="long_press_timeout" id="8"/></settings>

从这个文件可以看出,Setting目录里面二级目录的隐私相关属性在这个文件定义。

很多其他具体的描述都是可以在Settings.java源码里面看到解释的。

六、其他:

1、简单总结一下Settings Provider和SystemPropertier

(1)SettingsProvider 可以在系统或应用中使用,并且可以监听状态值的改变,但是要基于Context上下文。
(2)SystemProperties 一般在系统中使用,也可以在系统应用中使用,不需要Context上下文。
(3)SettingsProvider、SystemPropertier只接受int、float、string等基本类型的数据;
(4)SystemProperties 可以实现跨进程、跨层次调用,即底层的c/c++可以调用,java层也可以调用;
(5)SettingsProvider 只能能在java层使用,也可以在不同进程设置、读取、监听;
(6)SettingsProvider 包含全局性、系统级别的用户编好设置。如,休眠时间,蓝牙开关等;
(7)SystemProperties 包含系统配置属性。如电源模式,相机模式等;
(8)SettingsProvider修改后可以马上在代码中读取到;
(9)SystemProperties在第三种文件修改后需要重启才能在代码中读取到,因为这个属性是系统启动时候读取到缓存的。
(10)并非设置了SettingsProvider 或SettingsProvider 属性就一定会生效,部分特征是要多个属性结合判断的,并且要看系统里面具体判断为准。

2、Settings.java源码

网址:
https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks/base/core/java/android/provider/Settings.java
源码里面有所有key的介绍。

进一步分析SettingsProvider:

https://blog.csdn.net/myfriend0/article/details/59107989/

3、SystemProperties.java

https://www.androidos.net.cn/android/8.0.0_r4/xref/frameworks/base/core/java/android/os/SystemProperties.java
这个类只有get和set方法,具体key的定义大都是系统自定义的。

4、Android 源码网址

https://www.androidos.net.cn/sourcecode

###5、linux环境关键字查找命令:

//查找后缀为.xml并且包含XXX的文件
find . -name "*.xml" | xargs grep -i "XXX"

有时候我们知道了某个属性的关键字,不知道在那里设置的,就需要在源码里面查找,一般是在xml或者java里面查找。

6、Android其他数据存储

Android其他的数据存储方式:
(1)SharePreferences,主要针对开关或其他简单数据
(2)本地存储:内部存储(不需要读写权限),外部存储
(3)数据库存储
(4)序列化存储,主要是针对自定义对象
(5)网络存储
还有本文的SystemProperties属性存储和SettingsProvider存储。

具体情况:https://blog.csdn.net/wenzhi20102321/category_6507672.html

其中除了网络存储,都是本地存储,只是获取和设置方式不一样,并且系统已经了适配。

共勉:人生只有一次。

Android 系统属性读取和设置详解相关推荐

  1. android系统属性获取及设置

    系统属性获取及设置中的设置值 data/data/com.android.providers.settings/databases/settings.db 1.系统属性获取及设置 android.os ...

  2. Android 系统Dimension和间距参数详解

    Android作为一个开放性的手持装置作业系统,势必面对终端显示器有多种不同规格的情况,这对程式开发者会有一定程度的困扰.  意图成为"云端的微软"的Google自然不会傻到任由开 ...

  3. 【小家Java】Java环境变量(Env)和系统属性(Property)详解---工具文章

    每篇一句 胡适说:大胆猜想,小心求证 前言 首先说明,这是一篇工具文章,主要记录下我们Java环境变量和系统属性,方便以后的查阅. 当程序中需要使用与操作系统相关的变量(例如:文件分隔符.换行符)时, ...

  4. Linux设备驱动程序(第三版)/深入理解计算机系统(原书第2版)/[Android系统原理及开发要点详解].(韩超,梁泉)百度云盘下载

    文档下载云盘连接:http://pan.baidu.com/s/1dDD2sgT 更多其他资料,请关注淘宝:http://shop115376623.taobao.com/ http://item.t ...

  5. 计算机bios设置论文,玩转电脑必看知识——各种BIOS设置详解 的更多相关文章

    7.IDE Primary Master UDMA(第一个IDE主控制器下的UDMA模式) 8.IDE Primary Slave UDMA(第一个IDE从控制器下的UDMA模式) 9.IDE Sec ...

  6. 《Android 网络开发与应用实战详解》——2.3节Android系统架构

    本节书摘来自异步社区<Android 网络开发与应用实战详解>一书中的第2章,第2.3节Android系统架构,作者 王东华,更多章节内容可以访问云栖社区"异步社区"公 ...

  7. android 设置listview滚动条,Android ListView 滚动条的设置详解及实例代码

    Android ListView 滚动条的设置详解 1.滚动条的属性 android:scrollbarAlwaysDrawHorizontalTrack 设置是否始终显示水平滚动条.这里用Scrol ...

  8. java中属性文件读取案例_java相关:Spring中属性文件properties的读取与使用详解

    java相关:Spring中属性文件properties的读取与使用详解 发布于 2020-6-3| 复制链接 摘记: Spring中属性文件properties的读取与使用详解实际项目中,通常将一些 ...

  9. linux服务器3306端口,linux系统对外开放3306、8080等端口,防火墙设置详解

    linux系统对外开放3306.8080等端口,防火墙设置详解 发布时间:2020-10-10 23:08:49 来源:脚本之家 阅读:141 作者:julielele 栏目:服务器 我们很多时候在l ...

最新文章

  1. js中变量和jsp中java代码中变量互相访问解决方案
  2. springmvc静态资源拦截与访问
  3. 【CodeForces - 215C 】Crosses (思维,图形题)
  4. python web框架基础
  5. Android官方开发文档Training系列课程中文版:多样屏幕之支持不同的屏幕密度
  6. 你以为面试官问的是分布式缓存,其实他想问……
  7. 你所不知道的模块调试技巧 - npm link #17
  8. select2搜索动态加载
  9. python数据检索_python – Hachoir – 从组中检索数据
  10. 【pytorch】pytorch-LSTM
  11. Dump获取和分析工具简介
  12. C语言二叉树非递归遍历详解,C语言实现二叉树的递归遍历和非递归遍历
  13. 直通车推广:打造潮流女装爆款
  14. 关于软件设计使用中一些的原则简述
  15. 四、HTML标签:图片标签
  16. 基于深度学习方法的事件抽取论文整理
  17. 安卓11客制需求:<MtkSettings:添加桌面设置,并且能够正常切换桌面APK>
  18. linux pam 解锁_linux pam锁定用户
  19. 使用VRRP技术实现网关设备冗余,附详细配置实验
  20. 基于libsvm的图像分割(小黄鸭子)

热门文章

  1. java解决异常_聊聊Java中的异常及处理
  2. GSM Arena 魅族mx四核评测-个人翻译
  3. TP-LINK路由器与pfSense建立IPsec连接
  4. matlab tic tac toe,详解Tic-Tac-Toe人工智能实现
  5. 完全二叉树的节点个数
  6. python营销骗局_利用Python对天猫店铺销售进行分析.下
  7. go语言-空结构体/ chan struct{}
  8. CAN总线基础知识(一)
  9. windows 总是弹出 windows installer 安装,关不了的解决方法
  10. SQL Server LocalDB本地文件数据库操作实践