有没有办法在 Unity 中找出是否不再使用任何插件?



我正在开发一款使用Unity(5.4.3)构建的Android游戏,该游戏使用了许多插件。因此,我们现在达到了 DEX 限制,该限制将方法调用的数量限制为小于 65536(请参阅如何收缩代码 - dex 中的 65k 方法限制)。我们超出了限制,导致生成错误。("写入输出时遇到问题:字段引用过多:68467;最大值为 65536。

我正在尝试查看是否未使用任何插件,但目前我只是随机删除.jar和 .aar 文件,然后再次点击"构建"。我很难找到一种科学的方法来弄清楚哪些插件不能使用。

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

谢谢。

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

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

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

这不是一个完美的方法,但它似乎比随机取事要好;)

更新:

另请查找AndroidJavaObject

你的问题在于很难定义"哪些插件不能被使用">......

仅仅因为插件可能在脚本中被引用就意味着可以使用该插件?还是脚本也需要在其他地方引用?

我的意思是:让我们以一个插件在非 MonoBehavior 类中被引用为例,该类本身在另一个MonoBehavior类中被引用。你可能没有使用 MonoBehavior 类,也没有使用非 MonoBehavior类:但是如果你删除插件,你将不得不删除这两个类或调整它们(也许使用脚本定义符号)。

可以使用的东西的一个快速示例是:

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);),然后使用某种解析来检查当前解决方案中对找到的插件的引用。

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

很抱歉文字墙,我也知道我没有真正回答你的问题,但我希望我给了你正确的方向:)

希望这有帮助,

相关内容

最新更新