Unity Android Jar 检查冲突

作者: 2b75747cf703 | 来源:发表于2016-06-14 10:11 被阅读492次

Unity一键打包经常会出现Jar冲突的情况,人工去查蛋都会碎掉。。。

首先是Java控制台代码。

package com.sinyee.babybus;
import java.io.*;
import java.util.*;
import java.util.zip.*;

public class JarExporter
{

    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException
    {
        List<String> messages = getConflictMessages(args);
        for (String string : messages)
        {
            System.err.println(string);
        }
    }

    public static List<String> getClassNamesFromJar(String path) throws IOException
    {
        List<String> classNames = new ArrayList<String>();
        ZipInputStream zip = new ZipInputStream(new FileInputStream(path));
        for (ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry())
        {
            if (!entry.isDirectory() && entry.getName().endsWith(".class"))
            {
                String className = entry.getName().replace('/', '.');

                classNames.add(className.substring(0, className.length() - ".class".length()));
            }
        }
        zip.close();

        return classNames;
    }
    
    public static List<String> getConflictMessages(String... jars)
    {
        List<String> messages = new ArrayList<String>();
    
        if(jars == null || jars.length < 2)
            return messages;
        
        HashMap<String, String> hashMap = new HashMap<String, String>();
        
        for (String jar : jars)
        {
            try
            {
                List<String> classNames = getClassNamesFromJar(jar);

                for (String name : classNames)
                {
                    if(hashMap.containsKey(name))
                    {
                        messages.add(name + " " + jar + " " + hashMap.get(name));
                        break;
                    }
                        
                    hashMap.put(name, jar);
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
        
        return messages;
    }
}

导出Jar的时候记得选择Main Class。

Paste_Image.png

最后是C#代码。

        public static void GetConflictMessages(params string[] jars)
        {
            if (jars == null || jars.Length < 2)
                return;

            var jarArguments = "";
            foreach (var jar in jars)
                jarArguments += " \"" + jar + "\"";

            var processStartInfo = new System.Diagnostics.ProcessStartInfo();

            processStartInfo.FileName = "java";
            processStartInfo.Arguments = "-jar \"" + Application.dataPath + "/BabyFrameWork/AndroidBuilder/Tools/JarExporter.jar\"" + jarArguments;
            processStartInfo.RedirectStandardOutput = true;
            processStartInfo.RedirectStandardError = true;
            processStartInfo.UseShellExecute = false;

            var process = System.Diagnostics.Process.Start(processStartInfo);
            process.WaitForExit();

            var standardOutput = process.StandardOutput.ReadToEnd();
            if (standardOutput != "")
                Debug.Log(standardOutput);

            var standardError = process.StandardError.ReadToEnd();
            if (standardError != "")
                Debug.LogError(standardError);
        }

相关文章

网友评论

    本文标题:Unity Android Jar 检查冲突

    本文链接:https://www.haomeiwen.com/subject/sxcudttx.html