前言

升级引擎版本后,Unity导出安卓项目的方法老是出问题,于是开始学着用另一种方法与AAR包交互,网上查了一堆资料,大多都是远古时期的教程,或者没讲明白原理,导致跟着做时报一堆错X_X。

在踩了无数的坑后,终于成功导出能用的aar给Unity使用了,因此记录一下我踩的坑和对应的解决办法


一.基础教程

网上能查到比较新的教程就是这篇《Unity与安卓交互》了(真的非常感谢),其他老旧的教程都没有提到UnityPlayerActivity.java 这个文件分离了出来,只复制classes.jar肯定是找不到UnityPlayerActivity这个类的

大致的思路都可以跟着上面这篇教程做,也可以参考下我之前导出安卓项目的方法,就是新建一个自己的类继承UnityPlayerActivity,然后让Unity启动时调用我们的类,这样就可以跑我们自己的逻辑。


二.走过的坑和一些补充

虽然上面说的那个教程相对来说比较新,但那也是2019.3的版本了,现在最新的版本都是2022.3了,一些细节还是有了变化的,下面就按顺序补充一下:

1.补充:UnityPlayerActivity添加包的问题

在上面的教程中,第三步打开UnityPlayerActivity添加包,这步在Unity2022已经不需要了,UnityPlayerActivity已经有这两个import了

2.补充:arr包处理的问题

很多教程都有说要把导出的aar包,里面的lib/classes.jar替换掉或者删掉,其原因就是我们导入的classes.jar是Unity的库文件,在Unity打包apk时也会包含这个库文件,如果不删掉,打包时就会出现重复定义导致失败。其实在arr的项目中,我们可以把classes.jar的依赖设置为仅用于编译,这样打出来的arr包就不会包含classes.jar了

3.坑:UnityPlayerActivity重复定义的问题

当你把上面UnityPlayerActivity连着文件夹com/unity3d/UnityPlayerActivity这样直接拖到aar项目的aar文件夹时,你就走进了一个坑,这会让Unity在打包apk时出现重复定义的错误,因为Unity在打包时也会引入一个com.unity3d.UnityPlayerActivity,所以我们项目里的UnityPlayerActivity需要改下包名

4.坑:我的自定义类里包含了一些第三方库,Unity使用aar时找不到这些库

当你的aar包引用了一些远程的库,比如这样:

这样虽然在编译和导出aar包没有问题,但是实际上库的文件并没有导进aar里,在你代码里调用这个库的方法时会报找不到这个库然后闪退。解决办法有三种,1是去Marven把库的文件下到本地来,右键添加依赖,2是直接去Unity的PlayerSetting里启用自定义主模块的gradle打包模板,然后在模版里添加这个依赖

,3可以试试这个方法(里面第二种方法可以参考下,我没试过ORZ)

5.补充:修改程序入口的问题

导出aar包后,丢进Unity的Plugin/Android文件夹里,此时打包apk还是没有走我们继承UnityPlayerActivity的类,这时候需要去Player Settings -> Publishing Settings 里把Custom Main Manifest打开

然后在Plugin/Android会生成AndroidMenifest文件,打开把里面的name改成我们自己的包名和类名即可