Unity中打包AAR流程(含环境配置)

这篇具有很好参考价值的文章主要介绍了Unity中打包AAR流程(含环境配置)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、【环境配置】

1.【配置JDK】

(1)JDK下载

(2)JDK安装

(3)JDK环境配置

(4)检查安装是否成功

(5)JRE配置

2.【配置Gradle】

(1)确认Gradle版本

(2)Gradle下载

(3)Gradle安装

(4)Gradle环境配置

(5)检查安装是否成功

3.【编写打包AAR脚本】

(1)项目工程切换到安卓平台,以代码形式进行打包操作

(2)结合上面代码内容,配置批处理文件

(3)报错记录

(4)解决方式(确认Gradle版本)

4.Untiy 关于 Android 配置资料

(1)Unity打包安卓工程后,根目录下build.gradle文件,里面的依赖项描述

(2)自己安装的Gradle版本,需要兼容之前在Unity安装时候附带的Gradle版本

(3)查找Unity安装时附带的Gradle版本

*(4)自定义修改配置项


前言

之前很多年一直都是Unity发布到PC、Web端,这次需要发布到Android平台,得嘞,开始不断的探坑,首先就从打包发布AAR包开始

一、【环境配置】

1.【配置JDK】

(1)JDK下载

首先登录官网 - Java Downloads | Oracle,下载JDK

版本要求:

unity导出aar包,unity,游戏引擎

(2)JDK安装

下载之后进行安装,直接一键下一步,我选择的是默认C盘作为安装路径

(3)JDK环境配置

安装完之后配置环境变量(如下图所示)

unity导出aar包,unity,游戏引擎

为之后可能其他的配置考虑,这里新建变量名为 JAVA_HOME

unity导出aar包,unity,游戏引擎

unity导出aar包,unity,游戏引擎

(4)检查安装是否成功

配置后检查jdk是否安装成功,cmd命令行输入 java -version,出现下面的提示信息,则说明JDK安装成功

unity导出aar包,unity,游戏引擎

(5)JRE配置

了解得知安装JDK会包含JRE,但是个人安装完JDK之后,在其路径下并未发现JRE,后面如果需要JRE的环境配置,会继续在本文档中进行更新,JRE下载地址:https://www.java.com/zh-CN/download/,安装以及配置方式类似于JDK

2.【配置Gradle】

(1)确认Gradle版本

需要查看Unity 中【安卓Gradle插件版本】,结合【Gradle】和【Andorid Gradle Plugin】的兼容性,最后确认Gradle的版本最低为6.7.1,

但是使用7.0及以上版本打包AAR时会发生报错,暂未查明原因,所以当前不做配置修改情况下,使用Gradle版本为6.7.1-6.9.3 !

unity导出aar包,unity,游戏引擎

(2)Gradle下载

首先登录官网:https://gradle.org/releases/,下载Gradle

unity导出aar包,unity,游戏引擎

(3)Gradle安装

将下载的压缩包进行解压,建议解压目录只包含英文路径,这里我解压到了D盘

unity导出aar包,unity,游戏引擎

(4)Gradle环境配置

unity导出aar包,unity,游戏引擎

unity导出aar包,unity,游戏引擎

(5)检查安装是否成功

配置后检查jdk是否安装成功,cmd命令行输入 gradle -v,出现下面的提示信息,则说明JDK安装成功

unity导出aar包,unity,游戏引擎

3.【编写打包AAR脚本】

(1)项目工程切换到安卓平台,以代码形式进行打包操作

包含了3种打包模式:1.一键打包AAR,2.打包成安卓工程,3.把已经打包好的安卓工程打包成AAR

(具体代码内容如下,具体的输出路径可以具体情况进行修改)

public class Editor_BuildAndorid
{
    private static string BulidTime { get => DateTime.Now.ToString("yyyyMMdd"); }

    private static Dictionary<string, string> andoridFiles;
    private static List<string> androidNeedUpdateFile = new List<string>() { "build.gradle", "AndroidManifest.xml" };
    private static string path_Output = "/Output/" + BulidTime;

    [MenuItem("工具箱/打包/一键生成AAR")]
    public static void OneKeyExportAAR()
    {
        if (BuildAndroidStudioProject())
            BuildAAR();
    }

    [MenuItem("工具箱/打包/1. 导出Android Studio工程")]
    public static void ExportAndroidStudioProject()
    {
        BuildAndroidStudioProject();
    }

    [MenuItem("工具箱/打包/2. 将Android Studio工程生成AAR")]
    public static void ExportAAR()
    {
        BuildAAR();
    }

    /// <summary>
    /// 导出Android Studio工程
    /// </summary>
    /// <param name="autoOpenBuildFile">是否自动打开文件夹</param>
    /// <returns></returns>
    private static bool BuildAndroidStudioProject(bool autoOpenBuildFile = true)
    {
        bool isBuildSucceed = false;

        if (EditorUserBuildSettings.activeBuildTarget != BuildTarget.Android)
        {
            EditorUtility.DisplayDialog("打AAR包失败", "请切换到Android平台", "确认");
            return false;
        }

        // 设置成Gradle打包
        EditorUserBuildSettings.androidBuildType = AndroidBuildType.Release;
        EditorUserBuildSettings.buildScriptsOnly = false;
        EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle;
        EditorUserBuildSettings.exportAsGoogleAndroidProject = true;

        //AutoBuilder.GetScenePaths();
        List<string> scenes = new List<string>();
        foreach (EditorBuildSettingsScene e in EditorBuildSettings.scenes)
        {
            if (e != null && e.enabled)
                scenes.Add(e.path);
        }
        var publisPath = GetPublishPath(true);

        // BuildOptions必须设置为AcceptExternalModificationsToPlayer,不然的话会打出不带后缀的文件,不是导出AndroidStudio工程
        BuildReport message = BuildPipeline.BuildPlayer(scenes.ToArray(), publisPath, BuildTarget.Android, BuildOptions.None | BuildOptions.AcceptExternalModificationsToPlayer);
        BuildSummary summary = message.summary;
        if (summary.result == BuildResult.Succeeded)
        {
            UnityEngine.Debug.Log("Build succeeded: " + summary.totalSize + " bytes");// todoLX 之后把字节转化为mb,gb等其他单位,便于观看
            isBuildSucceed = true;
            if (autoOpenBuildFile)
                OpenDirectory(publisPath);
        }
        else if (summary.result == BuildResult.Failed)
        {
            UnityEngine.Debug.Log("Build failed");
            isBuildSucceed = false;
        }
        return isBuildSucceed;
    }

    /// <summary>
    /// 生成AAR
    /// </summary>
    private static void BuildAAR()
    {
        string projectPath = GetPublishPath(false) + "/" + "unityLibrary";
        if (!Directory.Exists(projectPath))
        {
            UnityEngine.Debug.LogError("Android Studio Project was not found: " + projectPath);
            return;
        }
        else
        {
            if (SetupAndroidStudioProject(projectPath))
            {
                //int lastIndex = Application.dataPath.LastIndexOf("/");
                //string path1 = Application.dataPath.Substring(0, lastIndex) + "/BulidAAR";
                //UnityEngine.Debug.Log("path=" + path1);// todoLX 会报错,未查原因

                string path = Application.dataPath.Replace("/Assets", "") + "/BuildAAR";
                File.Copy(path + "/BuildAAR.bat", projectPath + "/BuildAAR.bat", true);
                Process proc = Process.Start(projectPath + "/BuildAAR.bat");
                proc.WaitForExit();
            }
        }
    }



    /// <summary>
    /// 设置Android Studio工程一些参数
    /// </summary>
    /// <param name="projectPath"></param>
    private static bool SetupAndroidStudioProject(string projectPath)
    {
        if (null == andoridFiles)
            andoridFiles = new Dictionary<string, string>();
        else
            andoridFiles.Clear();

        FindFiles(andoridFiles, projectPath, androidNeedUpdateFile);
        var count = 0;
        foreach (var temp in andoridFiles)
        {
            //UnityEngine.Debug.Log("key: " + temp.Key + "---value: " + temp.Value);
            if (temp.Key.Equals("build.gradle"))
            {
                if (UpdateBuildGradle(temp.Value))
                {
                    ++count;
                    UnityEngine.Debug.Log("修改了" + temp.Key + "文件");
                }
            }
            if (temp.Key.Equals("AndroidManifest.xml"))
            {
                if (UpdateAndroidManifest(temp.Value))
                {
                    ++count;
                    UnityEngine.Debug.Log("修改了" + temp.Key + "文件");
                }
            }
        }

        if (androidNeedUpdateFile.Count != count)
        {
            UnityEngine.Debug.Log("有文件漏改了");
            return false;
        }

        return true;
    }

    /// <summary>
    /// 修改build.gradle
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    private static bool UpdateBuildGradle(string filePath)
    {
        if (!File.Exists(filePath))
            return false;

        try
        {
            StreamReader reader = new StreamReader(filePath);
            var content = reader.ReadToEnd().Trim();
            reader.Close();

            // todoLX
            if (content.Contains("implementation fileTree(dir: 'libs', include: ['*.jar'])"))
                content = content.Replace("implementation fileTree(dir: 'libs', include: ['*.jar'])", "api fileTree(dir: 'libs', include: ['*.jar'])");

            // 将【Application】改成【Library】(library编译后的产物.aar可以发布到仓库供多个项目使用)
            if (content.Contains("com.android.application"))
                content = content.Replace("com.android.application", "com.android.library");

            //去掉applicationId(只有 Android 应用才能定义 applicationId ,不然编译会报错的)
            if (!content.Contains("//applicationId") && content.Contains("applicationId"))
                content = content.Replace("applicationId", "//applicationId");

            StreamWriter writer = new StreamWriter(new FileStream(filePath, FileMode.Create));
            writer.WriteLine(content);
            writer.Flush();
            writer.Close();
        }
        catch (Exception e)
        {
            UnityEngine.Debug.Log("UpdateAndroidManifest - Failed: " + e.Message);
            return false;
        }

        return true;
    }

    /// <summary>
    /// 修改AndroidManifest.xml
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    private static bool UpdateAndroidManifest(string filePath)
    {
        if (!File.Exists(filePath))
            return false;

        try
        {
            StreamReader reader = new StreamReader(filePath);
            var content = reader.ReadToEnd().Trim();
            reader.Close();

            //去掉 intent-filter 标签
            var firstStr = "<intent-filter>";
            var secondStr = "</intent-filter>";
            var firstIndex = content.IndexOf(firstStr);
            var lastIndex = content.LastIndexOf(secondStr);
            var count = lastIndex - firstIndex + secondStr.Length;
            if (firstIndex > 0 && count > 0)
                content = content.Remove(firstIndex, count);

            StreamWriter writer = new StreamWriter(new FileStream(filePath, FileMode.Create));
            writer.WriteLine(content);
            writer.Flush();
            writer.Close();
        }
        catch (Exception e)
        {
            UnityEngine.Debug.Log("UpdateAndroidManifest - Failed: " + e.Message);
            return false;
        }

        return true;
    }

    private static void FindFiles(Dictionary<string, string> findFiles, string path, List<string> needFindFiles)
    {
        if (!Directory.Exists(path))
            return;

        DirectoryInfo dirInfo = new DirectoryInfo(path);
        var files = dirInfo.GetFileSystemInfos();
        for (int i = 0; i < files.Length; ++i)
        {
            var fileName = files[i].Name;
            if (fileName.Contains("."))//文件
            {
                string fileFullName = files[i].FullName;
                if (needFindFiles.Contains(fileName))
                {
                    if (findFiles.ContainsKey(fileName))
                        findFiles[fileName] = fileFullName;
                    else
                        findFiles.Add(fileName, fileFullName);
                }
            }
            else//文件夹,进入递归
                FindFiles(findFiles, files[i].FullName, needFindFiles);
        }
    }

    /// <summary>
    /// Android Studio工程输出路径
    /// </summary>
    /// <returns></returns>
    private static string GetPublishPath(bool isBulid)
    {
        int lastIndex = Application.dataPath.LastIndexOf("/");
        string publishPath = Application.dataPath.Substring(0, lastIndex) + path_Output;
        if (isBulid)
        {
            if (!Directory.Exists(publishPath))
            {
                Directory.CreateDirectory(publishPath);
            }
        }
        return publishPath;
    }

    #region 打开文件夹
    private static void OpenDirectory(string path)
    {
        // 新开线程防止锁死
        Thread newThread = new Thread(new ParameterizedThreadStart(CmdOpenDirectory));
        newThread.Start(path);
    }

    private static void CmdOpenDirectory(object obj)
    {
        Process p = new Process();
        p.StartInfo.FileName = "cmd.exe";
        p.StartInfo.Arguments = "/c start " + obj.ToString();
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardInput = true;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardError = true;
        p.StartInfo.CreateNoWindow = true;
        p.Start();

        p.WaitForExit();
        p.Close();
    }
    #endregion
}

(2)结合上面代码内容,配置批处理文件

该批处理文件,路径为【项目名称\BuildAAR\BuildAAR.bat】

cd /d %~dp0
 
start gradle clean assembleRelease

正确打包AAR成功之后显示下图

unity导出aar包,unity,游戏引擎

(3)报错记录

(3.1)打包AAR过程中出现报错(可能是由于gradle版本导致)

unity导出aar包,unity,游戏引擎

unity导出aar包,unity,游戏引擎

(4)解决方式(确认Gradle版本)

I.关掉后台【OpenJDK platform binary

unity导出aar包,unity,游戏引擎

II.关掉Unity【Unity Hub】

III.检查【gradle】环境配置,具体检查方法在上面的步骤2中(可搜索“确认Gradle版本”)

IV.重启Unity Hub】【Unity】

4.Untiy 关于 Android 配置资料

(1)Unity打包安卓工程后,根目录下build.gradle文件,里面的依赖项描述

unity导出aar包,unity,游戏引擎

(2)自己安装的Gradle版本,需要兼容之前在Unity安装时候附带的Gradle版本

(3)查找Unity安装时附带的Gradle版本

当前奇瑞项目使用Unity版本为2021.3,所以对应官方给的表格,附带的Gradle版本为6.1.1

unity导出aar包,unity,游戏引擎

*(4)自定义修改配置项

Unity Preference面板中,Android配置,包括JDK、SDK、NDK、Gradle的配置

(因时间关系,未能做修改配置打包测试,后面找时间再看)

相关资料:https://blog.csdn.net/osuckseed/article/details/93089977

unity导出aar包,unity,游戏引擎

欢迎各位补充/评论文章来源地址https://www.toymoban.com/news/detail-735691.html

到了这里,关于Unity中打包AAR流程(含环境配置)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android使用fat-aar打包,本地aar和第三方依赖库以及遇到的问题

    需要把有个模块打包成aar,直接打包的话,模块中引用的jar、aar、第三方依赖库都不会打包进去。直接生成的aar缺少内部引用的以来,所以要用到fat-aar来把模块中用到的依赖也打包进去。 1.首先在项目的gradle加入 2.在repositories加入 3. 在需要打包aar的build.gradle中加入 4.第三方

    2024年02月15日
    浏览(33)
  • android sdk打包aar方案步骤

    第一步:添加以下代码到你工程根目录下的 build.gradle 文件中: For Maven Central (The lastest release is available on Maven Central): 第二步: Add plugin 添加以下代码到你的sdk所在library的 build.gradle 中: 第三步: Embed dependencies embed 你所需要的工程, 用法类似 implementation 代码所示: 第四步: 执行

    2024年02月12日
    浏览(34)
  • [游戏开发][Unity]Assetbundle打包篇(1)打包流程介绍

    打包与资源加载框架目录 先捋一下打AB包的整体思路,首先,Unity4.6版本之后就使用了全新的打包接口 无论是全新打包还是增量打包都是使用这个API,所以一切的一切,都要围绕这个API开始讲起。 该API有四个参数 string outputPath AssetBundleBuild[] builds BuildAssetBundleOptions assetBundle

    2024年02月10日
    浏览(31)
  • 【Android中如何打包Jar、aar文件】

    本文讲解在安卓中如何自己打包Jar、aar文件。 新建Library Library名字自己随意取哈,这里本人取testLibrary。 添加配置 在所有类或API封装完成后就是开始添加配置进行jar或aar打包的配置了。 注意这里,名字是自己可以随意取的。 OK,这里添加配置重新构建结束开始第三步。 在

    2024年02月12日
    浏览(42)
  • 关于安卓打包生成aar,jar实现(一)

    关于安卓打包生成aar,jar方式 背景 在开发的过程中,主项目引入三方功能的方式有很多,主要是以下几个方面: (1)直接引入源代码module(优点:方便修改源码,易于维护,迭代。缺点:对于新手不友好,可能会遇到依赖兼容问题,需要排除并且适配) (2)远程依赖,目

    2024年02月13日
    浏览(32)
  • Unity与原生交互之AndroidStudio篇——Unity导出Android工程,导入AndroidStudio打包APK全流程

          unityLibrary: unity的功能库模块 , android工程用到的重要文件夹 launcher: unity的启动器模块,包含很少的java代码   直接Open unity导出的整个android项目,Launcher模块作为app启动模块  1.AS先New一个空项目:   Empty Activity 不能选择Language,默认为Kotlin语言  Empty Views Activity 可以选择

    2024年02月11日
    浏览(33)
  • Android Studio 打包成 release的aar过程

    一、前言 接上次“ uni-app中调用java代码中的方法全过程 ”中java代码打包的aar为debug模式打包,本次记录下打包成release的aar过程。 二、打包过程记录 执行环境为Windows环境下的android studio android studio打开项目 找到Build-Make Project并执行 找到 Terminal窗口,并执行语句:./gradlew a

    2024年02月12日
    浏览(34)
  • 【Android studio+uniapp】将Android 的插件打包成aar包放在uniapp中使用, Android studio将uniapp本地资源包打包成apk, 以及一些常用的配置

    点击构建--rebuild project 打完包后会在build--output--aar文件夹中显示. 然后将这个.aar文件放到uniapp中的自定义插件中. nativeplugins这个文件夹名不能改,固定的.然后到app原生插件中选择你刚刚的本地插件 到这里你就可以使用自定义的安卓的插件了. 1,将uniapp端的代码打包成本地资源

    2024年02月04日
    浏览(53)
  • [游戏开发][Unity]Assetbundle打包篇(2)打包资源配置篇

    打包与资源加载框架目录 可视化配置的方式有很多种,Json、XML、以及Unity内置的ScriptableObject序列化 配置文件里要有哪些内容呢,很显然,最重要的就是目标文件路径,其次是权重类型,权重类型有:必要打包型、被引用打包型、忽略类型。为何会有忽略类型呢,是因为我们

    2024年02月09日
    浏览(30)
  • Unity的ML-agent训练教程(附环境配置流程)

    1)创建虚拟环境 下载好anaconda后打开anaconda prompt,新建虚拟环境,命名为Unity,通过以下指令: 接下来提过指令 激活虚拟环境Unity 2)在虚拟环境内配置需要用的库 在GitHub上下载unity官方的ml-agent包仓库,下载到位置 在anaconda prompt通过依次输入指令导入库文件 一般会因为网速

    2024年02月20日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包