@恢复出厂如何保留自定义属性值

最近有个指令切换型号功能,每次恢复出厂设置之后必在重启一次才可以生效

【方案】
bwrite是可执行文件(out\target\product\xxxx\system\xbin\bwrite),bwrite写persist.sys.xxx=yyy键值对到文件/cache/recovery/last_bird.prop和data/last_bird.prop,开机时将/cache/recovery/last_bird.prop载入内存,应用可通过 SystemProperties.getxxx 获取其中键值对;对于无法使用system property的地方,直接读取文件data/last_bird.prop 获得键值。(/cache/recovery/last_xxx文件恢复出厂设置不会被删除,但是一般应用没有权限读这个文件,所有有个data/last_bird.prop的备份)

开机load last_bird.prop:
system\core\init\property_service.cpp
load_properties_from_file("/cache/recovery/last_bird.prop", NULL); ----------这句话的作用是可以将cache/recovery/last_bird.prop中所有内容当作类似build.prop里当作属性值来获取

修改两个last_bird.prop文件权限

device/sprd/scx35l/sp9832a_5m_volte_bird/rootdir/root/init.sp9832a_5m_volte_bird.rc 添加

on early-boot

chmod 0644 /cache/recovery/last_bird.prop
chmod 0644 /data/last_bird.prop

最重要的是bwrite这个可执行文件----详细如下附件,通过这个创建,修改/cache/recovery/last_bird.prop和data/last_bird.prop

packages/apps/Settings/bwrite/bwrite.c

else if(argv[i][0] == ‘m’) {
memset(value, 0, sizeof(value));

for(k = 0, pspace = argv[i]; k < strlen(argv[i]); k++, pspace++) {
if(*pspace == ‘@’) *pspace = ’ ';
}
// sprintf(value, “ro.bird.model=%s\n persist.sys.bird.model=%s\n”, pvalue);
sprintf(value, “persist.sys.bird.model=%s\n”, pvalue);
strcat(writeContent, value);
}

…/data/upload/1/201905/0916573204631dl6.c

在device/sprd/scx35l/common/rootdir/root/init.sc8830_ieb.rc注册bwrite服务

service bwrite /system/xbin/bwrite
user root
group root
oneshot

声明bwrite权限:

device/sprd/scx35l/common/sepolicy/bwrite.te

type bwrite, domain;
type bwrite_exec, exec_type, file_type;

STOPSHIP: Permissive is not allowed. CTS violation!

init_daemon_domain(bwrite)
net_domain(bwrite)
allow bwrite system_data_file:dir rw_dir_perms;
allow bwrite system_data_file:dir create_dir_perms;
allow bwrite system_data_file:file { write create open ioctl };
allow bwrite system_data_file:file rw_file_perms;
allow bwrite system_data_file:file create_file_perms;
allow bwrite last_bird_prop:file { read write create open getattr setattr };
allow bwrite self:capability { fsetid dac_override };
allow bwrite shell_exec:file {execute execute_no_trans read open };
allow bwrite system_file:file execute_no_trans;
allow bwrite cache_file:dir { write create add_name };
allow bwrite cache_file:file { write create open setattr };

绑定执行档类型:

device/sprd/scx35l/common/sepolicy/file_contexts

/system/xbin/bwrite u:object_r:bwrite_exec:s0
/cache/recovery/last_bird.prop u:object_r:cache_recovery_file:s0

声明last_bird_prop(bwrite.te里面用了)

device/sprd/scx35l/common/sepolicy/file.te

type last_bird_prop, file_type, data_file_type;

在recovery中给last_bird_prop赋予权限:

device/sprd/scx35l/common/sepolicy/recovery.te

allow recovery last_bird_prop:file {open read write getattr};

从neverallow中去掉bwrite:
external/sepolicy/domain.te

neverallow {
domain

-bwrite
} system_data_file:file no_w_file_perms;

在java 中是如何调用bwrite,以型号为例

在packages/apps/Settings/bird/src/com/bird/settings/BirdModelActivity.java

切换之后发送广播

Intent intent = new Intent(“bird.intent.receiver.model_new”);
intent.putExtra(“model”, model);
mContext.sendBroadcast(intent);
在frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java 中处理广播做如下操作

String command = “bwrite:bird_write_prop” + " " + BIRD_PROP_PATH + " " + param;
Log.i(TAG, “command:” + command);
SystemProperties.set(“ctl.start”, command); ---------启动bwrite服务修改persist.sys.bird.model的值

最终设置下型号和第三方获取型号是从frameworks/base/core/java/android/os/Build.java中获取

public static final String realMODEL = getString(“ro.product.model”);
public static String MODEL = SystemProperties.get(“persist.sys.bird.model”, realMODEL); -----------获取修改后的值

关键点:

1.是需要一个将属性值保存在恢复出厂不被删除的文件,我们这里是cache/recovery/last_bird.prop

2.可以get到属性值,如过get不到可读取data/last_bird.prop文件(这就有可能牵扯到恢复出厂刚开机还没来得及生成此文件,Bug就是由此引起,还有一种方按,写个shell脚本在init.rc中就加载拷贝,可参考网址:https://blog.csdn.net/yang_gaolei/article/details/78864429 ------init.rc 执行shell脚本 ---- 制作一初始化配置文件)

注意:调试过程中很容易遇到avc,等selinux权限相关

比如这行warning log:
avc: denied { write } for name=“last_bird.prop” dev=“mmcblk0p23” ino=23 scontext=u:r:bwrite:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
那么我们就得出最后的规则是在bwrite.te中添加:
allow bwrite system_data_file:file { write };

在手机关机或者开启过程中可短暂获取log的命令:adb shell dmesg >1.txt 查询内核缓冲区信息 -------可以看到一些init 的信息

指令切换型号–相机拍照详情型号未改变

原因读取的是ro.product.model 的值,目前两种方案:

1.找到bdA/qiku/vendor/sprd/modules/libcamera/oem2v0/src/cmr_setting.c

这个路径下的文件,修改下

//bird modify by zss

property_get(“persist.sys.bird.model”, property, EXIF_DEF_MODEL);
//property_get(“ro.product.model”, property, EXIF_DEF_MODEL);

  1. 比较彻底的一种,所有获取ro.product.model的值都转换成获取persist.sys.bird.model
    bdA/qiku/system/core/libcutils/properties.c

int property_get(const char *key, char *value, const char *default_value)
{
int len;
// bird modify by zss begin
ALOGV(“old key=%s\n”,key );
char oldmodel[]= “ro.product.model”;
char newmodel[] = “persist.sys.bird.model”;
if(0 == strncmp(oldmodel,key,strlen(oldmodel))){
key = newmodel;
}
ALOGV(“new key=%s\n”,key );
//property_get(“ro.product.model”, property, EXIF_DEF_MODEL);
// bird modify by zss end

len = __system_property_get(key, value);
if(len > 0) {return len;
}
if(default_value) {len = strlen(default_value);if (len >= PROPERTY_VALUE_MAX) {len = PROPERTY_VALUE_MAX - 1;}memcpy(value, default_value, len);value[len] = '\0';
}
return len;

}

恢复出厂如何保留自定义属性值相关推荐

  1. Android客制化------恢复出厂设置但保留文件

    很久没有记录了,持之以恒做一件事,需要一定的毅力呐! 最近遇到了一个需求,要求恢复出厂设置保留内置sd卡下某个目录的文件.思来想去,从驱动那边备份校准信号文件得到了一些思路.因为带通话设置的装置需要进 ...

  2. Android客制化-恢复出厂设置但保留文件

    很久没有记录了,持之以恒做一件事,需要一定的毅力呐!  最近遇到了一个需求,要求恢复出厂设置保留内置sd卡下某个目录的文件.思来想去,从驱动那边备份校准信号文件得到了一些思路.因为带通话设置的装置需要 ...

  3. 恢复出厂设置,保留数据的方法

    创建appName/assets/keep_list 在keep_list下添加要保留的文件路径就ok了 eg:/data/fprint/fprint.db 恢复出厂设置,此文件的数据将不会删除

  4. ibm刀片服务器 系统初始密码,IBM刀片服务器管理模块恢复出厂默认值实战

    IBM刀片服务器管理模块恢复出厂默认值实战 IBM官方文档如下: Resetting the management module back to factory defaults The BladeC ...

  5. Juniper SSG恢复出厂默认值

    设备开机状态下,使用插到设备正前方的reset口,有手感,直到等到status灯变成橙色,再变绿色后,针松开2秒钟,再将针插入reset孔不放直到灯变红,此时所有端口灯都会灭掉.针取出即可.最后设备会 ...

  6. 计算机快捷键 还原默认值,bios怎么恢复出厂设置 恢复bios出厂默认值的方法

    BIOS作为电脑启动时的首要信息读取位置,当电脑进行bios设置会因为自己的粗心大意而出现错误操作,很多人并不了解也不敢随意去修改BIOS设置,导致无法正常启动,造成更多的困扰.所以今天笔者想带大家了 ...

  7. TP-LINK产品复位大全(路由器初始化恢复出厂默认值)

    TP-LINK产品复位大全(路由器初始化恢复出厂默认值) 宽带路由器类: 1).具有M1.M2灯的TL-R4XX路由器复位方法: 在路由器的前/后面板上有一个小孔,旁有单词:Reset: 关闭路由器的 ...

  8. 思科IP Phone恢复出厂值

    思科IP Phone恢复出厂默认值 1.电话加电或连接POE交换机,按住#号不要松开,等待电话面板的灯交替闪烁时-松开#号 2.按顺序输入123456789*0#,电话重启两次,就可以恢复出厂配置了. ...

  9. Android7.x 通过Recovery保留特定文件实现恢复出厂设置后保留系统语言设置

    Android7.x 通过Recovery保留特定文件实现恢复出厂设置后保留系统语言设置 最近有一个需求,要求在恢复出厂设置之后不还原语言设置,由于我们知道语言设置可以在Properties Syst ...

最新文章

  1. 11.python并发入门(part9 多进程模块multiprocessing基本用法)
  2. linux netstat端口占用,Linux系统使用 netstat 查看和检查系统端口占用情况
  3. 懒加载中进行字典转模型
  4. C语言文件操作 给M个数随机分组
  5. pip/conda导出 requirements.txt 注意事项
  6. 伪数组转化真数组_ES6 数组方法
  7. CCNET自动构建之路
  8. dbMigration .NET 数据同步迁移工具
  9. [译] 手摸手教你如何轻松发布私有 App
  10. mr InputFormat类
  11. 微软推送补丁的服务器叫什么,即将大规模推送: 微软介绍KB4023057易升补丁相关功能...
  12. Windows Server 2008 R2 免费使用900天的方法
  13. PHP 互联网架构师成长之路*「swoole」终极指南
  14. Excel如何实现下拉选项 二级下拉框 数据联动
  15. 滑窗口统计基因组GC含量的分布
  16. wincc服务器设置位置,wincc客户端访问服务器设置
  17. 汉高2020财年第三季度实现强劲的有机销售额增长,增幅达3.9%
  18. 基于Qt5图形视图框架的“俄罗斯方块”
  19. 【Codevs1422】【网络流】河城荷取
  20. vb.net 教程 3-4 窗体编程 公共控件2 radiobutton ComboBox

热门文章

  1. 如何判断移动终端访问还是PC访问?
  2. Django ORM的外键ForeignKey中的on_delete的参数解析
  3. python代码实现的特效_Python 实现PS滤镜的旋涡特效
  4. canvas绘画板的实现(兼容手机)
  5. 解读摩根士丹利互联网报告:移动,社交,广告
  6. endorsed java_【转】Java endorsed
  7. 750ti显卡能支持服务器吗,NVIDIA Geforce GTX 750 Ti能玩吃鸡吗
  8. Java基础教程之Java简介
  9. eclipse启动tomcat时,提示backup文件夹下,系统找不到指定的路径
  10. 盛合晶微半导体公司C轮融资3亿美元;调研显示,人工智能/大数据/云计算调薪率领跑高科技 | 全球TMT...