代码中的一些配置
来源:互联网 发布:跑包软件 编辑:程序博客网 时间:2024/06/14 10:14
系统中需要存储一些信息,配置信息或者一些状态码等
一.TopwiseProp类(存储配置信息)
在adb shell中可以读取和修改 busybox vi system/oem/default_settings.xml修改之后重启验证
TopwiseProp类被放在了idh.code/frameworks/base/core/java/android/os/TopwiseProp.java中。
该文件采用了一个延后加载的方法,即在调用相关方法后,才进行初始化的动作。其中,为了避免多次加载配置文件所带来的性能问题,加入了一个判断:
private static final String defSettingPath = "/system/oem/default_settings.xml";private static Properties properties = null; if (properties == null) { File oemFile = new File(defSettingPath); FileInputStream stream = null; try { stream = new FileInputStream(oemFile); InputStreamReader in=new InputStreamReader(stream,"utf-8"); BufferedReader br = new BufferedReader(in); properties = new Properties(); properties.load(br); } catch (Exception e) { // TODO: handle exception properties=null; }finally{ if(stream != null){ try { stream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
这段代码的本意是在properties未被初始化的情况下进行加载文件的操作。 由于TopwiseProp只是一个工具类,所以它本身是在进行调用时加载,因而每个进程
调用时(properties == null)都是成立的。从而每个进程都会加载一次配置文件。 但实际结果却发现是,只有第一个进程调用时会加载配置文件,
后续的进程调用不会再进行加载操作。从而达到了在一次开机后,该文件加载操作仅会执行一次。虽然这可能并非设计者的本意,但却达到了超过设计者预期的效果。
从log分析中,我发现第一次调用该类的进程为zygote。 我们知道在进程号为1的init进程在创建完zygote后,把后续创建进程的任务交给了zygote。
这样一来,以后的android进程都是zygote的子进程。 所以后续的进程实际上都会把TopwiseProp实例拷贝一份在自己的进程里。所以才达到了这种一次加载,
多进程共同使用结果的效果。
//开机检查sn号与触发 (true: 检测;false :不检测)
boolean showSnTouch = TopwiseProp.getDefaultSettingBoolean("default_show_sn_touch", true);
//获取customize/res/Z505/Z505FAB_TOPODM_DZTXT1_TOP/system/oem/default_settings.xml中的
//default_show_sn_touch属性的值,默认为true;
此类只提供getDefaultSeting***()方法 存储于customize/res/.../default_settings.xml中
二.SettingsSystem类
在settings数据库中这些属性值以键值对的形式存储,通过其get和put方法可进行这些系统属性的修改。 具体的数据库操作
\frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\
DatabaseHelper.java
数据存放在com.android.providers.settings/databases/settings.db
import android.provider.Settings;
/work1/code70/0412w5523/idh.code/frameworks/base/core/java/android/provider/Settings.java非系统权限,
需要在App项目的AndroidMainfes.xml
文件中添加如下权限:
<uses-permission android:name="android.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
1.通过变量名称获取值,如果变量不存在,数据库中没有设置过初始值或者该值类型不对,将抛出SettingNotFoundException异常
Settings.System.getXXX(ContentResolver cr, String name);
2.通过变量名称获取值,如果发生上面方法中导致异常的情况,将返给定的默认值
Settings.System.getXXX(ContentResolver cr, String name, XXX def);
3.将指定名称的值写入数据库
Settings.System.putXXX(ContentResolver cr,String name, XXX Value
三。SystemProperties
import android.os.SystemProperties;
SystemProperties.get("sys.fangchai.tigger","1")
SystemProperties.set("sys.fangchai.tigger","0")
boolean SystemProperties.getBoolean(String key, boolean def)
其中getBoolean这个函数,
只要value为'n', 'no', '0', 'false' 或者 'off',那么返回false而'y', 'yes', '1', 'true' 或者 'on' ,则返回true。
在adb shell中可以读取和修改 /system/build.prop
#getprop | grep fangchai
#setprop sys.fangchai.tigger 0
以“persist.”开头为持久化数据,其值也将写入/data/property。即使重启手机,仍然会存在
以“ro.”开头的只读属性。一旦设置,属性值不能改变。
其他为非持久化数据,当次启动有效
对于所有支持的前缀,Android中有明确的规定,规定的代码在:
$(ANDROID_ROOT)/system/core/init/property_service.c中:
{ "net.rmnet0.", AID_RADIO, 0 },
{ "net.gprs.", AID_RADIO, 0 },
{ "net.ppp", AID_RADIO, 0 },
{ "net.qmi", AID_RADIO, 0 },
{ "net.lte", AID_RADIO, 0 },
{ "net.cdma", AID_RADIO, 0 },
{ "ril.", AID_RADIO, 0 },
{ "gsm.", AID_RADIO, 0 },
{ "persist.radio", AID_RADIO, 0 },
{ "net.dns", AID_RADIO, 0 },
{ "net.dns", AID_DHCP, 0 },
{ "sys.usb.config", AID_RADIO, 0 },
{ "net.", AID_SYSTEM, 0 },
{ "dev.", AID_SYSTEM, 0 },
{ "runtime.", AID_SYSTEM, 0 },
{ "hw.", AID_SYSTEM, 0 },
{ "sys.", AID_SYSTEM, 0 },
{ "service.", AID_SYSTEM, 0 },
{ "wlan.", AID_SYSTEM, 0 },
{ "dhcp.", AID_SYSTEM, 0 },
{ "dhcp.", AID_DHCP, 0 },
{ "debug.", AID_SHELL, 0 },
{ "log.", AID_SHELL, 0 },
{ "service.adb.root", AID_SHELL, 0 },
{ "service.adb.tcp.port", AID_SHELL, 0 },
{ "persist.sys.", AID_SYSTEM, 0 },
{ "persist.service.", AID_SYSTEM, 0 },
{ "persist.security.", AID_SYSTEM, 0 },
通过AID_SYSTEM、AID_SHELL、AID_RADIO、AID_DHCP来区分属性可以被访问的进程
- 代码中的一些配置
- VBA中的一些代码
- Tomcat中的一些配置
- cassandra中的一些配置
- MyEclipce中的一些配置
- Ubuntu中的一些配置
- Spark中的一些配置
- JAVA_weB中的一些配置
- h5中的一些配置
- vimrc 中的配置代码
- JavaScript中的一些常用代码:
- AS3中的一些技巧代码
- 《编程珠玑》中的一些代码
- PX4代码中的一些简写
- 面试中的一些代码实现
- web.xml中的一些配置
- struts2配置中的一些问题
- linux 系统升级中的一些配置
- SpringMVC的API和Spring的官方说明文档的地址。
- html: div 内部的 p 元素中的文字不显示什么原因?
- 基类 ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
- JAVA | 13
- springmvc中基于url的访问控制
- 代码中的一些配置
- TestNG入门教程-12-Java代码执行testng.xml和失败后重跑
- bzoj 1034: [ZJOI2008]泡泡堂BNB 贪心
- javaweb中使用servlet实现验证码
- php-pscws4官网资源对于php5.4版本以及utf-8编码的相关bug
- 本周学习目标
- 视频合并软件(mediAvatar Video Joiner)v2.2.0官方版下载
- 编译器合成构造函数的情形
- CCF 201512-3画图