其实这并没什么技术难点,也不是完美的热更新方案,只能说是退而求其次的一个方法。

起因主要是因为公司几个U3D项目在立项之初都没有能做好热更新的规化,导致现在要去做U3D的热更新非常难,并且项目已处于中后期,大部分的方案不管是用反射,还是用Lua,或是jsbinding,都需要把项目大部分代码结构推倒重来,这是非常不现实的。于是退而求其次,选择还是直接用最小APK来更新游戏。

也许很多人也是这么做的,但未见人分享,写这篇Blog的目的主要是在网上很难搜到相关的整理,并且大部分游戏制作者仅仅是对开发游戏和用Unity会比较熟悉,对Andriod和iOS并不熟悉,所以有些方法可能想到了,但如果没有人去验证过,总还是不放心的,于是就打算记录下来分享给大家。

方案重点就是:用户在第一次安装游戏的时候可以用完整的APK包来进行安装,在之后如果存在逻辑代码需要更新时,仅需帮用户下载7MB左右的一个最小APK来把游戏覆盖安装即可。(虽然这个7MB左右还是比较大)

我想强调一下,这种方式是100%可行的,只适合于安卓,已验证,并且正在使用,没有更好的方案前会一直用,有好的更新方案后也会在Blog更新,并且也希望大家能分享。

U3D的资源更新的方式有两种,这两种方式能保证游戏的资源更新,具体就不详细说明了:

1. WWW.LoadFromCacheOrDownload,这种方式主要是只支持AssetBundle,所以你需要将所有文件打包成AssetBundle。

2. WWW之后用File来写到磁盘,这种方式就得自己来控制版本了。

用最小APK来更新游戏逻辑的具体步骤:

第一步:拷贝APK安装路径Application.dataPath的asset目录文件到可读写目录Application.persistentDataPath

在第一次初始化游戏的时候,需要通过WWW.LoadFromCacheOrDownload将所有游戏里用到的资源加载一次(或者WWW+File,在打包APK时将所有asset做成一个zip包,第一次启动游戏时解压到Application.persistentDataPath),让他们放进缓存(这个过程视游戏安装包大小而定,当然,你也可以在其它你觉得合适的时候才做这件事件)。

第二步:制作最小安装包

将工程中StreamingAssets这个目录下的文件全部清空,然后再用Unity打包一个APK,这个APK大概有7MB左右。

第三步:更新逻辑

将你制作的最小的APK放到网站服务器上,通过WWW.bytes来下载,然后用FileStream来写到到Application.persistentDataPath。

第四步:调用Andriod的系统API,来执行APK的安装(怎么调用可以去百度搜“Unity Andriod交互”,"Andriod 安装APK 代码")。

这个安装会覆盖掉之前安装的APK,由于这个APK里asset目录是空的,所以覆盖之后也就没有asset了,这也是为什么要做第一步的原因。另外,这个Application.persistentDataPath+filename 在Java端调用的时候,需要在路径最前面添加"file://"。

这里强调一下,重新安装APK后,Application.persistentDataPath和WWW.LoadFromCacheOrDownload缓存的文件,是不会被覆盖的,所以请放心覆盖原来的APK。

虽然说这种方法的确不怎么人性化,每次要用户下载的更新包最小也是7MB+,另外每次还要弹出那个Andriod上安装APK的对话框,但是,谁叫我们在最初用U3D的时候不好好规划下热更新的问题呢。

同时也在此呼吁Unity3D官方能给出热更新方案,至少给出Andriod的逻辑热更方案,明明只需要把*.so的加载路径改为可配置,大家就可以方便地实现逻辑的热更新,但确没有提供这样的方法。我只想说,Unreal4都开源了,Unity3D还拿什么竞争。

本文固定链接:http://www.cnblogs.com/aizquan/p/5055503.html

Unity3d在安卓android的更新(APK覆盖)的更多相关文章

  1. Android Studio实现APK的更新、下载、安装

    先不讲那么多看效果图: 下面来讲解一些更新CODE,原理大家都知道,不废话,直接上代码.里面有一些是我自己做的测试例子,所以大家可以直接删掉就好了 第一个:activity_main.xml < ...

  2. unity调用安卓方法实现安装apk文件(androidx)

    原文链接:点击打开 unity想要实现安装apk文件需要与安卓通讯,所以需要自己来实现安卓代码. 第一步先要新建一个安卓项目提供给unity来使用,我这里使用的工具是android studio4.1 ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  4. fir.im Weekly - iOS / Android 动态化更新方案盘点

    动态化更新是 App 开发必然面对的问题.在 iOS 环境下,Apple 开发者们像是" 带着手铐脚镣跳舞" ,相比之下 Android 开发者会轻松一点,有很多相关的开源框架帮助 ...

  5. 安卓Android面试题大全

    56个问题都是经常用到的,可以深入研究下,也是必须掌握的开发必备知识. 安卓Android面试题汇总 搜集了一些Android面试题目,供将要面试或者正在面试的朋友参考. 1, 谈谈你对Activit ...

  6. 基于unity3d游戏的android版本逆向初探

    https://bbs.pediy.com/thread-212532.htm [文章标题]: 基于unity3d游戏的android版本逆向初探 [文章作者]: dreaman [作者邮箱]: [e ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  8. Android 数据库管理— — —更新数据

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  9. Android 增量更新(BSDiff / bspatch)

    Android 增量更新 BSDiff / bspatchhttp://www.daemonology.net/bsdiff/android的代码目录下 \external\bsdiff bsdiff ...

随机推荐

  1. hdu 3553 Just a String (后缀数组)

    hdu 3553 Just a String (后缀数组) 题意:很简单,问一个字符串的第k大的子串是谁. 解题思路:后缀数组.先预处理一遍,把能算的都算出来.将后缀按sa排序,假如我们知道答案在那个 ...

  2. Spring Boot 入门

    Spring Boot自动配置 http://blog.javachen.com/2015/03/13/how-to-run-spring-boot-application.html http://b ...

  3. kubernetes kubeadm部署高可用集群

    k8s kubeadm部署高可用集群 kubeadm是官方推出的部署工具,旨在降低kubernetes使用门槛与提高集群部署的便捷性. 同时越来越多的官方文档,围绕kubernetes容器化部署为环境 ...

  4. 缓存的概念(反向代理、CDN)

    缓存在我们的日常开发中随处可见,理解缓存的概念,本质就是就近处理,比如很多热点数据,访问量很多,我们需要使用,就可以把它 缓存起来,然后下次访问就不用再去数据库的去查询了,而是直接使用缓存,现在说说大 ...

  5. 安装 Panda3D 并使用原有的Python

    Part 1:什么是Panda3D [原始网站] [中文版本] Part 2:注意事项 Panda3D的版本必须与Python相匹配 Part 3:使用已安装的Python 将‘C:\Panda3D- ...

  6. DFU工作过程中USB机制

    在一级bootloader执行进入USB启动方式之后,设备进行枚举.枚举过程中会通过PC端发送命令对连接的USB设备进行枚举.当枚举成功之后,在PC端可以看到设备的盘符. 当设备能够被PC正确识别之后 ...

  7. Ubuntu上glibc CVE-2015-7547漏洞的POC验证和修复

    Ubuntu上查看Glibc版本 $ldd --version ldd (Ubuntu GLIBC 2.21-0ubuntu4) 2.21 Ubuntu上查看使用Glibc的相关程序 sudo lso ...

  8. Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列

    Python之路,Day9 - 异步IO\数据库\队列\缓存   本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...

  9. 新闻web小酌

    首页如上 类图如下: 添加新闻的方法(dao): public boolean Add(News news) { boolean flag=false; Connection con =getConn ...

  10. struts2学生信息管理系统篇章③

    package com.java1234.util; public class PageUtil { //传进来四个参数,tagetUtil是跳转链接的头部,totalNum是总个数,currentP ...