Unity3d 接入Android AAR详细流程

这段时间在做给Unity端的Android插件,因为现在的编译已经是走Android最新的gradle ,而不是普通的internal,所以中间遇到的坑也不少,所以从我一一道来,实在是坑啊.我能遇到的问题基本都在这里,现在已经无所畏惧了


Unity编译Android时Gradle的流程:

        一般Unity编译的时候,会去走你unity3d下载好的Gradle插件,17 和 18版本的Gradle版本各不同,而所需要用到的Gradle依赖语法也不相同,所以各位小伙伴 遇到同事用不同版本的unity3d的时候要问清楚.

        1:unity的Gradle插件在哪?


                    这个就是你的unity下面的Gradle插件目录,gradle所用到的一些java的jar包都会在这里

        2:unity编译的时候,gradle会走哪个?

                   unity编译Android项目的时候,他总是去查找这个目录下的3个Gradle文件(其实主要用到就是mainTemplate.gradle),最后就会生成到你自己项目下Temp/gradleOut目录的一个标准的AndroidStudio的gradle项目

                 相信Android的开发童鞋看到这个应该不陌生了,这个就是一个标准的gradle的项目了,当然这只是一个编译时出来的一个项目,你如果修改里面的任何东西,都是没有效果的,因为只是一个临时文件

             3:supportv4 ,v7,等 第三方库找不到? 

                   相信很多小伙伴在写插件的时候,肯定会用到retrofit,rxjava等热门框架,可是去到unity端发现,咦,为啥的aar包丢进去之后,居然没反应? 那么这个时候就是要涉及到自定义gradle的问题了,刚刚都说了,unity3d编译android项目的时候,会走去安装目录下mainTmplate.gradle,这个时候这个gradle是并没有任何依赖的,可能连最基本的supportv7包都没有,那么这个时候就要通过自己去配置你的gradle依赖了.

                    unity3d的官方解释如下图,已经解释的很清楚,如果你想自定义你的gradle,那么提供一个settingsTemplate.gradle到你的Plugins目录下面

                    这是我项目下的gradle文件,目录结构,以及插件的目录,当unity编译Android的时候,uinty先会去找你项目Plugins/Android/mainTemplate.gradle, 如果有,它则会follow你的gradle文件,然后放弃它安装目录下的mainTmplate.gradle,则会走你的gradle,那么这个时候,大家熟悉Android的童鞋,就可以在里面配置你的库了.

           

           需要注意:

                  1:大家一定要注意,使用gradle的时候,你们要问清楚你的同事用的是18版本的unity3d,还是17版本的unity3d,因为这个很重要,新版本的gradle语法已经变成了implementation,和api , 而且你的classpath 也要对应着unity的版本,17版本的unity是2.3, 18版本的3.0 所以这个配置必须要记得.

                   2:当你把aar包丢进去你的plugin目录里面的时候,你的mainTeamplate.gradle,里面的compile 必须把所有的aar都要声明,还有就是AAR包里面用到的第三方库,你也要手工去声明在你的mainTeamplate.gradle里面,不然也会找不到,记得!!记得!!记得!!,重要事情说三遍,不然你总会抱怨你的unity3d调用Android的Class的时候,总是找不到什么AppCompatActivity,之类的东西,因为他v7是后面声明进去的包,android的jar默认只有android.app.Activity这个class,却没有你的AppcompatActivity. 还有 你用到的一些support的版本号最好统一,不然会以免发现出奇奇怪怪的锅,不好背.

                    3:Databinding最好不要用!!!!!!!!!, 为什么? 因为我之前涉及到,我在As3.0上写的插件,然后同事用的是17版的unity,然后总是报我一个错就是,classNotFound: DataBindingWrapper , 这个类我在gradle的compile声明了,最后我发现在可能是gradle的版本不同,databinding使用的时候找不到这个wrapper类,所以很尴尬,尽量不要去用这种类似于,ButterKnife,一些编译生成类的方式.容易出奇奇怪怪的问题,当然如果有童鞋可以弄好了,也可以告诉我一下哈

                    4:Failed Download ??  大家会发现,你在你的AS写的爽爽的AAR包插件,然后丢到你自己电脑上也跑的杠杠,当你的插件aar提交的你的u3d同事里面的后, 发现有 Failed Download 一堆第三方jar , 然后发现怎么build都死活build不了,怎么样都download不了你的retrofit,rxjava? 怎么办? 因为可能你的u3d同事里面的gradle,没有下载过对应想jar,很简单,你需要你的同事下载一个AndroidStudio , 把你compile上面用到的包,丢到你的一个空项目里,让他自己去compile 下载好这些包,然后再从unity那边build,咦 发现可以了. 因为可能是u3d那边的gradle一些proxy配置出的锅. 

                    5:相对路径在u3d的gradle里面用不了,假如你想用../../xxx.keystore去签名,你会发现,它编译的时候会报错,发现它指的路径是temp./../路径找不到你的keystore, 因为它gradle直接编译后生成的AS项目目录是在temp , 所以它只会去找那边的目录,可是呢,你的keystore是不会打包进去你的temp目录里面的, 所以呢,这里如果你想签名,最好就用绝对路径,例如:E:/xxx/xxx/xx/YourPrject/Plugins/Android/xxxx.keystore,这样就OK

                    6:如果你有用到kotlin , 那么你会发现咦,在同事那边的u3d打包的时候,出了一个问题,就是什么xxxkotlin版本不匹配,可是你发现你这边是OK的,你需要去看看你u3d同事里面的kotlin版本在gradle上修改便是.

                

            4:Unity配置Gradle流程:

                        讲了那么多注意的细节,那么我在这里就把配置流程说一下:

                        1:找到你的插件的aar包,该项目必须是在gradle下声明为"applyplugin:'com.android.library'",不然是无法打包出aar的,aar的目录在../YourProject/Build/output/aar/xxxx.aar

                       2:拷贝至Unity项目里的xxxx/Plugins/Android下 就OK,PS: 新的项目unity下面可能没有plugins这个目录,需要自己建一下,在项目Assets下就行

                        3:复制mainTemplate.gradle, 这个gradle在上面也说了在你的unity安装目录.../editor/Editor/Data/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates下,如上图,复制到你的项目Plugins/Android下

                        

                        4:修改Gradle依赖, 找到你这个插件aar用到的第三方compile,例如:supportv7,微信支付,alipay,gson等,一个也不能落,复制到你的mainTemplate.gradle下,还有这个aar叫啥名字,也有手动依赖的gradle上,你添加了多少个aar,就依赖多少个(重复的compile可以不用再次声明,例如:A aar用了支付宝的SDK, B aar也用了支付宝的SDK, 那么你把这个总的gradle文件 只需要依赖一份支付宝的sdk , 不然会报duplicate class xxxxx ) , 如下图 我用到了这几个我自己写的插件aar 

                    

                        

                总结:        

                            以上就是我遇到配置时候的问题, 如果大家也有遇到相同的问题,这样就可以少走弯路了

                           

推荐阅读更多精彩内容