打开文件system/core/init/property_service.c 增加函数
#define HOLD_PROPERTY_DIR "/hold" static int hold_properties_loaded = 0; static void load_hold_properties() { DIR* dir = opendir(HOLD_PROPERTY_DIR); int dir_fd; struct dirent* entry; char value[PROP_VALUE_MAX]; int fd, length; struct stat sb; if (dir == NULL) { //700为 /data/property的权限,这里改得和它一样,注意,这里不支持system()执行,因为sh还没有启动 // char tmp[100] = {0}; // sprintf(tmp,"mkdir %s && %s %s",HOLD_PROPERTY_DIR,"chmod 700",HOLD_PROPERTY_DIR); // system(tmp); ERROR("hold:aaaa check mkdir %s\n",HOLD_PROPERTY_DIR); // if (mkdir(HOLD_PROPERTY_DIR, 0700) == -1) { // // ERROR("hold:Unable mkdir %s\n", HOLD_PROPERTY_DIR); // }else{ // ERROR("hold:has dir2 %s\n",HOLD_PROPERTY_DIR); // dir = opendir(HOLD_PROPERTY_DIR); // } }else{ ERROR("hold:has dir %s\n",HOLD_PROPERTY_DIR); } if (dir) { dir_fd = dirfd(dir); while ((entry = readdir(dir)) != NULL) { if (strncmp("hold.", entry->d_name, strlen("hold."))) continue; #if HAVE_DIRENT_D_TYPE if (entry->d_type != DT_REG) continue; #endif /* open the file and read the property value */ fd = openat(dir_fd, entry->d_name, O_RDONLY | O_NOFOLLOW); if (fd < 0) { ERROR("Unable to open hold property file \"%s\" errno: %d\n", entry->d_name, errno); continue; } if (fstat(fd, &sb) < 0) { ERROR("fstat on hold file \"%s\" failed errno: %d\n", entry->d_name, errno); close(fd); continue; } // File must not be accessible to others, be owned by root/root, and // not be a hard link to any other file. if (((sb.st_mode & (S_IRWXG | S_IRWXO)) != 0) || (sb.st_uid != 0) || (sb.st_gid != 0) || (sb.st_nlink != 1)) { ERROR("skipping insecure hold property file %s (uid=%u gid=%u nlink=%d mode=%o)\n", entry->d_name, (unsigned int)sb.st_uid, (unsigned int)sb.st_gid, sb.st_nlink, sb.st_mode); close(fd); continue; } length = read(fd, value, sizeof(value) - 1); if (length >= 0) { value[length] = 0; property_set(entry->d_name, value); } else { ERROR("Unable to read hold property file %s errno: %d\n", entry->d_name, errno); } close(fd); } closedir(dir); } else { ERROR("hold:Unable to open hold property directory %s errno: %d\n", HOLD_PROPERTY_DIR, errno); } hold_properties_loaded = 1; } static void write_hold_property(const char *name, const char *value) { char tempPath[PATH_MAX]; char path[PATH_MAX]; int fd; snprintf(tempPath, sizeof(tempPath), "%s/.temp.XXXXXX", HOLD_PROPERTY_DIR); fd = mkstemp(tempPath); if (fd < 0) { ERROR("Unable to write hold property to temp file %s errno: %d\n", tempPath, errno); return; } write(fd, value, strlen(value)); fsync(fd); close(fd); snprintf(path, sizeof(path), "%s/%s", HOLD_PROPERTY_DIR, name); if (rename(tempPath, path)) { unlink(tempPath); ERROR("Unable to rename hold property file %s to %s\n", tempPath, path); } } 然后修改几个地方
void property_init(void) { init_property_area(); @@ -550,6 +666,7 @@ void load_persist_props(void) load_override_properties(); /* Read persistent properties after all default values have been loaded. */ load_persistent_properties(); + load_hold_properties(); } void load_all_props(void) @@ -563,6 +680,7 @@ void load_all_props(void) /* Read persistent properties after all default values have been loaded. */ load_persistent_properties(); + load_hold_properties(); } static bool is_legal_property_name(const char* name, size_t namelen) { size_t i; @@ -264,6 +289,13 @@ int property_set(const char *name, const char *value) * to prevent them from being overwritten by default values. */ write_persistent_property(name, value); + }else if (hold_properties_loaded && + strncmp("hold.", name, strlen("hold.")) == 0) { + /* + * Don't write properties to disk until after we have read all default properties + * to prevent them from being overwritten by default values. + */ + write_hold_property(name, value); } else if (strcmp("selinux.reload_policy", name) == 0 && strcmp("1", value) == 0) { selinux_reload_policy(); @@ -512,6 +544,90 @@ static void load_persistent_properties() persistent_properties_loaded = 1; }
相关推荐
在.NET框架中,`PropertyGrid`控件是一个强大的工具,用于显示和编辑对象的属性。...不过,需要注意的是,过度使用自定义属性可能会增加代码的复杂性和维护难度,因此在实际应用中要权衡利弊,合理运用。
这个范例将向我们展示如何扩展`PropertyGrid`的功能,以支持自定义属性。 `PropertyGrid`控件默认会自动显示关联对象的所有公共属性和字段,但如果我们想要添加一些特殊处理,如自定义编辑器、属性标签、图标等,就...
例如,你可以增加新的属性,或者改变按钮的外观和行为。 ```cpp class CustomButton : public QAbstractButton { Q_OBJECT public: CustomButton(QWidget *parent = nullptr); // ... private slots: void ...
创建好`PropertyDescriptor`和`TypeDescriptor`后,可以将`PropertyGrid`的`DataSource`设置为自定义对象,然后`PropertyGrid`会根据`TypeDescriptor`中的信息显示属性。 ```csharp propertyGrid1.DataSource = my...
自定义标题" Binding="{Binding PropertyName}" /> ``` 二、自定义列标题样式 2.1 使用HeaderStyle 通过设置DataGridColumn的HeaderStyle,可以应用自定义的样式,例如改变字体、颜色、大小等: ```xml ...
6. 属性分类:可能增加了自定义的分类机制,使属性组织更加有序。 在提供的压缩包中,"Readme.txt"通常包含有关项目的信息,如使用说明、安装步骤、注意事项等。"Class"文件夹很可能包含了扩展控件的源代码类,这些...
对于实现多功能性,我们可能需要扩展ComboBox的功能,例如增加搜索功能。这可以通过监听输入字段的变化,并实时过滤模型数据来实现: ```qml TextInput { id: searchInput anchors.left: parent.left anchors....
同时,还可以添加随机性,如流星的大小、速度和方向,以增加真实感。 接下来是“自定义顶部导航”。在Android应用中,顶部导航通常包含应用的Logo、标题和一些操作按钮。为了自定义这部分,我们可以创建一个布局...
[%thread] %-5level %logger - %message%newline %property{MerchantId} %property{CompanyId} %property{XiaoquId}" /> <!-- ... --> ``` 请注意,上述配置示例中的`conversionPattern`值应根据实际需求和...
Android提供了多种动画API,如Tween动画、帧动画(Frame Animation)和属性动画(Property Animation)。在本例中,可能使用了属性动画,比如Alpha(透明度)、Scale(缩放)、Translation(平移)等,通过组合这些...
1. 组件扩展:对现有控件进行功能增强或样式修改,例如自定义Button增加动画效果。 2. 组合控件:结合多个基础控件,形成新的复合控件,如日历视图、滑动选择器等。 3. 完全自定义:从头构建控件,实现特定功能,如...
这样做可以让我们在保持原有控件功能的基础上,增加我们所需的特定功能或外观。 例如,如果我们想创建一个具有验证功能的标签,我们可以命名为`Validatetag`,它继承自`System.Windows.Forms.Label`。这个`...
为了增加交互性,自定义控件可能包含动画效果,比如按下按钮时的缩放、颜色变化等。这可以通过`ObjectAnimator`、`ValueAnimator`或`PropertyAnimator`来实现。 5. **在XML布局中使用**: 创建了自定义控件后,...
可以使用ValueAnimator、ObjectAnimator或者自定义View的动画框架,如Property Animation API来实现。 5. **性能优化**:在处理大量自定义View或复杂视图时,性能优化显得尤为重要。避免不必要的重绘,使用硬件加速...
9. **依赖属性**:在定义自定义控件时,依赖属性(Dependency Property)是常用的一种机制,它允许属性值的更改能够通知到相关的逻辑和视图。 10. **MVVM模式**:在大型WPF应用中,Model-View-ViewModel (MVVM) 设计...
- 为了增加视觉效果,我们可以使用Android的属性动画API(Property Animation)来实现如数字滚动、颜色渐变等动态效果。 - 通过定义自定义属性(attrs.xml),可以在XML布局文件中为倒计时控件设置参数,比如起始...
通过这样的方式,我们可以充分利用Hibernate的灵活性,为领域对象增加自定义字段,以满足项目的特殊需求。同时,这也是提升代码可读性和可维护性的一种有效手段。在实际开发中,理解并熟练运用自定义类型能帮助我们...
property alias selectedOptions: ... // 用于存储多选的值 // ... } ``` 2. **扩展功能**:为了支持多选,我们需要添加额外的逻辑来管理多个选择状态。这可能涉及到增加新的属性(如`selectedOptions`),以及...
- 3D翻转效果:通过自定义Transition,实现视图的3D翻转动画,增加视觉冲击力。 6. **调试和测试** - 使用Android Studio的Layout Inspector工具检查动画过程中的布局状态。 - 在不同的设备和Android版本上进行...