转自:http://blog.csdn.net/cloudwu007/article/details/7850496

问题:发现adb sehll setProp所设属性值在下次重起后被清除

adb shell setprop testing.mediascanner.skiplist /storage/sdcard1/test


结论:1.必须采用persist.开头的属性名才能永久保存。

2.如果具有root权限,可以直接编辑/system/build.prop并加入需要永久保存的属性


On system initialization, Android will allocates a block of shared memory for storing the properties. This is done in “init” daemon whose sourcecode is at: device/system/init. The “init” daemon will start a PropertyService.

The Property Service is running in the process of “init”daemon. Every client that wants to SET property needs to connect to theProperty Service and send message to Property Service. Property Servicewill update/create the property in shared memory. Any client that wants to GET property can read the property from the shared memory directly.This promotes the read performance.

Java API:

import android.os.SystemProperties;

[javascript] view plain copy print ?
  1. publicstaticStringget(Stringkey,Stringdef){}
  2. publicstaticvoidset(Stringkey,Stringval){}

The Native API:

[cpp] view plain copy print ?
  1. intproperty_get(constchar*key,char*value,constchar*default_value);
  2. intproperty_set(constchar*key,constchar*value);

bionic/libc/include/sys/system_properties.h

[cpp] view plain copy print ?
  1. #definePROP_NAME_MAX32
  2. #definePROP_VALUE_MAX92
以上定义可知属性最大长度为32,属性值最大长度92字节.

bionic/libc/include/sys/_system_properties.h

[cpp] view plain copy print ?
  1. #definePROP_PATH_RAMDISK_DEFAULT"/default.prop"
  2. #definePROP_PATH_SYSTEM_BUILD"/system/build.prop"
  3. #definePROP_PATH_SYSTEM_DEFAULT"/system/default.prop"
  4. #definePROP_PATH_LOCAL_OVERRIDE"/data/local.prop"

属性服务启动后会从系统文件中读取默认的属性,并写入共享内存中,以下4个文件为按顺序读取:
/default.prop
/system/build.prop
/system/default.prop
/data/local.prop
后读入的属性将覆盖前面读取的相同的属性。
system/core/init/property_service.c

[cpp] view plain copy print ?
  1. voidstart_property_service(void)
  2. {
  3. intfd;
  4. load_properties_from_file(PROP_PATH_SYSTEM_BUILD);
  5. load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT);
  6. #ifdefALLOW_LOCAL_PROP_OVERRIDE
  7. load_properties_from_file(PROP_PATH_LOCAL_OVERRIDE);
  8. #endif/*ALLOW_LOCAL_PROP_OVERRIDE*/
  9. /*Readpersistentpropertiesafteralldefaultvalueshavebeenloaded.*/
  10. load_persistent_properties();
  11. update_legacy_atvc_properties();

设置属性,ro.开头的属性将不能被更改属性值,persist.开头的属性会被永久纪录,其他属性值在重新开机后均将被丢弃:

[cpp] view plain copy print ?
  1. intproperty_set(constchar*name,constchar*value)
  2. {
  3. if(namelen<1)return-1;
  4. pi=(prop_info*)__system_property_find(name);
  5. if(pi!=0){
  6. /*ro.*propertiesmayNEVERbemodifiedonceset*/
  7. if(!strncmp(name,"ro.",3))return-1;
  8. pa=__system_property_area__;
  9. update_prop_info(pi,value,valuelen);
  10. pa->serial++;
  11. __futex_wake(&pa->serial,INT32_MAX);
  12. }else{
  13. pa=__system_property_area__;
  14. if(pa->count==PA_COUNT_MAX)return-1;
  15. pi=pa_info_array+pa->count;
  16. pi->serial=(valuelen<<24);
  17. memcpy(pi->name,name,namelen+1);
  18. memcpy(pi->value,value,valuelen+1);
  19. pa->toc[pa->count]=
  20. (namelen<<24)|(((unsigned)pi)-((unsigned)pa));
  21. pa->count++;
  22. pa->serial++;
  23. __futex_wake(&pa->serial,INT32_MAX);
  24. }
  25. /*Ifnamestartswith"net."treatasaDNSproperty.*/
  26. if(strncmp("net.",name,strlen("net."))==0){
  27. if(strcmp("net.change",name)==0){
  28. return0;
  29. }
  30. /*
  31. *The'net.change'propertyisaspecialpropertyusedtrackwhenany
  32. *'net.*'propertynameisupdated.Itis_ONLY_updatedhere.Itsvalue
  33. *containsthelastupdated'net.*'property.
  34. */
  35. property_set("net.change",name);
  36. }elseif(persistent_properties_loaded&&
  37. strncmp("persist.",name,strlen("persist."))==0){
  38. /*
  39. *Don'twritepropertiestodiskuntilafterwehavereadalldefaultproperties
  40. *topreventthemfrombeingoverwrittenbydefaultvalues.
  41. */
  42. write_persistent_property(name,value);
  43. }
  44. property_changed(name,value);
  45. return0;
  46. }

当用户设置属性时,如果以属性名字以persist.开头,则会同时在/data/property目录下创建以该属性名字命名的文件,并写入属性值。

[cpp] view plain copy print ?
  1. #definePERSISTENT_PROPERTY_DIR"/data/property"
  2. staticvoidwrite_persistent_property(constchar*name,constchar*value)
  3. {
  4. constchar*tempPath=PERSISTENT_PROPERTY_DIR"/.temp";
  5. charpath[PATH_MAX];
  6. intfd,length;
  7. snprintf(path,sizeof(path),"%s/%s",PERSISTENT_PROPERTY_DIR,name);
  8. fd=open(tempPath,O_WRONLY|O_CREAT|O_TRUNC,0600);
  9. if(fd<0){
  10. ERROR("Unabletowritepersistentpropertytotempfile%serrno:%d\n",tempPath,errno);
  11. return;
  12. }
  13. write(fd,value,strlen(value));
  14. close(fd);
  15. if(rename(tempPath,path)){
  16. unlink(tempPath);
  17. ERROR("Unabletorenamepersistentpropertyfile%sto%s\n",tempPath,path);
  18. }
  19. }

加载永久属性时,会读入在目录/data/property下所有名字以persist.开头的文件内容,作为该名字对应的属性值。

[cpp] view plain copy print ?
  1. staticvoidload_persistent_properties()
  2. {
  3. DIR*dir=opendir(PERSISTENT_PROPERTY_DIR);
  4. ...
  5. if(dir){
  6. while((entry=readdir(dir))!=NULL){
  7. if(strncmp("persist.",entry->d_name,strlen("persist.")))
  8. continue;

ref:

1.Android Property Systemhttp://blog.csdn.net/magod/article/details/7255217

更多相关文章

  1. Android开发 常用控件罕见特殊属性集锦
  2. android 让ImageView的图片全屏填充
  3. 在android style.xml文件中使用自定义属性
  4. Android——Intent简介
  5. Android使用ListView应该注意的地方
  6. String.xml中product属性使用
  7. Android(安卓)UI--动画 Animation
  8. android statusbar隐藏的几种方式
  9. Android系统启动分析(Init->Zygote->SystemServer->Home activit

随机推荐

  1. Android packageManagerService如何添加
  2. android面试经验浅谈
  3. Android(安卓)Q 深色模式(Dark Mode)源码解
  4. Android消息处理系统——Looper、Handler
  5. 注意android裁图的Intent action
  6. App"确定"按钮应该在左边还是右边?
  7. Android Google Map实例 - 添加GPS位置标
  8. Android(安卓)PullToRefresh 分析之三、
  9. Android 关于休眠的几个坑点
  10. android之ViewFlipper实现左右滑动动画效