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
    unity调用aar包 适配AndroidX冲突_第1张图片
    (2)引入unity的 classes.jar文件,放置到libs中
    unity调用aar包 适配AndroidX冲突_第2张图片
    (3)编写MainActivity,注意继承UnityPlayerActivity
    unity调用aar包 适配AndroidX冲突_第3张图片
    (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项目
    unity调用aar包 适配AndroidX冲突_第4张图片
    (2) 切换到2D视图,添加button,注意在Inspector视图中的Button别名
    unity调用aar包 适配AndroidX冲突_第5张图片
    (3)为MainCamera添加脚本
    unity调用aar包 适配AndroidX冲突_第6张图片
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文件进行了修改
unity调用aar包 适配AndroidX冲突_第7张图片

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项目中,目录结构如下
    unity调用aar包 适配AndroidX冲突_第8张图片
    (3)点击File->Build Settings->Player Settings->android->Other Settings ,更改包名
    unity调用aar包 适配AndroidX冲突_第9张图片
    (4)接上一步,在Publishing Settings中指定gradle template文件
    unity调用aar包 适配AndroidX冲突_第10张图片
    在项目中找到mainTemplate.gradle,将android library build.gradle中的dependencies复制到mainTemplate.gradle 的dependencies中
    unity调用aar包 适配AndroidX冲突_第11张图片
    (5)Build项目,安装apk文件测试一下吧

你可能感兴趣的:(Android代码,Unity3D,Android,Studio)