[Unity]Gradle打包失败处理

        为什么标题这么诡异,其实主要是同一个问题导致的。最近项目Unity版本从5.6.4升级到了Unity2017.4.7版本,然后使用Gradle打包,发现失败,提示这个错误CommandInvokationFailure: Gradle build failed。如下图:


        刚开始还是以为版本问题导致,换成不用Gradle打包,成功,但这没什么卵用,因为项目这边需要出AAR包(也就是所谓的母包),所以这个问题一定要解决,然后各种查,得到好几个方案:
1.更改jdk版本,改成JDK 1.8.161。
2.更改android的SDK版本,改成SDK 25.2.5。


3.更改gradle版本, 改成Android plugin version 2.3.0和Gradle version 4.0.1。


4.删除StreamingAssets的文件,使得数量不要超过250个。


        折腾了一天,下载JDK,下载AndroidSDK,下载Gradle版本,然后打包测试,发现前3个方案根本没有用,都快要绝望了,然后试最后一个方案,成功解决了。为了测试苹果有没有这个问题,也打了个包测试下,苹果没有问题,估计这是Gradle的bug了。
        但是因为首包资源需要放在StreamingAssets中,所以这个问题还需要解决,解决方案就是打成一个zip包,解压就行,但因为有lua代码,大佬说会有mono内存增加的问题,需要把lua的ab包拷贝到持久化目录中,但因为Unity中是只读的,所以需要在java处理。刚好之前写了个Utility的jar包获取CPU信息,继续在上面加个接口。参考了下这篇大佬的文章https://segmentfault.com/a/1190000004849884。

        Java这边的代码是这样的,只是返回一个是否成功的bool值:

public boolean CopyFile(Object object, String oldPath, String newPath) {
        Log.v("ZP", "1111111");
        AssetManager assetManager = (AssetManager)object;
        String[] filenames = null;
        InputStream input=null;
        FileOutputStream output = null;
        boolean bIsNull = assetManager == null;
        if(bIsNull)
            Log.v("ZP", "Is Null");
        else
            Log.v("ZP", "Is Not Null");
        try {
            filenames = assetManager.list(oldPath);
            Log.v("ZP", "filenames.length: " + filenames.length);
            if(filenames.length <= 0)
            {
                Log.v("ZP", "222222");
                File newFlie = new File(newPath);
                if(!newFlie.exists()){
                    newFlie.createNewFile();
                }
                else
                {
                    return false;
                }
                //将内容写入到文件中
                input=assetManager.open(oldPath);
                output= new FileOutputStream(newFlie);
                byte[] buffer = new byte[1024];
                int len = 0;
                while((len=input.read(buffer))!=-1){
                    output.write(buffer, 0, len);
                }
                output.flush();
                Log.v("ZP", "33333333");
                return true;
            }
        }catch(IOException e)
        {
            e.printStackTrace();
        }finally{
            try {
                if(output != null)
                {
                    output.close();
                    output = null;
                }
                if(input != null)
                {
                    input.close();
                    input=null;
                }
//                if(assetManager != null)
//                {
//                    assetManager.close();
//                    assetManager = null;
//                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return false;
    }


        C#调用的代码是这样的,代码还是蛮清楚的,个人认为。

    /// <summary>
    /// 调用: AndroidUtility.CopyLuaFile("test.unity3d", Application.persistentDataPath + "/test.unity3d");
    /// </summary>
    /// <param name="oldPath"></param>
    /// <param name="newPath"></param>
    /// <returns></returns>
    public static bool CopyLuaFile(string oldPath, string newPath)
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        var activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
        var assetManager = activity.Call<AndroidJavaObject>("getAssets");
        var javaClass = new AndroidJavaClass("com.zp.utility.api");
        var javaObject = javaClass.CallStatic<AndroidJavaObject>("instance");
        return javaObject.Call<bool>("CopyFile", assetManager, oldPath, newPath);
#endif
        return false;
    }

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
Unity是一款跨平台的游戏引擎,支持多种平台的游戏开发。在Android平台上,Unity使用Gradle来构建项目。Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。下面是关于Unity Gradle的介绍和演示: 1. Gradle版本 Unity使用的Gradle版本可以在以下路径中找到:C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\gradle。 2. Gradle构建 Unity使用Gradle来构建Android项目。在Unity中,你可以通过File->Build Settings->Android来打开Android Build Settings窗口。在这个窗口中,你可以选择Gradle作为构建系统。选择Gradle后,你可以在Player Settings中设置Gradle的版本和构建类型。 3. Gradle依赖 在module的gradle文件中,你可以添加依赖。例如,如果你想添加Google Play Services库,你可以在module的gradle文件中添加以下代码: ```gradle dependencies { implementation 'com.google.android.gms:play-services:11.8.0' } ``` 4. AndroidManifest替换变量 在module的gradle文件中,你可以使用AndroidManifest替换变量。例如,如果你想在AndroidManifest中使用应用程序的版本号,你可以在module的gradle文件中添加以下代码: ```gradle android { defaultConfig { manifestPlaceholders = [appVersionCode: versionCode, appVersionName: versionName] } } ``` 然后,在AndroidManifest.xml文件中,你可以使用以下代码来引用这些变量: ```xml android:versionCode="${appVersionCode}" android:versionName="${appVersionName}" ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值