unity調用aar包 適配AndroidX衝突

開發環境

  1. windows10
  2. unity 2018.4.2f1
  3. android studio 3.5

項目介紹
unity 調用android library中的方法,實現在unity中點擊button啓動activity的功能。其中library中引用第三方aar,用到的類庫如:androidx,okhttp,retrofit2,glide etc.

操作步驟

  1. android創建library
    (1)創建library,配置AndroidManifest.xml文件。
    ps:gradle:3.2.1,minSdkVersion 19 compileSdkVersion 28
    在這裏插入圖片描述
    (2)引入unity的 classes.jar文件,放置到libs中
    找到unity安裝目錄中的classes.jar文件,放置到libs中
    (3)編寫MainActivity,注意繼承UnityPlayerActivity
    在這裏插入圖片描述
    (4)點擊Refactor->Migrate to AndroidX,之後gradle.properties會添加如下代碼
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
  1. 創建unity項目
    (1)創建3D項目
    在這裏插入圖片描述
    (2) 切換到2D視圖,添加button,注意在Inspector視圖中的Button別名
    在這裏插入圖片描述
    (3)爲MainCamera添加腳本
    在這裏插入圖片描述
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ISBtnClick : MonoBehaviour
{
    AndroidJavaClass jc;
    AndroidJavaObject jo;

    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("Start ");
        //通過報名獲取java class (固定寫法,不要以爲是自已的Android包名)
        jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

        //獲取當前的activity (固定寫法,不要以爲是自己定義的Activity名稱。。。)
        jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        Button btn1 = GameObject.Find("Button").GetComponent<Button>(); //-----------(1)
        btn1.onClick.AddListener(delegate () {
            startMagicViewApp("getNowTime");
        });

        Button btnJava = GameObject.Find("btnJava").GetComponent<Button>(); //-----------(1)
        btnJava.onClick.AddListener(delegate () {
            startJava();
        });
    }

    // Update is called once per frame
    void Update()
    {

    }

    public void startMagicViewApp(string methodName)
    {
        //調用activity裏面的方法,傳入方法名和參數
        jo.Call(methodName,"Hello Android");
    }

    public void startJava()
    {
        AndroidJavaObject jn = new AndroidJavaObject("com.example.unityaar.Battery");
        //調用java裏面的方法,傳入方法名和參數 jo可轉化爲context
        jn.Call("javaShowToast", jo);
    }
 
}

(4) 創建腳本,添加對AndroidX的支持
unity在編譯android項目時,使用unity中默認gradle配置,我們需要對該文件重寫
在項目的Asset/Plugins/Editor下新建一個C#文件,命名爲SupportAndroidXGradlePropertiesBuildProcessor.cs(可隨意命名)

using System.IO;
using UnityEditor.Android;
using UnityEngine;

public class NewBehaviourScript : IPostGenerateGradleAndroidProject
{
    public int callbackOrder
    {
        // 同種插件的優先級
        get { return 999; }
    }
    public void OnPostGenerateGradleAndroidProject(string path)
    {
        Debug.Log("Bulid path : " + path);
        string gradlePropertiesFile = path + "/gradle.properties";
        if (File.Exists(gradlePropertiesFile))
        {
            File.Delete(gradlePropertiesFile);
        }
        StreamWriter writer = File.CreateText(gradlePropertiesFile);
        writer.WriteLine("org.gradle.jvmargs=-Xmx4096M");
        writer.WriteLine("android.useAndroidX=true");
        writer.WriteLine("android.enableJetifier=true");
        writer.Flush();
        writer.Close();
    }
}

上述腳本對gradle.properties文件進行了修改
在這裏插入圖片描述

org.gradle.jvmargs=-Xmx4096M
android.useAndroidX=true
android.enableJetifier=true

  1. 編譯unity項目
    (1)將編譯出的aar文件後綴名改爲zip,用壓縮軟件打開,並將libs中的classes.jar文件刪除,避免與unity中classes.jar衝突。刪除後將文件後綴名改爲aar

    (2)將aar文件、AndroidManifest.xml及引用到的第三方aar或jar文件放入unity項目中,目錄結構如下
    在這裏插入圖片描述
    (3)點擊File->Build Settings->Player Settings->android->Other Settings ,更改包名
    在這裏插入圖片描述
    (4)接上一步,在Publishing Settings中指定gradle template文件
    在這裏插入圖片描述
    在項目中找到mainTemplate.gradle,將android library build.gradle中的dependencies複製到mainTemplate.gradle 的dependencies中
    在這裏插入圖片描述
    (5)Build項目,安裝apk文件測試一下吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章