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