测试平台

Platform: RK3399/RK3328
OS: Android9.0

现象

点击恢复出场设置,应用崩溃.

分析

这是因为系统提供了FRP(google的账户锁,全称factory reset protection,在android 5.x以后释放的功能,避免手机被盗)

FRP和正常FactoryReset的差别

首先,我们要理解信任回复和非信任回复的差别,在Android中,回复出厂设置可以分为:可信任回复 && 不可信任回复:

  1. 可信任恢复出场设置方式: 在setting界面中选择恢复出厂设置
  2. 不可信任恢复出场设置方式: 通过其余方式(比如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:点击恢复出场设置崩溃的问题相关推荐

  1. Android 9.0系统恢复出场设置源码流程分析

    前言 作为Framework层的开发人员,如果我们想让系统恢复出厂设置,一般有一下三种方式: 1.在[系统设置页面]进入[恢复出厂设置页面],点击[恢复出厂设置]按钮. 2.直接通过adb发送恢复出厂 ...

  2. Android 10.0 导航栏增加虚拟按键 点击控制下拉状态栏展开和收缩

    目录 1.概述 2.导航栏增加虚拟按键 点击控制下拉状态栏展开和收缩的核心代码

  3. android重置系统,安卓手机越用越卡,恢复出厂设置真有用?别瞎搞,看完就明白了!...

    安卓手机越用越卡,恢复出厂设置真有用?别瞎搞,看完就明白了! 现在手机的价格逐渐的开始上升,一部好一点的手机价格还是比较贵的,所以很多人想要节省更多的换机支出,都会想要购买到一款可以使用的比较久的手机 ...

  4. android5.0源码开发之NVRam存储,恢复出厂设置数据不被擦除--上篇

    MTK有一个特殊的存储区域,叫NVRam,这部分存储器用来保存重要的数据,如:校准参数.IMEI写号.FactoryMode等,即使刷机,只要不格式化下载,这些数据还在,恢复出厂设置也不会被擦除.今天 ...

  5. nexus5 android 7.0,Android 7.0 Nougat正式版刷机教程—nexus5X

    Android 7.0正式版发布已经有一段时间,手上有nexus设备的童鞋不知道更新了最新系统没有,反正我的nexus 5x 6.0的系统是始终没有收到7.0的OTA升级推送,无奈,只有自己动手,丰衣 ...

  6. Android6.0 Reset恢复出厂设置流程分析

    点击Settings应用中的恢复出厂设置按钮后流程分析: 先使用grep命令搜索"恢复出厂设置"字符串,找到相应的布局文件: packages/apps/Settings/res/ ...

  7. Android 8.0 WiFi Ap 热点控制接口

    1. Android 7.0 及其以前的 WiFi 热点接口 /*** Gets the Wi-Fi enabled state.** @return One of {@link #WIFI_AP_S ...

  8. 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 ...

  9. 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. ...

  10. 全志H6 Android 7.0 平台 修改横竖屏显示

    **问题描述:**全志H6 Android 7.0 并没有给出横竖屏显示属性的设置,可以自己设置一个persist.sys.rotation属性来控制横竖屏的显示 解决方案: diff --git a ...

最新文章

  1. ICCV2021 | SMCA:即插即用的共同注意力模型,可使DETR收敛加速10倍
  2. Skynet入门范例之sproto
  3. Winform中实现文件另存为后并打开文件
  4. SAP Fiori My task里complete checkbox的处理
  5. Linux常用备份恢复工具
  6. 对于scanf,strcpy等函数报4996错误的粗暴而简单解决办法
  7. jQuery如何创建元素
  8. c语言文件归档,Go语言tar归档文件的读写操作
  9. 《现代操作系统(中文第三版)》课后习题——第二章 进程与线程
  10. 15款超实用学习APP安利
  11. c语言字段宽度,2.6.3 控制输出的字段宽度
  12. Android APP极光推送取消关联启动配置
  13. 无线射频专题《IEEE 802.11协议讲解1@路由高级配置项,Beacon周期、RTS阈值、DTIM》
  14. mysql 定义取值范围_MySQL中各种字段的取值范围
  15. 远程实时读取海康威视4G网络摄像头视频
  16. Python实用案例,Python脚本实现玩转emoji,我微又“偷偷”更新这个表情!
  17. Django学习日志三:模型层
  18. 微信公众号网页授权40029错误,小程序微信支付前后端逻辑? (微信授权支付之 (篇一))
  19. 【读者群答疑】使用xlwings编程时,执行语句bk = xw.books.add()时报错
  20. “The user name or passphrase you entered is not correct “ for Mac Xcode

热门文章

  1. 《认知天性》听后感及听书笔记
  2. 微信gif表情包在线编辑怎么做?
  3. 福建省小学四年级上册计算机知识点总结,小学四年级上册数学知识点大全【1-6单元】...
  4. 富文本编辑器:editor.md
  5. mysql查看mylog命令_mysql 日志查询(查看mysql日志命令)
  6. 高效准确处理scipy.misc 中imresize、imread导入错误问题
  7. WT6255 WIFI/BT调试文档
  8. 51开发板的功能及简单使用
  9. ArcGIS地形图地形标注详解(附练习数据下载)
  10. 单声道数字功放芯片-NTP8835