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