簡(jiǎn)介
網(wǎng)上很多教程,但都是一些比較舊的,這里整理出一份新的,以供參考。
這篇主要講的是AS中對(duì)平臺(tái)的SDK進(jìn)行必要的接口包裝,發(fā)布成aar放到Unity中,Unity中使用和Android通訊的方式來(lái)調(diào)用。最后從Unity打包成apk文件。
主要關(guān)注點(diǎn):AndroidManifest.xml,.aar,.jar
環(huán)境
Unity2018.4.0,android studio 3.4.2,Gradle4.1
重要事前說(shuō)前面,一定注意Unity的版本和Gradle版本。版本不匹配會(huì)造成運(yùn)行錯(cuò)誤的。整個(gè)打包過(guò)程是可以進(jìn)行的,這點(diǎn)最坑。下面是參考圖

- 如果AS打aar包的話(huà)到Unity最終生成apk的話(huà),以Unity內(nèi)置的Gradle版本為主。AS中的gradle版本不能高于Unity中的gradle版本
- 如果是Unity導(dǎo)出AS工程到AS中生成apk的話(huà),以AS的版本為主。Unity中的gradle版本不能高于AS中的gradle版本
-
AS查看Gradle版本如下圖
image.png -
Unity查看Gradle版本方式,使用Gradle方式導(dǎo)出一個(gè)Android工程,在根目錄下有個(gè)build.gradle文件,和AS中的一樣,能看到Gradle版本。
image.png
創(chuàng)建Android工程
創(chuàng)建一個(gè)空的android工程,工程名字和包名沒(méi)有強(qiáng)迫癥的話(huà)不用糾結(jié),后續(xù)發(fā)布aar時(shí)不出導(dǎo)出這個(gè)工程的,只是導(dǎo)出它里面的自定義模塊,參考下圖



Android工程中創(chuàng)建Module
我們之后要做的業(yè)務(wù)邏輯都在這個(gè)Module中,而這個(gè)Module才是我們真正需要的,網(wǎng)上也有教程直接把Android工程改成只導(dǎo)出一個(gè)Module,這里就不在額外介紹了,為了不被混淆,就容忍一些沒(méi)用的東西存在吧!Module的包名可以根據(jù)自己需求命名,這個(gè)包名在之后的Unity工程里會(huì)做更改的,參考下圖。



準(zhǔn)備依賴(lài)包
- Unity內(nèi)置的jar包
??發(fā)布供Unity使用的aar包,必不可少的需要Unity的classes.jar包,存在目錄:UnityEditor的安裝目錄下\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar
更早的Unity版本這里就不介紹了,存在的目錄有差異,自行網(wǎng)上查找。- 平臺(tái)SDK包
??對(duì)接哪個(gè)平臺(tái)的自動(dòng)到相應(yīng)的官網(wǎng)查找,這里示例使用的是快手SDK的融合包 ,一般提供的有兩種,一種aar,一種是jar。- 另外Pieces_Jing有篇文章介紹使用反射方式來(lái)進(jìn)行Untiy和Android之間的調(diào)用,推薦參考一下!
-
把整理好的包放到Module/libs目錄下,依次 右鍵 -> Add As Library中,參考下圖
image.png 找到build.gradle(Module:模塊名字)的文件中的dependencies項(xiàng),一般在最下面
dependencies {
// 如果libs中的某些jar包不想在發(fā)布aar中存在的話(huà),這里要注釋掉,比如Unity中的classes.jar不能包含,不然編譯apk會(huì)報(bào)錯(cuò)
//implementation fileTree(include: ['*.jar'], dir: 'libs')
compileOnly files('libs/classes.jar') // compileOnly 的方式是項(xiàng)目中可以使用,但發(fā)布jar包中不會(huì)包含進(jìn)去
compileOnly files('libs/kwaisdk-release-1.3.2.aar') // aar的包同樣不能包含在發(fā)布的aar包中,Unity中不支持這樣的引用關(guān)系
implementation files('libs/rx-classes.jar') // implementation 的方式是發(fā)布aar中包含這個(gè)jar包
implementation files('libs/rxjava-2.1.0.jar')
implementation files('libs/reactive-streams-1.0.2.jar')
}
- 之后創(chuàng)建MainActivity就和以前的方式一樣了,這里就不在多說(shuō),下面重點(diǎn)說(shuō)一下AndroidManifest文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.windsoul.allinlibrary"><!-- 這個(gè)包名要在發(fā)布后復(fù)制到Assets/Plugins/Andorid/ 目錄下 -->
<!-- 網(wǎng)絡(luò)權(quán)限,登錄必須 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 網(wǎng)絡(luò)信息獲取權(quán)限,kanas打點(diǎn)需要記錄網(wǎng)絡(luò)信息,以及sdk需要判斷是wifi還是4g的case -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 文件讀取權(quán)限,allin 強(qiáng)更必須 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 安裝權(quán)限,targetSdkVersion>=26時(shí),allin強(qiáng)更安裝apk需要 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <!-- 手機(jī)設(shè)備信息如imei權(quán)限獲取,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" /> <!-- 加上這個(gè),Unity中需要 -->
</activity>
</application>
</manifest>
-
選中創(chuàng)建的Module 發(fā)布 Build -> Make Module "所創(chuàng)建的的Module名字",等待結(jié)束后可以在build/outputs/aar/看到生成的aar文件,參考下圖
image.png
image.png -
上圖中所示的aar文件就是我們想要的,不過(guò)還需要進(jìn)行加工一下,使用解壓文件可以打開(kāi)它,可以看到熟悉的樣子,和Eclipse中對(duì)接SDK方式很相似。其實(shí)就是一個(gè)鬼玩意。
image.png 把它里面的AndroidManifest.xml文件放到Assets/Plugins/Android目錄下,然后從aar包中刪掉它。
打開(kāi)AndroidManifest.xml找到package="改成Unity的包名"
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.windsoul.allinlibrary"><!-- 這個(gè)包名要在發(fā)布后復(fù)制到Assets/Plugins/Andorid/ 目錄下 -->
多說(shuō)一句,aar包中的libs目錄檢查一下,unity中的classes.jar包不能存在,如果存在的話(huà),刪掉。我們前面已經(jīng)對(duì)它們進(jìn)行設(shè)置過(guò),應(yīng)該不會(huì)出現(xiàn)。以及.aar包也不能出現(xiàn),上面提到過(guò),有的話(huà)拿出來(lái),放到Assets/Plugins/Android目錄下。如果嚴(yán)格的按照步驟來(lái)的話(huà),應(yīng)該是不存在的才對(duì)。
如果Module中有引用的aar包的話(huà),也一并復(fù)制到Assets/Plugins/Android目錄下。
到此為止,就可以進(jìn)行Unity打包了。這里不在多說(shuō),和正常的發(fā)布流程一致





