RK3399平台Android 9.0出厂重置机制解析
在RK3399硬件平台上运行的Android 9.0系统中,执行"恢复出厂设置"操作并非单一模块行为,而是跨层协同完成的系统级流程。该过程涵盖应用层触发、框架层权限校验与参数解析、以及底层Recovery模式启动三个关键阶段。
整体执行路径
- 用户交互层:Settings应用中的
MasterClearConfirm组件捕获点击事件,构造并广播Intent.ACTION_FACTORY_RESET,附带擦除标识(如SD卡、eSIM等)及触发原因。 - 系统服务层:注册于
AndroidManifest.xml的MasterClearReceiver接收广播。该Receiver要求调用方具备MASTER_CLEAR系统权限,并对过时字段(如ACTION_MASTER_CLEAR)发出警告日志。 - 持久化与跳转层:Receiver解析参数后,将清洗指令写入
/cache/recovery/command文件,随后触发设备重启进入Recovery环境,由Recovery进程读取该文件并执行对应分区擦除逻辑。
核心代码逻辑重构示例
以下为关键环节的等效实现,已重构变量命名、控制流结构与日志策略,保持语义一致性:
// Settings应用端:触发重置请求
public class FactoryResetLauncher {
public static void initiateReset(Context ctx, boolean shouldEraseSd, boolean shouldRemoveEsims) {
Intent resetIntent = new Intent(Intent.ACTION_FACTORY_RESET);
resetIntent.setPackage("android");
resetIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
resetIntent.putExtra("reset_source", "settings_ui");
resetIntent.putExtra("clear_sdcard", shouldEraseSd);
resetIntent.putExtra("purge_embedded_profiles", shouldRemoveEsims);
ctx.sendBroadcast(resetIntent);
}
}
// 系统服务端:广播接收器处理逻辑
public class SystemResetHandler extends BroadcastReceiver {
private static final String TAG = "SysResetHandler";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (!Intent.ACTION_FACTORY_RESET.equals(action) &&
!Intent.ACTION_MASTER_CLEAR.equals(action)) {
return;
}
boolean isTrusted = "google.com".equals(intent.getStringExtra("from"));
if (Intent.ACTION_REMOTE_INTENT.equals(action) && !isTrusted) {
Log.w(TAG, "Discarded untrusted remote reset request");
return;
}
boolean wipeSd = intent.getBooleanExtra("clear_sdcard", false);
boolean purgeProfiles = intent.getBooleanExtra("purge_embedded_profiles", false);
String source = intent.getStringExtra("reset_source");
Log.i(TAG, String.format("Initiating factory reset from %s | SD:%b | eSIM:%b",
source, wipeSd, purgeProfiles));
// 向Recovery写入指令(简化示意)
writeRecoveryCommand(wipeSd, purgeProfiles);
rebootIntoRecovery(context);
}
private void writeRecoveryCommand(boolean sdWipe, boolean profileWipe) {
try (FileWriter writer = new FileWriter("/cache/recovery/command")) {
writer.write("--wipe_data\n");
if (sdWipe) writer.write("--wipe_cache\n");
if (profileWipe) writer.write("--wipe_eid\n");
} catch (IOException e) {
Log.e(TAG, "Failed to write recovery command", e);
}
}
private void rebootIntoRecovery(Context ctx) {
PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
pm.reboot("recovery");
}
}
上述流程严格遵循Android 9.0的权限模型与安全约束,确保仅系统应用或经签名认证的服务可发起重置操作,同时通过显式参数传递与日志记录增强可追溯性与调试能力。