大将军 发表于 2020-11-25 09:08

Unity接入某安卓SDK爬坑记

前言

最近接入一个渠道的sdk,发现之前的接入方式行不通,于是探索了其他方式。这次探索对于很久不接触Android的我来说真是痛苦万分,所以暂时接入完毕赶紧写下此文,记录的同时希望能帮到一同在坑中的朋友们。
首先解释下名词和我的环境:
Unity3D5.6.3p4:以下简称Unity,内置Gradle版本为2.1.0。
Android Studio2.3: 以下简称AS。
Gradle2.3.0:以下简称Gradle。
AndroidManifest.xml:以下简称Manifest。
Assets/Plugins/Android/目录:以下简称Android/。
(PS:题图里的话改成“有用户是真的能为所欲为的”比较合适,不过已经P好懒的改了。。。)


方式一:AS打出AAR交由Unity通过默认方式打包

这是我之前使用的方式,module设置为library,包名和应用一致,打出来aar和Manifest拷贝到Unity的Android/下,Unity根据接口调用即可。此方法网上教程很多,不细说了。
这次我像之前一样通过这种方式打包会报库丢失的错误,原因是aar打包是不会把他依赖的aar一起打出的,所以我用了一个叫fat-aar-plugin的插件来处理这个问题。
之所以不自己拷贝依赖的aar,第一是因为有时不能确定最终依赖的版本,第二Gradle会自动帮你处理引用链的问题,所以一句依赖其实可能依赖了很多库,第三是自己找库有点费劲。。。
但是这样打包也有问题,因为如果把插件的aar也打进去会报一些定义冲突的错误,比如app_name,而不打插件的aar的话Unity会报库冲突的错误,因为sdk里不同库依赖的appcompat-v7库版本不同,内置的打包方式好像无法处理这个问题。。。
于是我开始尝试方式二。


方式二:AS打出AAR交由Unity通过Gradle方式打包

先说结论,这种方式我也没走通,下面来说说这个方式有哪些我遇到的坑:
mainTemplate.gradle:这是Unity提供的gradle模版,windows下的路径在Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\GradleTemplates,Unity提供的文档说你可以把同名文件放在Android/下,然后自己做定制,然而我发现项目下的文件我这个版本的Unity并不认,只能修改Unity模版源文件。。。
而且Unity定义了一些关键字,但是文档并没有所有关键字的解释,所以模版写了什么你就只能照抄。。。
so库丢失(Unity内部处理):其实我通过这种方式打出包了,但是发现出包了以后报设备不兼容的错误,我解包一看原来是so库没有,这个问题困扰了我一天,最终通过导出AS工程的方式发现,Unity把我原来放在Android/libs/下的库都移到了AS工程/src/main/jniLibs/下,而打包没有的原因是我在模版里定义了sourceSet.jniLibs。。。。真的是一口老血吐出来,删掉这个定义或者改成Unity修改的路径都能解决这个问题。
通过这个问题我发现导出AS工程的方式首先在调试环节就很有利,因为工程一目了然,不需要像apk一样还要解包才能看到详情。
但是身为一个Unity的程序,我还是希望能直接在Unity出包的,但是我发现自己写的Android端代码无论打包或者导出工程都没有,而且定义或者不定义sourceSet.javas.srcDirs都解决不了这个问题,于是我终于放弃在Unity打包的想法,转向方式三。


方式三:Unity导出AS工程交由AS打包
在Build Settings下勾选Gradle方式打包在勾选Export Project就能导出工程了,首先来看一下导出工程的结构:
libs:unity-classes.jar 我看了下跟之前写Android库时从Unity安装目录拷贝的classes.jar内容差不多,有用。
src/main下:
assets:bin目录是Unity数据真正存放的地方,有用,要注意之后更新要把之前的删掉。test.txt不知道有什么用。
java:里面存放了如下三个文件
但是这些文件在unity-classes.jar都有了,可以不拷贝。
jniLibs:Unity支持对应硬件架构的so库,有用。这里要提一点的是如果修改Unity=》Build Settings=》Development Build这个选项时游戏画面右下角会出现Development Build的水印,而这个水印就跟so库有关。(之前看别的帖子写只需要替换assets和res,结果水印一直去不掉。。。)
res:icon还有我本地化使用的插件导出的文本都在这个文件夹里,有用,建议也是更新前先删除。
Manifest:这里要注意一下,Unity出包的时候会根据一些设置修改这个文件,比方说渲染API的级别等等,但是这些东西在项目开发过程中是可能修改的,所以建议在Unity的Android/下放一份只配置好sdk相关的Manifest文件,这样导出的就是完整的了。(写文章的时候测试了一下比如写了一个错误渲染级别,出包的时候Unity既不会修改为正确值也不会报错,所以这部分要谨慎。)
以上就是我这几天探索的总结,里面还有一些没有探明的问题,希望各位积极指正。最后向所有奋战在sdk接入一线的程序员致以崇高的敬意,也愿国内的sdk水平早日提高,让大家脱离苦海。。。
感谢阅读~!转载请注明出处!
页: [1]
查看完整版本: Unity接入某安卓SDK爬坑记