Unity的AndroidManifest中hardwareAccelerate

天天见闻 天天见闻 2023-10-06 综合 阅读: 73
摘要: 让我疼得厉害的并不多,但这个硬件正在加速。一开始我不明白为什么,后来反编译一个一个对比找到问题,增加了播放广告:=false,硬件加速被禁用。另一个SDK在代码内进行了on硬件加速,但是没有这个SDK。一些Unity游戏的一些设置将禁用硬件加速,合并后为false。对该SDK进行反编译,并打开硬件加速。导出工程先打开硬件加速,然后再封装。

问题分析:

​从事Unity SDK开发前后近2年,大大小小问题遇到很多,R文件的,SDK抽取出错的,反编译才能修改的,各种各样奇葩的问题。让我极为蛋疼的却不多,这个硬件加速的算得上一个。

​之前测试反馈,新打包的游戏播放视频广告时会黑屏,声音正常。开始不理解为什么,后面反编译后一个个对比,找到了问题,播放广告的被添加了:=false,硬件加速被禁用。即使主动添加并设置为true打包后也会被覆盖为false。别的SDK却不会,使用该SDK的其他游戏也是正常的。由此得出结论:

1.别的SDK在代码里进行了开启硬件加速,该SDK没有。

2.部分Unity游戏的某些设置禁用了硬件加速,导致合并后为false。

因此方案就有2个:

1.反编译该SDK,开启硬件加速。

2.找出Unity的设置修改为开启。

​显然方案1难度不小,且在后续SDK更新后又需要重复修改,尤其在SDK混淆的情况下,极为麻烦。因此采用方案2,但是经过协同Unity同事多方查找之后仍然没有找到有用的配置,猜测是组合配置,这样想自己摸索出来,可能性几乎为零。那么就还有另外2个退而求其次的方案:

1.导出工程开启硬件加速后再打包。

2.向SDK平台反馈问题,等待修复。

​方案1最大的缺点就在于打包太麻烦,如果是偶尔打包还好,但因为公司的业务问题,每天需大量打包,显然此方案只是临时解决方案。而方案2的缺点就是等待时间不确定,毕竟有求于人嘛。很长时间以来,这个问题都是一个无法言说的痛,直到今天再次遇到这个问题,我再次进入搜索狂魔模式,终于在上找到了解决方案!!!

​但该方案仍有缺陷——只对打包方式有效,老游戏就没救了,只能使用导出工程的方式解决。不过在Unity 2018都发了几个版本的今天,奇葩如我供职的公司,老游戏也不是那么多,因此这个缺陷可以忽略不计了。

解决方案:

1.复制.cs 到你的游戏 //目录下。

2.在 class中添加如下方法:

internal void SetHardwareAccel(){
GetActivityWithLaunchIntent().Attributes.Append(CreateAndroidAttribute("hardwareAccelerated", "true")); 
}  

3.在 ( ) 回调方法中调用.() 方法。

using System.IO;
using System.Text;
using System.Xml;
using UnityEditor.Android;
public class ModifyUnityAndroidAppManifestSample : IPostGenerateGradleAndroidProject
{
    public void OnPostGenerateGradleAndroidProject(string basePath)
    {
        // If needed, add condition checks on whether you need to run the modification routine.
        // For example, specific configuration/app options enabled
        var androidManifest = new AndroidManifest(GetManifestPath(basePath));
        androidManifest.SetHardwareAccel();
        // Add your XML manipulation routines
        androidManifest.Save();
    }
    public int callbackOrder { 
        get { return 1; } 
    }
    private string _manifestFilePath;
    private string GetManifestPath(string basePath)
    {
        if (string.IsNullOrEmpty(_manifestFilePath))
        {
            var pathBuilder = new StringBuilder(basePath);
            pathBuilder.Append(Path.DirectorySeparatorChar).Append("src");
            pathBuilder.Append(Path.DirectorySeparatorChar).Append("main");
            pathBuilder.Append(Path.DirectorySeparatorChar).Append("AndroidManifest.xml");
            _manifestFilePath = pathBuilder.ToString();
        }
        return _manifestFilePath;
    }
}
internal class AndroidXmlDocument : XmlDocument
{
    private string m_Path;
    protected XmlNamespaceManager nsMgr;
    public readonly string AndroidXmlNamespace = "http://schemas.android.com/apk/res/android";
    public AndroidXmlDocument(string path)
    {
        m_Path = path;
        using (var reader = new XmlTextReader(m_Path))
        {
            reader.Read();
            Load(reader);
        }
        nsMgr = new XmlNamespaceManager(NameTable);
        nsMgr.AddNamespace("android", AndroidXmlNamespace);
    }
    public string Save()
    {
        return SaveAs(m_Path);
    }
    public string SaveAs(string path)
    {
        using (var writer = new XmlTextWriter(path, new UTF8Encoding(false)))
        {
            writer.Formatting = Formatting.Indented;
            Save(writer);
        }
        return path;
    }
}
internal class AndroidManifest : AndroidXmlDocument
{
    private readonly XmlElement ApplicationElement;
    public AndroidManifest(string path) : base(path)
    {
        ApplicationElement = SelectSingleNode("/manifest/application") as XmlElement;
    }
    private XmlAttribute CreateAndroidAttribute(string key, string value)
    {
        XmlAttribute attr = CreateAttribute("android", key, AndroidXmlNamespace);
        attr.Value = value;
        return attr;
    }
    internal XmlNode GetActivityWithLaunchIntent()
    {
        return SelectSingleNode("/manifest/application/activity[intent-filter/action/@android:name='android.intent.action.MAIN' and " +
                "intent-filter/category/@android:name='android.intent.category.LAUNCHER']", nsMgr);
    }
    internal void SetApplicationTheme(string appTheme)
    {
        ApplicationElement.Attributes.Append(CreateAndroidAttribute("theme", appTheme));
    }
    internal void SetStartingActivityName(string activityName)
    {
        GetActivityWithLaunchIntent().Attributes.Append(CreateAndroidAttribute("name", activityName));
    }
    internal void SetHardwareAccel(){
        GetActivityWithLaunchIntent().Attributes.Append(CreateAndroidAttribute("hardwareAccelerated", "true"));
}
}

然后再使用打包,一切都完美了。

总结:

​其实这个方案的原理很简单: Unity在使用生成之后,build apk之前会回调( )方法,此时对做任何操作都不会再被覆盖了,不光:,其他任意一切我们都可以修改。

但是这个简单的方案却需要对API相当熟悉,国外这位老哥向我展示了真正的技术,这里我搬运过来分享给其他那些一样被同类问题困扰的猿们,看到就是猿粪!同时也感谢上的pale bone老哥不吝惜分享技术,这里挂上 上的问题链接以示感谢。

其他相关
快递收件的流程是什么?

快递收件的流程是什么?

作者: 天天见闻 时间:2024-01-14 阅读: 33
网站公司的工作人员将根据客户来电、系统订单等提供的快件信息,初步核实是否可收。3、收件人可以在约定的时间上门领取行李,将包装好的物件交给快递员,一般快递不提供打包服务,然后填写快递单,收件人可以将快递单中的一个交给送货人,快递单上有快递号;方便发件人查询。...
Win10玩游戏卡怎么办 玩游戏卡顿解决办法详细教程

Win10玩游戏卡怎么办 玩游戏卡顿解决办法详细教程

作者: 天天见闻 时间:2023-11-23 阅读: 64
但是有些玩家有卡尔顿的现象,今天为您送上解决方案。Win10如何玩游戏卡Win10游戏卡解决方案Win10的游戏模式有两个作用,一是在游戏时阻止更新,防止系统卡;二是分配更多的CPU和GPU资源,保留无关的进程。这是一个小工具的玩家,可以帮助N卡用户优化游戏设置。...
视频会议系统是什么意思 视频会议系统介绍【详解】

视频会议系统是什么意思 视频会议系统介绍【详解】

作者: 天天见闻 时间:2023-11-22 阅读: 67
视频会议系统、视频会议系统是什么意思,语音会议系统可以让所有桌面用户通过PC参与语音会议,它们可以分为基于视频会议的派生视频会议系统分类和区分目前市场上的视频会议系统的软件视频会议系统和硬件视频会议系统。视频会议系统对应用环境的需求基于硬件的视频会议系统综述...
通俗易懂,汽车“扭矩”就是这个意思

通俗易懂,汽车“扭矩”就是这个意思

作者: 天天见闻 时间:2023-10-30 阅读: 79
那么让我们来调查一下汽车的“扭矩”是什么。首先,扭矩和输出一样是汽车发动机的主要指数之一,反映在汽车性能上,包括加速度、爬坡能力、悬架等。排量相同的车,扭矩越大发动机越好,这就意味着驾驶过程中会感觉到车的喜欢,想加速就能加速,这样的“背背感”就越好!...
设计方案怎么写

设计方案怎么写

作者: 天天见闻 时间:2023-10-18 阅读: 64
设计方案是指为解决某一问题或实现某一目标而制定的详细计划和方案。设计方案通常包括问题定义、目标设置、方法选择、实施步骤和时间表等要素。以下是较为全面的设计方案编制模板,供参考:描述实施方案的预期成果,明确达标后带来的后果和效益。通过以上模板,您可以根据具体情况进行适当的调整和扩展,并制定比较全面的设计方案。...
新经济行业年度巅峰榜发布 作业帮荣获最受欢迎智慧教育产品

新经济行业年度巅峰榜发布 作业帮荣获最受欢迎智慧教育产品

作者: 天天见闻 时间:2023-07-23 阅读: 82
本次活动由全球领先的新经济行业第三方数据挖掘与分析机构艾媒咨询集团(IiMediaResearch)主办。共同探讨新经济产业新趋势、新业态、新风口,工作组硬件获得最受欢迎的智慧教育产品“作业助力硬件业务招聘”,围绕青少年学习、生活、健康等不同场景,为青少年提供全新的产品体验;作业组以猫机错题打印机布局智慧硬件市场,成为中小学生喜爱的智能学习产品之一。作业正式宣布进军学习打印机市场...
我来说两句

年度爆文