Unity对接SDK-Android Studio 导出aar方
简介
网上很多教程,但都是一些比较旧的,这里整理出一份新的,以供参考。
这篇主要讲的是AS中对平台的SDK进行必要的接口包装,发布成aar放到Unity中,Unity中使用和Android通讯的方式来调用。最后从Unity打包成apk文件。
主要关注点:AndroidManifest.xml,.aar,.jar
环境
Snipaste_2019-07-16_13-44-49.pngUnity2018.4.0,android studio 3.4.2,Gradle4.1
重要事前说前面,一定注意Unity的版本和Gradle版本。版本不匹配会造成运行错误的。整个打包过程是可以进行的,这点最坑。下面是参考图
- 如果AS打aar包的话到Unity最终生成apk的话,以Unity内置的Gradle版本为主。AS中的gradle版本不能高于Unity中的gradle版本
- 如果是Unity导出AS工程到AS中生成apk的话,以AS的版本为主。Unity中的gradle版本不能高于AS中的gradle版本
-
AS查看Gradle版本如下图
image.png -
Unity查看Gradle版本方式,使用Gradle方式导出一个Android工程,在根目录下有个build.gradle文件,和AS中的一样,能看到Gradle版本。
image.png
创建Android工程
image.png创建一个空的android工程,工程名字和包名没有强迫症的话不用纠结,后续发布aar时不出导出这个工程的,只是导出它里面的自定义模块,参考下图
image.png
image.png
Android工程中创建Module
image.png我们之后要做的业务逻辑都在这个Module中,而这个Module才是我们真正需要的,网上也有教程直接把Android工程改成只导出一个Module,这里就不在额外介绍了,为了不被混淆,就容忍一些没用的东西存在吧!Module的包名可以根据自己需求命名,这个包名在之后的Unity工程里会做更改的,参考下图。
image.png
image.png
准备依赖包
- Unity内置的jar包
发布供Unity使用的aar包,必不可少的需要Unity的classes.jar包,存在目录:UnityEditor的安装目录下\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar
更早的Unity版本这里就不介绍了,存在的目录有差异,自行网上查找。- 平台SDK包
对接哪个平台的自动到相应的官网查找,这里示例使用的是快手SDK的融合包 ,一般提供的有两种,一种aar,一种是jar。- 另外Pieces_Jing有篇文章介绍使用反射方式来进行Untiy和Android之间的调用,推荐参考一下!
-
把整理好的包放到Module/libs目录下,依次 右键 -> Add As Library中,参考下图
image.png -
找到build.gradle(Module:模块名字)的文件中的dependencies项,一般在最下面
dependencies {
// 如果libs中的某些jar包不想在发布aar中存在的话,这里要注释掉,比如Unity中的classes.jar不能包含,不然编译apk会报错
//implementation fileTree(include: ['*.jar'], dir: 'libs')
compileOnly files('libs/classes.jar') // compileOnly 的方式是项目中可以使用,但发布jar包中不会包含进去
compileOnly files('libs/kwaisdk-release-1.3.2.aar') // aar的包同样不能包含在发布的aar包中,Unity中不支持这样的引用关系
implementation files('libs/rx-classes.jar') // implementation 的方式是发布aar中包含这个jar包
implementation files('libs/rxjava-2.1.0.jar')
implementation files('libs/reactive-streams-1.0.2.jar')
}
- 之后创建MainActivity就和以前的方式一样了,这里就不在多说,下面重点说一下AndroidManifest文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.windsoul.allinlibrary"><!-- 这个包名要在发布后复制到Assets/Plugins/Andorid/ 目录下 -->
<!-- 网络权限,登录必须 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 网络信息获取权限,kanas打点需要记录网络信息,以及sdk需要判断是wifi还是4g的case -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 文件读取权限,allin 强更必须 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 安装权限,targetSdkVersion>=26时,allin强更安装apk需要 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <!-- 手机设备信息如imei权限获取,kannas需要 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true"
android:usesCleartextTraffic="true">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" /> <!-- 加上这个,Unity中需要 -->
</activity>
</application>
</manifest>
-
选中创建的Module 发布 Build -> Make Module "所创建的的Module名字",等待结束后可以在build/outputs/aar/看到生成的aar文件,参考下图
image.png
image.png -
上图中所示的aar文件就是我们想要的,不过还需要进行加工一下,使用解压文件可以打开它,可以看到熟悉的样子,和Eclipse中对接SDK方式很相似。其实就是一个鬼玩意。
image.png -
把它里面的AndroidManifest.xml文件放到Assets/Plugins/Android目录下,然后从aar包中删掉它。
-
打开AndroidManifest.xml找到package="改成Unity的包名"
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.windsoul.allinlibrary"><!-- 这个包名要在发布后复制到Assets/Plugins/Andorid/ 目录下 -->
-
多说一句,aar包中的libs目录检查一下,unity中的classes.jar包不能存在,如果存在的话,删掉。我们前面已经对它们进行设置过,应该不会出现。以及.aar包也不能出现,上面提到过,有的话拿出来,放到Assets/Plugins/Android目录下。如果严格的按照步骤来的话,应该是不存在的才对。
-
如果Module中有引用的aar包的话,也一并复制到Assets/Plugins/Android目录下。
-
到此为止,就可以进行Unity打包了。这里不在多说,和正常的发布流程一致