[Android 9.0][RK3399/RK3328] Settings->Factory Reset:点击恢复出场设置崩溃的问题

本文详细解析了Android系统的FRP(工厂复位保护)功能及其与常规出厂设置的区别。介绍了可信任与不可信任恢复的不同之处,并给出了针对RK3399/RK3328平台Android 9.0设备上应用崩溃问题的修复方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试平台

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())) {

<think>我们正在讨论的是在项目中使用JSP时,如何配置tomcat-embed-jasper依赖以及版本匹配问题。根据引用[1]和引用[4]:引用[1]展示了依赖配置示例:<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId><version>7.0.59</version></dependency>引用[4]说明在SpringBoot中,我们通常使用内置的Tomcat(通过spring-boot-starter-web),而tomcat-embed-jasper用于支持JSP,有时会设置scope为provided。用户问题:是否需要配置tomcat-jasper依赖以及版本匹配要求?回答:1.在SpringBoot项目中,如果需要使用JSP,则需要显式添加tomcat-embed-jasper依赖。因为spring-boot-starter-web依赖的嵌入式Tomcat默认不包含JSP解析能力。2.版本匹配:由于SpringBoot管理了其内置Tomcat的版本,因此我们通常不需要指定tomcat-embed-jasper的版本,而是继承SpringBoot的依赖管理。即使用SpringBoot提供的版本号(可以通过查看SpringBoot的文档或查看其依赖管理来确定兼容的版本)。具体配置:在Maven项目中,可以这样配置(以SpringBoot2.x为例,具体版本请根据使用的SpringBoot版本调整):```xml<dependencies><!--其他依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--添加对JSP的支持--><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId><!--注意:在SpringBoot管理的项目中,通常不需要指定版本,由SpringBoot的parent或者依赖管理决定--><!--但如果你需要指定,请确保与SpringBoot内置Tomcat版本一致--><!--如果不一致,可能会出现兼容性问题--><!--通过查看SpringBoot的文档,可以知道当前版本使用的Tomcat版本,然后选择相同版本的jasper--><!--scope通常为provided,因为运行时由嵌入式容器提供--><scope>provided</scope></dependency></dependencies>```版本对应关系:-在SpringBoot中,我们可以在官方文档的附录中找到依赖的版本对应关系。例如,SpringBoot2.1.x.RELEASE对应Tomcat9.0.x,那么我们就应该使用tomcat-embed-jasper的9.0.x版本。-但是,在SpringBoot项目中,我们通常不需要显式指定版本,因为SpringBoot的dependencymanagement已经为我们管理了。如果我们使用SpringBoot的父项目(parent)或者使用依赖管理(dependencyManagement),那么版本会自动匹配。如何查看当前SpringBoot使用的Tomcat版本?方法1:查看SpringBoot官方文档(对应版本的ReferenceDoc),在附录中有依赖版本列表。方法2:通过Maven命令:`mvndependency:tree`,查看spring-boot-starter-web引入的tomcat-embed-core的版本,那么tomcat-embed-jasper的版本应该与之相同。注意:如果项目不是SpringBoot项目,而是传统的SpringMVC项目部署到独立的Tomcat中,那么通常不需要添加tomcat-embed-jasper,因为Tomcat容器已经提供了。但是,如果需要在开发时运行(比如使用内嵌Tomcat运行),则可能需要添加,并且版本必须与目标运行环境Tomcat版本一致。总结:-在SpringBoot中使用JSP,需要添加tomcat-embed-jasper依赖,通常设置scope为provided。-版本由SpringBoot管理,一般无需指定。如果出现冲突或需要指定,则版本必须与SpringBoot内嵌的Tomcat版本一致。示例:假设你使用的是SpringBoot2.4.5,它内嵌的Tomcat版本是9.0.45,那么tomcat-embed-jasper的版本也应该是9.0.45。引用[2]和[3]提到了JSP预编译的存放位置,这与依赖配置关系不大,主要是Tomcat运行时的行为。因此我们主要参考引用[1]和[4]。因此,配置示例中我们无需写版本号(由SpringBoot管理),但要注意scope。相关问题:§§相关问题§§1.SpringBoot项目中如何查看当前使用的Tomcat版本?2.为什么tomcat-embed-jasper的scope通常设置为provided?3.除了tomcat-embed-jasper,使用JSP还需要哪些依赖?</think> ### 如何正确配置 tomcat-embed-jasper 依赖及版本匹配 在 Java Web 项目中正确配置 `tomcat-embed-jasper` 依赖需要理解以下关键点: #### 1. **是否必须配置?** - ✅ **需要显式配置**:虽然 Tomcat 自带 Jasper JSP 引擎,但使用 Spring Boot 内嵌 Tomcat 时,必须单独声明此依赖才能支持 JSP 解析[^4]。 - ❌ 不使用 JSP 时可省略:纯 HTML/Thymeleaf 项目无需此依赖。 #### 2. **版本匹配规则** 版本必须严格匹配 Tomcat 主版本号: | Tomcat 版本 | 对应依赖配置示例 | |------------|-----------------| | Tomcat 10 | `tomcat-embed-jasper:10.1.x` | | Tomcat 9 | `tomcat-embed-jasper:9.0.x` | | Tomcat 8 | `tomcat-embed-jasper:8.5.x` | | Tomcat 7 | `tomcat-embed-jasper:7.0.x`[^1] | **重要原则**: ```tex \text{版本号} \left( \frac{\text{tomcat-embed-jasper}}{\text{Tomcat 服务器}} \right) = \frac{\text{主版本号}}{\text{主版本号}} \pm \text{小版本更新} ``` #### 3. **Spring Boot 项目配置示例** ```xml <dependencies> <!-- Spring Boot Web 基础依赖(含内嵌 Tomcat) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- JSP 支持依赖(版本自动继承 Spring Boot 管理) --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> <!-- 关键:避免打包冲突[^4] --> </dependency> </dependencies> ``` #### 4. **传统 WAR 项目配置** ```xml <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper</artifactId> <version>9.0.68</version> <!-- 需与服务器版本一致 --> <scope>provided</scope> <!-- 服务器运行时提供 --> </dependency> ``` #### 5. **验证版本匹配** 检查版本一致性: ```bash # 查看服务器版本 $ catalina.sh version | grep "Server version" # Maven查看依赖树 $ mvn dependency:tree | grep tomcat-embed-jasper ``` 确保输出版本号前两位(主版本)一致,例如: ```tex \text{Tomcat 服务器: 9.0.68} \quad \text{依赖: 9.0.68} \quad → \quad \text{匹配} \\ \text{Tomcat 服务器: 10.1.7} \quad \text{依赖: 9.0.68} \quad → \quad \text{不匹配} ``` #### 6. **常见错误处理 - **版本冲突**:若出现 `NoSuchMethodError` 等异常,99% 是版本不匹配导致 - **预编译位置问题**:可通过 `scratchdir` 参数指定编译路径[^2][^3] - **Scope 错误**:生产环境必须用 `provided`,开发测试可用 `compile` > **最佳实践**:在 Spring Boot 项目中始终继承父 POM 版本管理,避免手动指定版本号导致冲突[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值