天天看點

Android 使用代碼進入Recovery模式自動更新指定固件包

2-29,4年才有一次的日子,小李子終于抱走了Oscar小金人。

進入Recovery并自動更新指定路徑下的更新包,OTA将固件包下載下傳到指定路徑/sdcard/update.zip,然後執行以下代碼進入Recovery執行安裝:

private static File RECOVERY_DIR = new File("/cache/recovery");
	private static File COMMAND_FILE = new File(RECOVERY_DIR, "command");

	private static void recoveryMode(Context context) throws IOException {
		String arg = "--update_package=/sdcard/update.zip";
		RECOVERY_DIR.mkdirs();

		FileWriter command = new FileWriter(COMMAND_FILE);
		try {
			command.write(arg); // 往/cache/recovery/command中寫入recoveryELF的執行參數。
			command.write("\n");
		} finally {
			command.close();
		}
		PowerManager pm = (PowerManager) context
				.getSystemService(Context.POWER_SERVICE);
		pm.reboot("recovery"); // 調用PowerManager類中的reboot方法

		throw new IOException("Reboot failed (no permissions?)");
	}
           

需要聲明REBOOT權限,需要是system uid才能調用該權限。

<uses-permission android:name="android.permission.REBOOT" />
           

一般應用沒有權限,可以在系統應用中開放對應接口,接收到指定廣播後執行以上代碼。