[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;
    }

猜你喜欢

转载自blog.csdn.net/zp288105109a/article/details/81459078