【干货】Android系统定制基础篇:第七部分-Android OTA升级(系统、应用)

news2024/9/22 13:30:27

OTA升级应用

项目地址:https://github.com/aystshen/Android-RomUpgrade.
这是一个负责 Android OTA 升级的后台应用,开机后自动运行后台 Service,支持系统升级和应用升级,支持本地升级(tf卡、u盘)和在线升级(百度),支持推荐升级和静默升级。

已知兼容版本:
● Android 5.1
● Android 6.0
● Android 7.1
● Android 8.1

预览

本地升级(tf卡、u盘)

在这里插入图片描述
在线升级(百度)
在这里插入图片描述
在这里插入图片描述

API

此固件升级应用也对外提供下面 API,供第三方应用调用 安装、验证、删除 升级包。

// IRomUpgradeService.aidl
package com.ayst.romupgrade;

// Declare any non-default types here with import statements

interface IRomUpgradeService {
    public void checkUpdate();
    boolean installPackage(String packagePath);
    boolean verifyPackage(String packagePath);
    void deletePackage(String packagePath);
}

API使用
1.在 APP 源码 aidl/com/ayst/romupgrade 目录下新建 IRomUpgradeService.aidl,如下

// IRomUpgradeService.aidl
package com.ayst.romupgrade;

// Declare any non-default types here with import statements

interface IRomUpgradeService {
    public void checkUpdate();
    boolean installPackage(String packagePath);
    boolean verifyPackage(String packagePath);
    void deletePackage(String packagePath);
}

2.实现下面代码:

Intent intent = new Intent();
intent.setPackage("com.ayst.romupgrade");
intent.setAction("com.ayst.romupgrade.UPGRADE_SERVICE");
mContext.bindService(intent, mRomUpgradeServiceConnection, Context.BIND_AUTO_CREATE);

private ServiceConnection mRomUpgradeServiceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.d(TAG, "IRomUpgradeService, onServiceConnected...");
        mRomUpgradeService = IRomUpgradeService.Stub.asInterface(service);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.d(TAG, "IRomUpgradeService, onServiceDisconnected...");
        mRomUpgradeService = null;
    }
};

/**
 * 检查升级
 * 接口为异步操作,无法直接返回检查结果,当有新版本可升级时直接弹出升级提示窗
 */
public void checkUpdate() {
    if (null != mRomUpgradeService) {
        try {
            mRomUpgradeService.checkUpdate();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

/**
 * 安装升级
 *
 * @param packagePath ota升级包
 * @return
 */
public boolean installPackage(String packagePath) {
    if (null != mRomUpgradeService) {
        try {
            return mRomUpgradeService.installPackage(packagePath);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    return false;
}

/**
 * 验证升级包
 *
 * @param packagePath ota升级包
 * @return
 */
public boolean verifyPackage(String packagePath) {
    if (null != mRomUpgradeService) {
        try {
            return mRomUpgradeService.verifyPackage(packagePath);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    return false;
}

/**
 * 删除升级包
 *
 * @param packagePath ota升级包
 */
public void deletePackage(String packagePath) {
    if (null != mRomUpgradeService) {
        try {
            mRomUpgradeService.deletePackage(packagePath);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

集成
这里讲述如何将此升级应用内置到您定制的系统固件中
前提条件
● 系统签名
● root 权限(应用升级默认采用静默安装,因此需要 root 权限)
内置

  1. 编译 release 版本 apk 文件(或者直接下载已发布的 release 版本)。
  2. 在 Android 源码 vendor/xxx/common/apps/ 路径下新建“RomUpgrade”目录。
  3. 将升级应用 apk 文件复制到“RomUpgrade”目录,并重命名为“RomUpgrade.apk”。
  4. 将升级应用 apk 文件中的 so 库提取出来,复制到“RomUpgrade/lib/arm/”(如果是64系统请提取64库到“RomUpgrade/lib/arm64/”)。
  5. 新建 Android.mk 文件,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := RomUpgrade
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE :=
LOCAL_CERTIFICATE := PRESIGNED
#LOCAL_OVERRIDES_PACKAGES := 
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#LOCAL_REQUIRED_MODULES :=
LOCAL_PREBUILT_JNI_LIBS := \
		lib/arm/libotaso.so \
		lib/arm/libnative-lib.so
include $(BUILD_PREBUILT)

6.修改 vendor/xxx/common/apps/apps.mk,如下:

PRODUCT_PACKAGES += \
    RomUpgrade

配置属性
将下面属性配置到系统 build.prop 中

# 百度ota平台产品线id
ro.baidu.product.id=10000

# 百度ota平台产品线密钥
ro.baidu.product.secret=NTUyOGFhOTVjODRlxxxxxx==

# 可升级的内置应用包名(多个包名通过逗号分隔,无应用升级可不配)
ro.baidu.presetapp=com.ayst.sample1,com.ayst.sample2

# 系统固件版本号
ro.fw.version=1.0.0

使用

本地升级(tf卡、u盘)

本地应用升级

  1. 在 tf 卡或 u 盘根目录新建“exupdate”目录。
  2. 将待安装 apk 文件复制到“exupdate”目录下。
  3. 插入 tf 卡或u盘插入 Android 设备。
  4. 等待5秒左右,会弹出升级提示对话框,请根据提示完成升级。

本地系统升级

  1. 将待升级系统 ota 包复制到 tf 卡或 u 盘目录下,并重命名为“update.zip”。
  2. 插入 tf 卡或 u 盘插入 Android 设备。
  3. 等待5秒左右,会弹出升级提示对话框,请根据提示完成升级。

本地应用与系统同时升级

  1. 在 tf 卡或 u 盘根目录新建“exupdate”目录。
  2. 将待安装 apk 文件复制到“exupdate”目录下。
  3. 将待升级系统 ota 包复制到 tf 卡或 u 盘目录下,并重命名为“update.zip”。
  4. 插入 tf 卡或 u 盘插入Android设备。
  5. 等待5秒左右,会弹出升级提示对话框,请根据提示完成升级。

配置推荐升级或静默升级

  1. 在tf卡或u盘根目录新建“exupdate”目录。
  2. 在“exupdate”目录下新建“config.ini”文件,文件内容如下:
#OTA升级包版本号,如:1.0.0
PACKAGE_VERSION=1.0.0

在线系统升级(百度)

注册百度OTA平台账号
注册 百度安全 OTA 平台 账号,申请开通产品线,将『产品线ID』和『产品线秘钥』通过属性配置到系统
上传升级包
进入对应 『产品线』配置页面,进入『升级资源库』,点击『上传升级包』。
在这里插入图片描述
参数说明:
● 上传文件 选择 OTA 升级包文件(应用升级请上传 apk 文件)。
● 类型 勾选『系统升级』『整包』。
● 版本号 版本号格式:1.0.0.0,不足4段补0(系统固件的版本号默认从『ro.topband.sw.version』属性读取)。
● 标签 忽略。

配置测试任务
添加测试设备分组
进入『设备分组管理->测试设备分组』,点击『添加测试设备分组』,勾选『填写设备ID』。

在这里插入图片描述
参数说明:
● 设备ID CPU 序号。可以通过命令『cat /proc/cpuinfo』查看。
创建测试任务
进入『测试任务列表』,点击『创建测试任务』。
参数说明:
● 任务名称 自定义。
● 升级范围 勾选『指定测试设备分组』,点击『选择设备分组』,选择上一步添加的『测试设备』分组。
● 升级类型 选择『系统升级』『整包升级』。
● 系统升级资源 点击『资源库选择』,选择上一步上传的升级包。
● 升级方式 勾选『提示升级』。如果不希望 Android 弹出升级提示,而是直接安装升级包,可以勾选『静默升级』。
● 升级提示 一般填写此次升级的修改点,当 Android 弹出升级提示时,会显示这些内容。
● 优先级 默认值。

设备端检查升级
确保设备端网络连接正常,重启设备后会立即检查升级(稍后会每30分钟检查一次),当检查到新版本升级时,会弹出下面升级提示框:
在这里插入图片描述
点击『立即升级』开始下载,下载完成后将自动重启安装(安装过程中切勿断电)
在这里插入图片描述
配置正式任务
测试任务验证正常后,按照同样方法配置正式任务即可。

在线应用升级(百度)
应用升级配置步骤同配置系统升级。唯一需要注意的是支持配置应用安装完成后动作,比如:安装后重启系统,安装后重新启动应用。

配置应用安装后动作
升级配置界面,滚动到『其他配置』项,打开『自定义字段』,按下面表格配置『字段名称』和『值』,点击『添加』。
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/659309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库系统概述——第一章 绪论(知识点复习+练习题)

✨博主:命运之光 🦄专栏:离散数学考前复习(知识点题) 🍓专栏:概率论期末速成(一套卷) 🐳专栏:数字电路考前复习 🦚专栏:数…

Qt 每月收支计算

Qt 每月收支计算,针对每月有支出(房贷、车贷、花呗、借呗)的情况,计算收支明细,直观看到未来的个人经济情况,培养良好的消费习惯,进行理性的财富支配,量入为出。 #include "mai…

云安全技术(三)之云计算相关的安全概念

云计算相关的安全概念 Security Concepts Relevant to Cloud Computing 1. 密码学和密钥管理 Cryptography and key management 1、加密技术: 有许多不同类型和等级的加密技术。在云环境中,云安全专家有责任评价应用程序的需求、所使用的技术、需要保护的数据类型&…

【UE 从零开始制作坦克】5-通过旋转摄像机控制炮塔旋转

效果 步骤 打开动画蓝图“ABP_West_Tank_M1A1Abrams” 我们在动画图表中可以发现控制坦克炮塔旋转和炮管旋转的变量分别是“TurretRotation”和“GunRotattion”,因此只需改变这两个旋转体的值即可控制炮塔和炮管的旋转。 切换到事件图表中,首先通过“T…

单向散列函数【密码学】(一)

目录 一、前言:密码学有什么用? 二、单向散列函数 1、单向函数 2、散列函数 3、单向散列函数 三、怎么解决完整性问题 四、如何设置合适的安全强度 一、前言:密码学有什么用? 二、单向散列函数 单向散列函数就是用来解决…

article-6-pss 并联六自由度机构轨迹规划

建模 ** [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-djltxj90-1687070335773)(data:image/svgxml;utf8, )] ** 程序如下: % clc % clear all % function []PSS1(XP,YP,ZP) tic %%%%%鍒濆浣嶇疆鐨勪綅濮?%%%%% % XP 0; %鍔ㄥ钩鍙…

存储笔记6 SAN

SAN(Storage Area Networks) SAN 优势 benefitsSAN 组件 componentsSAN连接选项 connective optionsFC协议 FC寻址 protocol addressing\FC拓扑 topologie SAN优缺点 光纤通道 fibre channel SAN组件 FC三种互联 FC端口类型 fabric 企业需要和科技…

RFID期末复习总结

一.概念部分 1.基础概念 射频识别无线电频率识别RFID 应答器:存放识别信息的电子数据载体 阅读器:将识别信息从应答器中读出(还可以写入数据) 应答器是统称,在各种专业场合有专业名字,比如射频卡&#…

pikachu靶场-PHP反序列化

在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。 序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象: class S{public $test"pikachu";}$snew S(); //创建一个对象serialize($s); //…

FPGA时序约束--进阶篇(主时钟约束)

在FPGA设计中,时序约束的设置对于电路性能和可靠性都至关重要。在上一篇的文章中,已经详细介绍了FPGA时序约束的基础知识。 本文将重点讲解主时钟约束设置,给出详细的约束命令,并介绍了在Vivado中如何写入主时钟约束。 一、主时…

一文详解!接口测试(http与rpc)总结

目录 前言: 一、了解一下HTTP与RPC 二、HTTP接口测试 三、RPC接口测试 四、接口测试用例设计 五、测试思路总结 前言: 在接口测试方面,常见的接口类型有HTTP接口和RPC接口。这两者的测试方法略有不同,在测试前需要进行技术选…

[INFO] [copilotIgnore] inactive,github copilot没反应怎么解决

在使用github copilot的时候,插件不工作,后台出现了这种输出, 这种情况下就是它的激活出现了问题,如果账号的使用权没有问题的话,就将该插件disable之后再重新enable,重新观察输出,就会看到copi…

LAMP架构搭建实操

目录 一、LAMP架构概述 二、LAMP框架搭建 1.准备工作 2.部署apache 3.部署mysql 4.部署php 三、部署BBS论坛 一、LAMP架构概述 LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用…

win11系统提示msvcp140.dll丢失的三个解决方法,简单实用

Win11系统在运行photoshop或其他软件,游戏的时候,电脑提示“找不到msvcp140.dll”,“msvcp140.dll丢失”,“无法定位输入点msvcp140.dll”等问题,都是由于Windows11系统中的msvcp140.dll文件丢失或者损坏了。 问题场景…

数据结构 串

串 术语概念 在数据结构中,串(String)是由零个或多个字符组成的有限序列。它是一种常见的数据类型,常用于表示文本、字符串和符号序列等信息。串可以包含任意字符,包括字母、数字、符号以及空格等。 主串&#xff08…

CANDENCE : 如何绘制元器件

如何绘制元器件 绘制元器件之前先新建一个原理图库。 step1:打开某一个原理图工程 step2:在该工程系下新建一个库文件,如下图: 新建完成,如下图: 右键点击保存:save。 命名并保存,保存的位置自己决定 …

AI - stable-diffusion 艺术化二维码

系列文章: 《AI - stable-diffusion(AI 绘画)的搭建与使用》《AI - AI 绘画的精准控图(ControlNet)》 一、介绍 近日,AI 绘画(stable-diffusion)用来艺术化二维码算是比较火热的事了,这个 idea 是由国人用 Checkpoi…

Spring Security 实战篇

文章目录 前言内存版(memory)数据库库版(jdbc)自定义登录 - 单体(custom-login-single)自定义登录 - 前后分离会话一致性方案方案一方案二方案三为什么不用JWT 登录改json方式登录(custom-login-json)认证密码加密登录&#xff08…

【欧瑞博智能家居】ZigBee Mini网关、超静音智能开合帘电机 添加操作流程

目录 一、添加ZigBee Mini网关 二、添加超静音智能开合帘电机 参考资料 一、添加ZigBee Mini网关 1. 下载《智家365》APP 2. 网关通电,用网线连接路由器的网线接口 3. 再次扫描产品手册里面的二维码添加ZigBee Mini网关,注意手机wifi要在同一个网络…

Nucleo-F411RE (STM32F411)LL库体验 10 - RT-Thread nano finsh的移植

Nucleo-F411RE (STM32F411)LL库体验 10 - RT-Thread nano finsh的移植 1、Makefile中添加finsh的编译 编译报错如下: 在rtconfig.h添加#include “finsh_config.h” 继续编译,继续报错: 这里是个WEAK函数&#xff…