代码中的一些配置

来源:互联网 发布:跑包软件 编辑:程序博客网 时间: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来区分属性可以被访问的进程