安卓11系统RK3568 代码控制OTA

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

相关推荐

  1. 11系统RK3568 代码控制OTA

    2024-03-26 10:30:03       57 阅读
  2. rk3568 11 修改android id

    2024-03-26 10:30:03       35 阅读
  3. rk3588 13 应用安装黑名单的接口

    2024-03-26 10:30:03       58 阅读
  4. rk3588 13 暴露相机开关接口

    2024-03-26 10:30:03       30 阅读
  5. rk3568 11双屏异显,隐藏副屏的导航栏

    2024-03-26 10:30:03       63 阅读
  6. RK3568 12 EC20模块NOCONN没有ip的问题(已解决)

    2024-03-26 10:30:03       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-26 10:30:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-26 10:30:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-26 10:30:03       82 阅读
  4. Python语言-面向对象

    2024-03-26 10:30:03       91 阅读

热门阅读

  1. 数据结构——顺序表(C语言版)

    2024-03-26 10:30:03       45 阅读
  2. 深入理解Elasticsearch高效原理

    2024-03-26 10:30:03       41 阅读
  3. 二刷代码随想录——单调栈day58

    2024-03-26 10:30:03       41 阅读
  4. 每天30分钟python(第一天)

    2024-03-26 10:30:03       39 阅读
  5. Vue 中的 computed 和 watch 的区别

    2024-03-26 10:30:03       41 阅读
  6. flutter项目使用ffi和原生交互问题积累

    2024-03-26 10:30:03       39 阅读
  7. Flutter中被屏蔽的概念,Scheduler(调度器)

    2024-03-26 10:30:03       34 阅读
  8. 医疗器械包装ASTM D4169 松散振动

    2024-03-26 10:30:03       30 阅读
  9. C语言实现广播Echo通信

    2024-03-26 10:30:03       35 阅读
  10. Rust 实战练习 - 4. 网络 TCP/UDP/Channel

    2024-03-26 10:30:03       34 阅读