最近做项目有个需求是要Android应用内强更包体。Google一波直接选了一个android原生开源项目

GitHub - yangchong211/YCUpdateApp: 轻量级版本更新弹窗,弹窗上支持更新进度条,可以设置普通更新或者强制更新。解决8.0以上通知栏不显示问题,解决7.0以上安装apk异常,下载完成则会自动提示安装;下载异常,失败,错误等状态,支持重启下载任务;还支持自定义下载路径。代码量少,调用简单……

但是也是需要接入到Unity中,趟了一些小坑记录下实现步骤

步骤1

Unity接入插件,两种方式:

(1)mainTemplateGradle中直接引用,这种方式简单省事

 implementation 'cn.yc:YCUpdateLib:1.1.0'

(2)下载源码后自己打出AAR文件给项目引用。这周种方式可以自定义修改内容,比如更新面板的样式,为了满足策划,我选择的是这种:

步骤2

引用该插件所需的依赖:在mainTemplateGradle中加入

api 'com.liulishuo.filedownloader:library:1.7.5'

这是一个坑,Github使用说明中并没有写这点,一直报错闪退,找了半天看源码才找到需要引用这么个东西

步骤3

写个Java调用更新的页面,我这写了个UpadateActivity,该Activity的唤起调用由MainActivity唤起

UpdateActivity:

package com.match.fruits;import android.Manifest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.ycbjie.ycupdatelib.*;public class UpdateActivity extends AppCompatActivity {//private static final String TAG = AppConst.TAG_PRE + "GameMainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);desc = getIntent().getStringExtra("Desc");url = getIntent().getStringExtra("Url");packageName = getIntent().getStringExtra("PackageName");//translucentActivity(this);UpdateAPK();}private String desc;private String url;private String packageName;private static final String apkName = "Game";// private static final String firstUrl = "https://xpchy-1301864052.cos.ap-beijing.myqcloud.com/fruitmatch/KuaiShou-0906-1.0.4(1).apk";private static final String[] mPermission = {Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE};public void UpdateAPK(){PermissionUtils.init(this);boolean granted = PermissionUtils.isGranted(mPermission);if(!granted){PermissionUtils permission = PermissionUtils.permission(mPermission);permission.callback(new PermissionUtils.SimpleCallback() {@Overridepublic void onGranted() {}@Overridepublic void onDenied() {PermissionUtils.openAppSettings();Toast.makeText(UpdateActivity.this,"请允许更新权限",Toast.LENGTH_SHORT).show();}});permission.request();}//设置自定义下载文件路径//   AppUpdateUtils.APP_UPDATE_DOWN_APK_PATH = "apk" + File.separator + "downApk";UpdateFragment.showFragment(UpdateActivity.this,true, url, apkName, desc,  packageName ,null);}}

MainActivity或其他总控代码中调用唤起强更功能的代码,该函数由Unity中触发:

    public void UpdateAPK(String url, String desc, String packageName){Intent intent = new Intent(GameMainActivity.this, UpdateActivity.class);intent.putExtra("Desc", desc);intent.putExtra("Url", url);intent.putExtra("PackageName", packageName);startActivity(intent);}

步骤4

配置UpadteActivity:

为了该Activity透明能看到游戏背景(Unity主Activity),所以自己写了个Style,在Style.xml中加入:

    <style name="AppFullScreenTheme" parent="Theme.AppCompat.Light.NoActionBar"><item name="android:windowNoTitle">true</item><item name="android:windowActionBar">false</item><item name="android:windowFullscreen">true</item><item name="android:windowContentOverlay">@null</item><item name="android:windowBackground">@android:color/transparent</item><item name="android:colorBackgroundCacheHint">@null</item><item name="android:windowIsTranslucent">true</item></style>

Androidmanifet中加入该Activity并引用Style的透明theme

注意一定要用的是Theme.AppCompt,否则会报错崩溃,参考以下解答:填坑

android - How to fix: "You need to use a Theme.AppCompat theme (or descendant) with this activity" - Stack Overflow

Android how to get AppCompat.Translucent type theme with support actionbar? - Stack Overflow

步骤5

填坑报错:Using WebView from more than one process at once with the same data directory is not supported

在主Application中加入(如果自己没自定义Application,那就放在总控代码里,反正核心是要设置webview)

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {String processName = getProcessName(this);String packageName = this.getPackageName();if (!packageName.equals(processName)) {WebView.setDataDirectorySuffix(processName);}}private String getProcessName(Context context) {if (context == null) return null;ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {if (processInfo.pid == android.os.Process.myPid()) {return processInfo.processName;}}return null;}

问题参考以下解答:

Using WebView from more than one process at once with the same data directory is not supported_幻影浪子-CSDN博客

步骤6

写Unity代码,调用Java层中的UpdateAPK(String url, String desc, String packageName)函数实现更新包,Unity中C#代码:

    public void UpdateAPK(string url, string desc, string packageName){AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");jo.Call("UpdateAPK", url, desc, packageName);}

步骤7

把aar和UpdateActivity等文件放到Unity中的Plugins/Android对应目录下,出包测试,接入成功

总结:坑还是挺多,得挨个趟坑,后续抽时间整理个Demo传到Github上

Unity内实现Android APK版本更新相关推荐

  1. Unity直接导出Android Apk包环境配置

    关注公众号 风色年代(itfantasycc) 领 100G Unity 游戏开发资料 1.首先下载并安装安卓SDK和JDK: (1)安卓SDK下载地址(需要翻墙): https://develope ...

  2. unity安卓打包修改启动画面_Unity自动化打包Android APK

    零. 前言 最近在做Unity开发,有个任务是通过Jenkins实现自动化打包Unity游戏成Android APK的需求,所以在完成任务后,梳理成了一个最简单的教学,也把遇到的坑和大家分享. 若需要 ...

  3. Android Apk签名修改V1,V2,V3,V4

    Unity游戏打出 Android Apk 包,默认签名方式是V1,V2方式的. 但是九游要求只能用V1签名方式.那就对生成的 Andorid Apk包重新签名就OK了. 改签环境 改签 Androi ...

  4. android v3签名格式,Android Apk签名修改V1,V2,V3,V4

    Unity游戏打出 Android Apk 包,默认签名方式是V1,V2方式的. 但是九游要求只能用V1签名方式.那就对生成的 Andorid Apk包重新签名就OK了. 改签环境 改签 Androi ...

  5. Unity教程之-Unity3d中针对Android Apk的签名验证(C#实现)

    当Unity开发的游戏以Android Apk的形式发布之后,经常会遇到的一种情况就是别人对我们的游戏进行二次打包,也就是用他们的签名替换掉我们的签名,从而堂而皇之的将胜利果实占为己有.面对这样的情况 ...

  6. Android内置系统apk问题

    平台:Rockchip android版本: 7.1 个人博客:https://www.letcos.top/ 1.问题描述 ​ 一款产品需要内置定制的launcher,使用了一些第三方的sdk.按系 ...

  7. Unity打包基于Android的apk环境搭建总结

    Unity打包基于Android的apk环境搭建总结 资源准备 操作步骤 总结反馈 资源准备 配置Unity打包Android需要3大部分资源准备: 1.Unity准备 打开Unity,点击左上角Fi ...

  8. android apk 提取,android APK提取内置软件odex转dex

    android APK提取内置软件odex转dex 细心的网友可能发现android的ROM中有很多odex文件,相对于APK中的dex文件而言这个odex有什么作 用呢? android123提示大 ...

  9. 【Android 12 AOSP学习】Android内置第三方apk到系统

    这篇文章将介绍如何在Android系统中内置第三方apk 一.准备工作 编译好的Android源码 Android apk文件:也就是安卓应用安装包 二.步骤 (1)在源码packages/apps目 ...

最新文章

  1. Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片...
  2. windows7关闭计算机对话框,电脑弹出对话框很烦人怎么办?win7禁止对话框弹出的方法...
  3. PyTorch中AdaptiveAvgPool函数总结
  4. freamarker 模板中空格_高端商务公司介绍PPT模板
  5. 4.3Python数据处理篇之Matplotlib系列(三)---plt.plot()折线图
  6. 动态规划——最小路径和(Leetcode 64)
  7. 什么是python装饰器_深入理解 Python 装饰器
  8. Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句梳理
  9. k8s重要概念及部署k8s集群
  10. UE4开发游戏的流程
  11. 工作效率低,怎么办?
  12. 基于单片机的智能视力保护监控系统设计
  13. 将上线的网站的域名代理到本地
  14. 【Git】Conventional Commit 约定式提交规范
  15. 简单酷炫时尚设计开场视频模板剪辑素材
  16. 2.3.2 合并(拼接)字符串
  17. IT外企那点儿事--也说跳槽
  18. 对话线性资本郑灿:新一代AI公司的魅力与使命
  19. 学习—吴恩达《机器学习》—手敲代码_准备工作之基于Ubuntu系统的 Anaconda(python环境)搭建
  20. 信道化接收机matlab,基于FPGA的数字信道化接收机研究与实现

热门文章

  1. python编译器怎么运行不在路径中的py文件_对python当中不在本路径的py文件的引用详解...
  2. c调用c++ qt_【C/C++】qt库结构及示例
  3. java 的“mwq”_java的对象模型 - osc_mwqvsfzo的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. java redis remove_最全的Java操作Redis的工具类
  5. mysql表导出csv空值_从mysql中导出csv格式的数据
  6. linux 删除乱码的文件夹,Linux服务器删除乱码文件和文件夹的方法
  7. python项目打包部署到ios_Python的iOS自动化打包实例代码
  8. 曼哈顿距离最小生成树
  9. (Z) Linux与BSD之间的10个不同之处
  10. 内存分配方式以及堆和栈的区别