[Android 9.0][RK3399/RK3328] Settings->Factory Reset:点击恢复出场设置崩溃的问题
测试平台
Platform: RK3399/RK3328
OS: Android9.0
现象
点击恢复出场设置,应用崩溃.
分析
这是因为系统提供了FRP(google的账户锁,全称factory reset protection,在android 5.x以后释放的功能,避免手机被盗)
FRP和正常FactoryReset的差别
首先,我们要理解信任回复和非信任回复的差别,在Android中,回复出厂设置可以分为:可信任回复 && 不可信任回复:
- 可信任恢复出场设置方式: 在setting界面中选择恢复出厂设置
- 不可信任恢复出场设置方式: 通过其余方式(比如recovery双清分区,抑或远程通过google账户登录google play servicer清除用户数据等)都为不可信任回复
该功能的意义在于,当手机丢失,用户可登陆google账号进行数据清除,由于远程为不可信任清除,所以 Android会在开机引导界面setupwirzd处会要求验证google账户来确定机主身份,负责不能跳过这个界面,等于软件性的变砖
而功能上他是由android.service.persistentdata.PersistentDataBlockManager提供接口,在frameworks/base/services/core/java/com/android/server/PersistentDataBlockService.java中进行功能实现的.
查看代码可知手机是否属于信任恢复的状态是存在Account Data Blocks中的,其实就是一个独立的存储分区(500kb),该分区在fatctory reset时不能进入,是通过系统中的ro.frp.pst来制定该分区的路劲.由于我们的设备没有开启frp功能,所以ro.frp.pst为null.
解决
修复补丁如下,当frp未开启时不初始化PersistentDataBlockManager
diff --git a/packages/apps/Settings/src/com/android/settings/MasterClearConfirm.java b/packages/apps/Settings/src/com/android/settings/MasterClearConfirm.java
index a92c8f8..8972787 100644
--- a/packages/apps/Settings/src/com/android/settings/MasterClearConfirm.java
+++ b/packages/apps/Settings/src/com/android/settings/MasterClearConfirm.java
@@ -24,6 +24,7 @@ import android.os.AsyncTask;import android.os.Bundle;import android.os.UserHandle;import android.os.UserManager;
+import android.os.SystemProperties;import android.service.oemlock.OemLockManager;import android.service.persistentdata.PersistentDataBlockManager;import android.view.LayoutInflater;
@@ -31,6 +32,7 @@ import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.TextView;
+import android.text.TextUtils;import com.android.internal.logging.nano.MetricsProto.MetricsEvent;import com.android.settings.core.InstrumentedFragment;
@@ -67,10 +69,20 @@ public class MasterClearConfirm extends InstrumentedFragment {return;}- final PersistentDataBlockManager pdbManager = (PersistentDataBlockManager)
+ final PersistentDataBlockManager pdbManager;
+ final OemLockManager oemLockManager;
+
+ boolean hasPdb = !TextUtils.isEmpty(SystemProperties.get("ro.frp.pst"));
+ if(hasPdb){+ pdbManager= (PersistentDataBlockManager)getActivity().getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
- final OemLockManager oemLockManager = (OemLockManager)
+
+ oemLockManager = (OemLockManager)getActivity().getSystemService(Context.OEM_LOCK_SERVICE);
+ }else{+ pdbManager = null;
+ oemLockManager = null;
+ }if (pdbManager != null && !oemLockManager.isOemUnlockAllowed() &&Utils.isDeviceProvisioned(getActivity())) {
[Android 9.0][RK3399/RK3328] Settings->Factory Reset:点击恢复出场设置崩溃的问题相关推荐
- Android 9.0系统恢复出场设置源码流程分析
前言 作为Framework层的开发人员,如果我们想让系统恢复出厂设置,一般有一下三种方式: 1.在[系统设置页面]进入[恢复出厂设置页面],点击[恢复出厂设置]按钮. 2.直接通过adb发送恢复出厂 ...
- Android 10.0 导航栏增加虚拟按键 点击控制下拉状态栏展开和收缩
目录 1.概述 2.导航栏增加虚拟按键 点击控制下拉状态栏展开和收缩的核心代码
- android重置系统,安卓手机越用越卡,恢复出厂设置真有用?别瞎搞,看完就明白了!...
安卓手机越用越卡,恢复出厂设置真有用?别瞎搞,看完就明白了! 现在手机的价格逐渐的开始上升,一部好一点的手机价格还是比较贵的,所以很多人想要节省更多的换机支出,都会想要购买到一款可以使用的比较久的手机 ...
- android5.0源码开发之NVRam存储,恢复出厂设置数据不被擦除--上篇
MTK有一个特殊的存储区域,叫NVRam,这部分存储器用来保存重要的数据,如:校准参数.IMEI写号.FactoryMode等,即使刷机,只要不格式化下载,这些数据还在,恢复出厂设置也不会被擦除.今天 ...
- nexus5 android 7.0,Android 7.0 Nougat正式版刷机教程—nexus5X
Android 7.0正式版发布已经有一段时间,手上有nexus设备的童鞋不知道更新了最新系统没有,反正我的nexus 5x 6.0的系统是始终没有收到7.0的OTA升级推送,无奈,只有自己动手,丰衣 ...
- Android6.0 Reset恢复出厂设置流程分析
点击Settings应用中的恢复出厂设置按钮后流程分析: 先使用grep命令搜索"恢复出厂设置"字符串,找到相应的布局文件: packages/apps/Settings/res/ ...
- Android 8.0 WiFi Ap 热点控制接口
1. Android 7.0 及其以前的 WiFi 热点接口 /*** Gets the Wi-Fi enabled state.** @return One of {@link #WIFI_AP_S ...
- Android 5.0,6.0,7.0,8.0新特性整理
目录 Android 5.0行为变更 Android 6.0行为变更 Android 7.0行为变更 Android 8.0二十大新特性,这些地方像极了iOS? Android 8.0 新变化汇总 A ...
- Android系统恢复出厂设置方法-涵盖5.1 6.0 7.0 7.1 8.0 9.0
最近在8.0系统上面调试公司自主开发的setting,发现无法恢复出厂,原来在7.1 7.0 6.0 5.1上面使用的广播已经没有效果,查阅8.0的原生Settings源码之后发现恢复出厂的代码在8. ...
- 全志H6 Android 7.0 平台 修改横竖屏显示
**问题描述:**全志H6 Android 7.0 并没有给出横竖屏显示属性的设置,可以自己设置一个persist.sys.rotation属性来控制横竖屏的显示 解决方案: diff --git a ...
最新文章
- ICCV2021 | SMCA:即插即用的共同注意力模型,可使DETR收敛加速10倍
- Skynet入门范例之sproto
- Winform中实现文件另存为后并打开文件
- SAP Fiori My task里complete checkbox的处理
- Linux常用备份恢复工具
- 对于scanf,strcpy等函数报4996错误的粗暴而简单解决办法
- jQuery如何创建元素
- c语言文件归档,Go语言tar归档文件的读写操作
- 《现代操作系统(中文第三版)》课后习题——第二章 进程与线程
- 15款超实用学习APP安利
- c语言字段宽度,2.6.3 控制输出的字段宽度
- Android APP极光推送取消关联启动配置
- 无线射频专题《IEEE 802.11协议讲解1@路由高级配置项,Beacon周期、RTS阈值、DTIM》
- mysql 定义取值范围_MySQL中各种字段的取值范围
- 远程实时读取海康威视4G网络摄像头视频
- Python实用案例,Python脚本实现玩转emoji,我微又“偷偷”更新这个表情!
- Django学习日志三:模型层
- 微信公众号网页授权40029错误,小程序微信支付前后端逻辑? (微信授权支付之 (篇一))
- 【读者群答疑】使用xlwings编程时,执行语句bk = xw.books.add()时报错
- “The user name or passphrase you entered is not correct “ for Mac Xcode
热门文章
- 《认知天性》听后感及听书笔记
- 微信gif表情包在线编辑怎么做?
- 福建省小学四年级上册计算机知识点总结,小学四年级上册数学知识点大全【1-6单元】...
- 富文本编辑器:editor.md
- mysql查看mylog命令_mysql 日志查询(查看mysql日志命令)
- 高效准确处理scipy.misc 中imresize、imread导入错误问题
- WT6255 WIFI/BT调试文档
- 51开发板的功能及简单使用
- ArcGIS地形图地形标注详解(附练习数据下载)
- 单声道数字功放芯片-NTP8835