Unity對(duì)接SDK-Android Studio 導(dǎo)出aar方式

簡(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)最坑。下面是參考圖

Snipaste_2019-07-16_13-44-49.png
  • 如果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)出它里面的自定義模塊,參考下圖

image.png

image.png

image.png

Android工程中創(chuàng)建Module

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

image.png

image.png

image.png

準(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ā)布流程一致

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 目錄: Android:Android 0.*Android 1.*Android 2.*Android 3.*A...
    敲代碼的令狐蔥閱讀 4,510評(píng)論 0 2
  • @font-face{ font-family:"Times New Roman"; } @font-face{ ...
    niki閱讀 572評(píng)論 0 1
  • 0~4個(gè)月寶寶的睡眠特點(diǎn)——《嬰幼兒睡眠圣經(jīng)》讀書(shū)筆記 這是糕媽的公號(hào)推送的第一篇文章。 認(rèn)真看完這篇讀書(shū)筆記,會(huì)...
    會(huì)兒永遠(yuǎn)幸福閱讀 370評(píng)論 0 0
  • 沒(méi)有文化的產(chǎn)品只能賣(mài)裸價(jià) 沒(méi)有文化的公司做不到百年企業(yè) 在一個(gè)企業(yè)中,思想與思想的統(tǒng)一叫同心同德,思想與行為的統(tǒng)一...
    徐朋輝閱讀 272評(píng)論 1 0
  • 最近在看教養(yǎng)的迷思一書(shū),特別困惑,可以想象兒童發(fā)展心理學(xué)派會(huì)做出多么激烈的反擊!看看這三個(gè)命題就知道了: 命題1:...
    寶媽喵喵閱讀 396評(píng)論 0 2

友情鏈接更多精彩內(nèi)容