恢复出厂如何保留自定义属性值
@恢复出厂如何保留自定义属性值
最近有个指令切换型号功能,每次恢复出厂设置之后必在重启一次才可以生效
【方案】
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);
- 比较彻底的一种,所有获取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;
}
恢复出厂如何保留自定义属性值相关推荐
- Android客制化------恢复出厂设置但保留文件
很久没有记录了,持之以恒做一件事,需要一定的毅力呐! 最近遇到了一个需求,要求恢复出厂设置保留内置sd卡下某个目录的文件.思来想去,从驱动那边备份校准信号文件得到了一些思路.因为带通话设置的装置需要进 ...
- Android客制化-恢复出厂设置但保留文件
很久没有记录了,持之以恒做一件事,需要一定的毅力呐! 最近遇到了一个需求,要求恢复出厂设置保留内置sd卡下某个目录的文件.思来想去,从驱动那边备份校准信号文件得到了一些思路.因为带通话设置的装置需要 ...
- 恢复出厂设置,保留数据的方法
创建appName/assets/keep_list 在keep_list下添加要保留的文件路径就ok了 eg:/data/fprint/fprint.db 恢复出厂设置,此文件的数据将不会删除
- ibm刀片服务器 系统初始密码,IBM刀片服务器管理模块恢复出厂默认值实战
IBM刀片服务器管理模块恢复出厂默认值实战 IBM官方文档如下: Resetting the management module back to factory defaults The BladeC ...
- Juniper SSG恢复出厂默认值
设备开机状态下,使用插到设备正前方的reset口,有手感,直到等到status灯变成橙色,再变绿色后,针松开2秒钟,再将针插入reset孔不放直到灯变红,此时所有端口灯都会灭掉.针取出即可.最后设备会 ...
- 计算机快捷键 还原默认值,bios怎么恢复出厂设置 恢复bios出厂默认值的方法
BIOS作为电脑启动时的首要信息读取位置,当电脑进行bios设置会因为自己的粗心大意而出现错误操作,很多人并不了解也不敢随意去修改BIOS设置,导致无法正常启动,造成更多的困扰.所以今天笔者想带大家了 ...
- TP-LINK产品复位大全(路由器初始化恢复出厂默认值)
TP-LINK产品复位大全(路由器初始化恢复出厂默认值) 宽带路由器类: 1).具有M1.M2灯的TL-R4XX路由器复位方法: 在路由器的前/后面板上有一个小孔,旁有单词:Reset: 关闭路由器的 ...
- 思科IP Phone恢复出厂值
思科IP Phone恢复出厂默认值 1.电话加电或连接POE交换机,按住#号不要松开,等待电话面板的灯交替闪烁时-松开#号 2.按顺序输入123456789*0#,电话重启两次,就可以恢复出厂配置了. ...
- Android7.x 通过Recovery保留特定文件实现恢复出厂设置后保留系统语言设置
Android7.x 通过Recovery保留特定文件实现恢复出厂设置后保留系统语言设置 最近有一个需求,要求在恢复出厂设置之后不还原语言设置,由于我们知道语言设置可以在Properties Syst ...
最新文章
- 11.python并发入门(part9 多进程模块multiprocessing基本用法)
- linux netstat端口占用,Linux系统使用 netstat 查看和检查系统端口占用情况
- 懒加载中进行字典转模型
- C语言文件操作 给M个数随机分组
- pip/conda导出 requirements.txt 注意事项
- 伪数组转化真数组_ES6 数组方法
- CCNET自动构建之路
- dbMigration .NET 数据同步迁移工具
- [译] 手摸手教你如何轻松发布私有 App
- mr InputFormat类
- 微软推送补丁的服务器叫什么,即将大规模推送: 微软介绍KB4023057易升补丁相关功能...
- Windows Server 2008 R2 免费使用900天的方法
- PHP 互联网架构师成长之路*「swoole」终极指南
- Excel如何实现下拉选项 二级下拉框 数据联动
- 滑窗口统计基因组GC含量的分布
- wincc服务器设置位置,wincc客户端访问服务器设置
- 汉高2020财年第三季度实现强劲的有机销售额增长,增幅达3.9%
- 基于Qt5图形视图框架的“俄罗斯方块”
- 【Codevs1422】【网络流】河城荷取
- vb.net 教程 3-4 窗体编程 公共控件2 radiobutton ComboBox
热门文章
- 如何判断移动终端访问还是PC访问?
- Django ORM的外键ForeignKey中的on_delete的参数解析
- python代码实现的特效_Python 实现PS滤镜的旋涡特效
- canvas绘画板的实现(兼容手机)
- 解读摩根士丹利互联网报告:移动,社交,广告
- endorsed java_【转】Java endorsed
- 750ti显卡能支持服务器吗,NVIDIA Geforce GTX 750 Ti能玩吃鸡吗
- Java基础教程之Java简介
- eclipse启动tomcat时,提示backup文件夹下,系统找不到指定的路径
- 盛合晶微半导体公司C轮融资3亿美元;调研显示,人工智能/大数据/云计算调薪率领跑高科技 | 全球TMT...