簡介
網(wǎng)上很多教程,但都是一些比較舊的向楼,這里整理出一份新的,以供參考谐区。
這篇主要講的是AS中對平臺的SDK進(jìn)行必要的接口包裝湖蜕,發(fā)布成aar放到Unity中,Unity中使用和Android通訊的方式來調(diào)用宋列。最后從Unity打包成apk文件昭抒。
主要關(guān)注點(diǎn):AndroidManifest.xml,.aar,.jar
環(huán)境
Unity2018.4.0灭返,android studio 3.4.2盗迟,Gradle4.1
重要事前說前面,一定注意Unity的版本和Gradle版本熙含。版本不匹配會造成運(yùn)行錯誤的罚缕。整個打包過程是可以進(jìn)行的,這點(diǎn)最坑怎静。下面是參考圖
- 如果AS打aar包的話到Unity最終生成apk的話邮弹,以Unity內(nèi)置的Gradle版本為主。AS中的gradle版本不能高于Unity中的gradle版本
- 如果是Unity導(dǎo)出AS工程到AS中生成apk的話蚓聘,以AS的版本為主腌乡。Unity中的gradle版本不能高于AS中的gradle版本
-
AS查看Gradle版本如下圖
image.png -
Unity查看Gradle版本方式,使用Gradle方式導(dǎo)出一個Android工程或粮,在根目錄下有個build.gradle文件导饲,和AS中的一樣捞高,能看到Gradle版本氯材。
image.png
創(chuàng)建Android工程
創(chuàng)建一個空的android工程,工程名字和包名沒有強(qiáng)迫癥的話不用糾結(jié)硝岗,后續(xù)發(fā)布aar時不出導(dǎo)出這個工程的氢哮,只是導(dǎo)出它里面的自定義模塊,參考下圖
Android工程中創(chuàng)建Module
我們之后要做的業(yè)務(wù)邏輯都在這個Module中型檀,而這個Module才是我們真正需要的冗尤,網(wǎng)上也有教程直接把Android工程改成只導(dǎo)出一個Module,這里就不在額外介紹了胀溺,為了不被混淆裂七,就容忍一些沒用的東西存在吧!Module的包名可以根據(jù)自己需求命名仓坞,這個包名在之后的Unity工程里會做更改的背零,參考下圖。
準(zhǔn)備依賴包
- Unity內(nèi)置的jar包
??發(fā)布供Unity使用的aar包无埃,必不可少的需要Unity的classes.jar包徙瓶,存在目錄:UnityEditor的安裝目錄下\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar
更早的Unity版本這里就不介紹了,存在的目錄有差異嫉称,自行網(wǎng)上查找侦镇。- 平臺SDK包
??對接哪個平臺的自動到相應(yīng)的官網(wǎng)查找,這里示例使用的是快手SDK的融合包 织阅,一般提供的有兩種壳繁,一種aar,一種是jar。- 另外Pieces_Jing有篇文章介紹使用反射方式來進(jìn)行Untiy和Android之間的調(diào)用闹炉,推薦參考一下伍派!
-
把整理好的包放到Module/libs目錄下,依次 右鍵 -> Add As Library中剩胁,參考下圖
image.png 找到build.gradle(Module:模塊名字)的文件中的dependencies項诉植,一般在最下面
dependencies {
// 如果libs中的某些jar包不想在發(fā)布aar中存在的話,這里要注釋掉昵观,比如Unity中的classes.jar不能包含晾腔,不然編譯apk會報錯
//implementation fileTree(include: ['*.jar'], dir: 'libs')
compileOnly files('libs/classes.jar') // compileOnly 的方式是項目中可以使用,但發(fā)布jar包中不會包含進(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中包含這個jar包
implementation files('libs/rxjava-2.1.0.jar')
implementation files('libs/reactive-streams-1.0.2.jar')
}
- 之后創(chuàng)建MainActivity就和以前的方式一樣了灼擂,這里就不在多說,下面重點(diǎn)說一下AndroidManifest文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.windsoul.allinlibrary"><!-- 這個包名要在發(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時,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" /> <!-- 加上這個纤控,Unity中需要 -->
</activity>
</application>
</manifest>
-
選中創(chuàng)建的Module 發(fā)布 Build -> Make Module "所創(chuàng)建的的Module名字",等待結(jié)束后可以在build/outputs/aar/看到生成的aar文件碉纺,參考下圖
image.png
image.png -
上圖中所示的aar文件就是我們想要的船万,不過還需要進(jìn)行加工一下,使用解壓文件可以打開它骨田,可以看到熟悉的樣子耿导,和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"><!-- 這個包名要在發(fā)布后復(fù)制到Assets/Plugins/Andorid/ 目錄下 -->
多說一句抵卫,aar包中的libs目錄檢查一下狮荔,unity中的classes.jar包不能存在,如果存在的話介粘,刪掉殖氏。我們前面已經(jīng)對它們進(jìn)行設(shè)置過,應(yīng)該不會出現(xiàn)姻采。以及.aar包也不能出現(xiàn)雅采,上面提到過,有的話拿出來,放到Assets/Plugins/Android目錄下婚瓜。如果嚴(yán)格的按照步驟來的話宝鼓,應(yīng)該是不存在的才對。
如果Module中有引用的aar包的話巴刻,也一并復(fù)制到Assets/Plugins/Android目錄下愚铡。
到此為止,就可以進(jìn)行Unity打包了胡陪。這里不在多說沥寥,和正常的發(fā)布流程一致