RK3568 Android11系统 代码控制OTA
RK3568 Android11系统,将命名为update.zip的OTA升级包放置在U盘或系统根目录下,系统中的RKUpdateService会自动检测到升级包,并提示固件升级。
目的:不通过系统RKUpdateService检测升级,走自定义的升级流程。
编写代码控制升级内容
AndroidManifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:sharedUserId="android.uid.system">
<uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" />
<uses-permission android:name="android.permission.DELETE_CACHE_FILES" />
<uses-permission android:name="android.permission.REBOOT" />
<uses-permission android:name="android.permission.MASTER_CLEAR" />
<uses-permission android:name="android.permission.RECOVERY" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>
具体实现
// /storage/emulated/0/firmware_update.zip
private static String updatePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/firmware_update.zip";
private Thread runnable = new Thread() {
@Override
public void run() {
Log.d(TAG, "Start update .............path : " + updatePath);
File file = new File(updatePath);
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
assert pm != null;
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "demo:needProcessBar");
try {
wl.acquire(10 * 60 * 1000L /*10 minutes*/);
// verify路径传入 /storage/emulated/0/firmware_update.zip
RecoverySystem.verifyPackage(file, OtaActivity.this, null);
Log.d(TAG, "Verify package complete.");
// install路径修改为 /data/media/0/firmware_update.zip,recovery模式路径为/data/media/0/
RecoverySystem.installPackage(OtaActivity.this, new File("/data/media/0/firmware_update.zip"));
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
} finally {
wl.release();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityOtaBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
runnable.start();
}
app设置为系统app
通过adb命令放置到系统目录下
adb push demo.apk /sdcard/
adb shell
su
-- mount查看挂载目录 修改读写权限
mount
mount -o remount,rw /system
cat /sdcard/demo.apk > /system/app/demo.apk
mount -o remount,ro /system
reboot