有没有办法在Unity中找到,如果不再使用任何插件?

时间:2017-05-15 10:11:04

标签: c# android unity3d

我正在使用Unity(5.4.3)构建的Android游戏,该游戏使用了许多插件。因此,我们现在达到DEX限制,将方法调用的数量限制为小于65536(参见How to shrink code - 65k method limit in dex)。我们超过了限制,导致构建错误。 ("写输出错误:字段引用太多:68467;最大值为65536。")。

我正在尝试查看是否有任何插件未使用,但目前我只是随机删除了.jar和.aar文件,然后点击' build'再次。我很难找到一种科学的方法来确定哪些插件可能无法使用。

我知道我可以使用multidex,但这样的方法涉及使用Android Studio进行项目构建,这似乎是一项艰巨的任务。为了尽快尝试建立游戏,我想尝试删除任何未使用/未引用的插件。

感谢。

2 个答案:

答案 0 :(得分:1)

比随机删除文件更好的方法如下。要使用C#中的插件,您需要编写:

[DllImport ("PluginName")]
private static extern float FooPluginFunction ();

因此,您可以搜索DllImport的所有代码,在那里您可以找到使用的代码。

这不是一个完美的方法,但它似乎比随机拿东西更好;)

更新

同时查找AndroidJavaObject

答案 1 :(得分:1)

您的问题的问题是,很难定义 "哪些插件可能无法使用" ......

仅仅因为脚本中可能引用插件意味着可以使用插件吗?或者是否需要在其他地方引用脚本?

我的意思是:让我们以非MonoBehaviour 类中引用的插件为例,该类本身在另一个 MonoBehaviour <中引用/ em> class。您可能没有使用 MonoBehaviour 类,也没有使用非MonoBehaviour :但是如果删除插件,则必须删除两个类或适应它们(使用脚本定义符号可能)。

可以使用的一个简单例子是:

    List<string> pluginsNotUsed = new List<string>();
    UnityEditor.PluginImporter[] importers = UnityEditor.PluginImporter.GetAllImporters();
    for(int i = 0; i < importers.Length; i++)
    {
        if(!pluginsNotUsed.Contains(importers[i].assetPath))
        {
            pluginsNotUsed.Add(importers[i].assetPath);
        }
    }

    // ---- This part removes the plugins that match the current targeted build platform
    importers = UnityEditor.PluginImporter.GetImporters(UnityEditor.EditorUserBuildSettings.activeBuildTarget);
    for(int i = 0; i < importers.Length; i++)
    {
        if(pluginsNotUsed.Contains(importers[i].assetPath))
        {
            pluginsNotUsed.Remove(importers[i].assetPath);
        }
    }
    // ----

    Object obj = null;
    for(int i = 0; i < pluginsNotUsed.Count; i++)
    {
        // Remove this condition if you want to display all the loaded plugins
        // (including the ones installed withy Unity: C:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/...)
        if(pluginsNotUsed[i].StartsWith("Assets/"))
        {
            obj = UnityEditor.AssetDatabase.LoadAssetAtPath(pluginsNotUsed[i], UnityEditor.AssetDatabase.GetMainAssetTypeAtPath(pluginsNotUsed[i]));
            Debug.Log(pluginsNotUsed[i], obj);
        }
    }

这段脚本会列出所有未设置为支持当前目标构建平台的加载插件(因此不应使用)。
除此之外,您可以进一步检查所有与当前目标构建平台匹配的已加载插件(删除中间部分并使用GetImporters(UnityEditor.EditorUserBuildSettings.activeBuildTarget);),然后使用某种解析来检查当前解决方案以获取引用到找到的插件。

请记住我最后建议的内容很难自动化:甚至不能确定是否有办法检索插件中公开的所有方法,以便在文件中检查它们。此外,如果您想确保可以安全地删除它,则必须检查在您的某个项目场景或预制件中是否使用了您找到此类引用的类。

对不起文字的墙,我也知道我没有回答你的问题,但我希望我给你正确的方向:)

希望这有帮助,