android OTA update

可以使用系統的API來實現系統更新。分兩種更新,non-streaming 和 streaming。non-streaming就是把更新包下載好,放到本地,然後執行更新。而streaming是爲了你的設備內存不夠,不能把更新包下載下來,使用的,url要用https:xxxxx而不是本地文件路徑。

你也可以參考源碼中的sample,/bootable/recovery/updater_sample

UpdateEngine這個是系統的API,如果你要在app中使用,只能用反射的方法,如果在源碼中使用,就可以直接用了。

   
    public void applyPayload(String url, long offset, long size, String[] headerKeyValuePairs) {
        try {
            mUpdateEngine.applyPayload(url, offset, size, headerKeyValuePairs);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

方法一 在app中用反射:

Class<?> UpdateEngineClass = Class.forName("android.os.UpdateEngine");//完整类名
                Object UpdateEngine = UpdateEngineClass.newInstance();//获得实例

                Method bind = UpdateEngineClass.getMethod("bind", UpdateEngineCallback.class);
                bind.setAccessible(true);//调用方法前,设置访问标志
                bind.invoke(UpdateEngine, callback);

                Method applyPayload = UpdateEngineClass.getMethod("applyPayload", String.class, long.class, long.class, String[].class);//获得私有方法
                applyPayload.setAccessible(true);//调用方法前,设置访问标志
                applyPayload.invoke(UpdateEngine, "file://" + updateFilePath, offset, size, headerKeyValuePairs);//使用方法

這邊的callback你要自己寫,包名要和源碼中一樣,這樣就能編譯過。

這邊的url就是你OTA的路徑(也可以是https:xxxxxx),這邊還需要三個參數 offset , size , headerKeyValuePairs。可以通過下面的方法從更新包zip中獲取。

這邊的headerKeyValuePairs

* String[] pairs = {
*   "FILE_HASH=lURPCIkIAjtMOyB/EjQcl8zDzqtD6Ta3tJef6G/+z2k=",
*   "FILE_SIZE=871903868",
*   "METADATA_HASH=tBvj43QOB0Jn++JojcpVdbRLz0qdAuL+uTkSy7hokaw=",
*   "METADATA_SIZE=70604"
* };

就是這樣的。filesize 就是size

    private int MaxRow = 15;
    private String[] headerKeyValuePairs = new String[4];
    private String[] updateTemp1 = new String[MaxRow];
    private String[] updateTemp2 = new String[MaxRow];
    private String[] updateTemp3 = new String[MaxRow];
    private String updateTemp4 = "";

    String file="/path/xx.zip";


try {
            i=0;
            j=0;
            InputStream in = new BufferedInputStream(new FileInputStream(file));
            ZipInputStream zin = new ZipInputStream(in);
            ZipEntry ze;
            while ((ze = zin.getNextEntry()) != null) {
                if (ze.isDirectory()) {
                    //Do nothing
                } else {
                    if (ze.getName().contains("payload_properties.txt")) {
                        BufferedReader br = new BufferedReader(
                                new InputStreamReader(zin));
                        String line;
                        while ((line = br.readLine()) != null) {
                            headerKeyValuePairs[i] = line;
                            i++;
                        }
                       
                    }
                    if (ze.getName().contains("metadata")) {
                        BufferedReader br = new BufferedReader(
                                new InputStreamReader(zin));
                        String line;
                        while ((line = br.readLine()) != null) {
                            if (i >= MaxRow) {
                                Log.i("OTA", "MaxRow is too small, Cannot get metadata total information");
                                break;
                            }
                            updateTemp1[j] = line;
                            j++;
                        }
                       
                    }
                }
            }
            zin.closeEntry();
            zin.close();
            readSize();
        } catch (IOException e) {
            e.printStackTrace();
        }







private void readSize() {
        for (int i = 0; i < updateTemp1.length; i++) {
            if (updateTemp1[i].contains("ota-streaming-property-files")) {
                updateTemp4 = updateTemp1[i];
                break;
            }
        }
        updateTemp2 = updateTemp4.split(",");
        for (int i = 0; i < updateTemp2.length; i++) {
            if (updateTemp2[i].contains("ota-streaming-property-files")) {
                updateTemp4 = updateTemp2[i];
            }
        }
        updateTemp3 = updateTemp4.split(":");
        offset = Long.parseLong(updateTemp3[1]);
        size = Long.parseLong(updateTemp3[2]);


    }

方法二:

直接在源碼中使用,比較簡單。參數獲取都一樣,不說了。

至於streaming的方式去更新,使用也一樣,只是url變成了https:xxxxx,然後其它參數就要提前提供,可以用python去獲取,然後再告訴設備,然後設備再去update。

這個下載代碼的Url可以這樣配置Ubuntu 建立 http server_Aaron - Wistron的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android OTA(Over-The-Air)升级是指通过无线网络(如Wi-Fi或移动数据网络)下载和安装设备的新软件版本。OTA更新可以让用户更加方便地获得软件更新,而不必手动下载和安装更新包。 在 Android 中,OTA 更新是通过 OTA 更新包实现的。OTA 更新包是一个 ZIP 文件,其中包含设备的完整系统映像。当设备收到更新通知时,系统会下载OTA 更新包并在后台安装它。因为OTA 更新包是非常大的,因此通常会提供差分包,这些差分包只包含新软件版本与旧软件版本之间的差异。 以下是Android OTA更新源码路径: - OTA更新系统框架代码:frameworks/base/services/core/java/com/android/server/ota/ - OTA更新应用代码:packages/apps/Updates/ 以下是Android OTA差分包生成方法: - 使用repo 工具下载AOSP源代码,repo init 后,repo sync -j4 - 进入AOSP源代码根目录,执行 make otapackage 命令,如果想要加快编译速度,可以使用make -j4 otapackage 命令,其中 4 表示使用4个线程进行编译。 - 编译完成后,在 out/target/product/{device}/ 目录中会生成 OTA 更新包,其中 {device} 表示设备名称。 如果需要生成差分包,可以使用以下命令: ``` ./build/tools/releasetools/ota_from_target_files -k path_to_keys \ --block --backup=true target_files.zip fullota.zip ``` 其中,path_to_keys 是签名密钥的路径,target_files.zip 是完整的系统映像文件,fullota.zip 是已安装的旧版本系统映像文件。执行这个命令后,会生成一个差分包,可以用于OTA升级。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值