Android 2.2系统在线升级的移植

之前我们自己做过一个在线T卡升级的应用程序,设计思路是非常简单的,获取本地手机版本号,获取并解析服务器上json格式的最新信息,如果服务器上的版本号大于本地手机的版本号,则可以下载并md5验证升级包,然后调用系统函数升级即可。

从Android 2.2开始,Google服务框架 GoogleServicesFramework.apk 包自带的系统更新处理了android.settings.SYSTEM_UPDATE_SETTINGS这个intent。我们自己做的手机,当然不可能用Google自带的在线升级。为了不修改 GoogleServicesFramework.apk,在Settings的AndroidManifest.xml文件,把 SYSTEM_UPDATE_SETTINGS,修改为别的名字,比如 SYSTEM_UPGRADE_SETTINGS。 还需要同步修改这个文件:

Settings/res/xml/device_info_settings.xml
今天发神经病,花了一大早上的时候反编译GoogleServicesFramework里的update,看看别人如何设计的,就几个文件:
[deli@athena update]$ tree .
.
├── Download.java
├── StateWatcher.java
├── SystemUpdateActivity.java
├── SystemUpdateInstallDialog.java
├── SystemUpdateService.java
└── SystemUpdateVerifierTask.java

搞出600多行代码,才发现跟GoogleServicesFramework这个包里的其他代码非常缠绵,只好作罢。 大概思路也弄明白了,跟我们一样,也是用Downloads.ByUri 这个组件下载文件,
调用系统函数 RecoverySystem.installPackage(context, new File(filename)); 唯一的差别是没有网络连接的情况下,引导用户到设置的界面,比较人性化,很注重用户体验,我们直接跳出个对话框,没有网络连接,以后是要修改的。

默认的,installPackage 这个函数只支持文件放在 /data或/cahce 目录,但是,一般一个系统升级包有70M,一般机器不能保证有那么大的空间,我们只好把文件放在 SD card里,修改installPackage 函数,让它支持 sdcard 目录:

// from froyo, /sdcard ==> /mnt/sdcard
} else if (filename.startsWith("/mnt/sdcard/")) {
    filename = "SDCARD:" + filename.substring(12);

更新: 2011/7/23

一些网友遇到这样的 error:

FileNotFoundException: /cache/recovery/command (Permission denied)

记得在AndroidManifest.xml加上权限

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

进阶:C2DM

使用 c2dm,给用户发push 通知消息,在状态栏提示有新版本可以更新啦。这部分的代码,可以参考大名鼎鼎的 CyanogenMod 的做法 CMUpdateNotify

If you enjoyed this post, make sure you subscribe to my RSS feed!

16 thoughts on “Android 2.2系统在线升级的移植

  1. cpu0oop

    遇到了这个错误,怎么才能获得权限哪?
    FileNotFoundException: /cache/recovery/command (Permission denied)

    Reply
  2. yanli

    hi:
    看了您的文章,感觉挺不错的,您能给一个提示吗?关于android在线的系统升级,谢谢,我的邮箱是jamesyan84@gmail.com,谢谢!

    Reply
    1. deli Post author

      hello,我所知道的都写在这里了,要不加我gmail吧,想知道哪方面的,可以聊聊。我gmail帐号杂About 页面里有。

      Reply
  3. wukongwork

    看了您的文章系统在线升级和移值,我现在也在做这里,但遇到了
    FileNotFoundException: /cache/recovery/command (Permission denied)
    这个问题,

    这两个权限都加上了,下载update.zip是我自己做的,我下载到/data/data/com.smit.settings/update/update.zip中,不知道有什么问题吗?

    Reply
    1. deli Post author

      升级包放在 /cache or /data partitions 都可以的。很明显了,权限问题,仔细检查代码。

      Reply
  4. ted

    你说” 修改installPackage 函数,让它支持 sdcard 目录” 请问改在那个文件的那个位置?

    Reply
  5. deli Post author

    frameworks/base/core/java/android/os/RecoverySystem.java

    public static void installPackage(Context context, File packageFile)

    Reply
  6. Pingback: Android 4.0.4系统在线升级实现过程中的一些问题总结 | architecture(riaos.com)

  7. Pingback: Android 4.0.4系统在线升级实现过程中的一些问题总结 | 移动开发(mobile.riaos.com)

  8. landscape gardening melbourne

    Doing detrimental damage to a tree or shrub while
    pruning might excite panic; but, fear not. Observant people who
    grow plants indoors usually realize how moving an adjusted plant from one room to another or changing its lighting is enough to weaken it.
    This whimsical, inspirational book includes lots of ski bunnies and
    encouragement for life’s ups and downs.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *