苍翼之刃为什么移不到手机内存卡自动移除里

【团队分享】苍翼之刃:论File Descriptor泄漏如何导致Crash? | Bugly博客
微信“扫一扫”,分享到朋友圈
这一期的团队分享,我们特邀苍翼之刃的开发负责人Jay,为大家分享在Android项目中遇到的一些Crash。
外文:BlazBlue Revolution Reburning,是由Arc Systerm Works 正式授权,并由 91Act 负责研发的横板动作手游,森利道全程监修,也是苍翼默示录系列唯一的一部横板动作手游。
游戏内部代号为:BBRR,全称是BLAZBLUE Revlution Reburning,续BBCT、BBCS、BBCS2、BBEX、BBCP 之后的又一力作。
在*nix系统中,许多的资源都会被定义为File Descriptor(下面简称FD),例如普通文件、socket、std in/out/error等等。每个*nix系统中,单个进程可以使用的FD数量是有上限的。不同的*nix系统中,这个上限各有区别,例如在Android里面这个上限被限制为1024。
在实际的Android开发过程中,我们遇到了一些奇奇怪怪的Crash,通过sigaction再配合libcorkscrew以及一些第三方的Crash Reporter都捕获不到发生Crash的具体信息,十分头疼。
然后我们通过Bugly上报的Java的CallStack观察发现这些Crash发现了一些共同的信息:
看来是和OpenGL有关系,于是我们进一步对程序输出的log进行观察,又发现:
从这个log里面我们获得了几个信息:
几乎所有出现这种Crash的设备,都是Adreno的GPU
几乎所有Crash都会伴随着requestBuffer failed
我们对我们已有的设备反复试验,确实了只有Adreno的设备(小米3,HTC M8,华为P7等)会在特定条件下出现这种奇奇怪怪的随机Crash。而其他设备例如小米Pad(Tegra),三星S3(Mali)等都不会出现这种问题。
这个问题确实头疼,在网上搜索了很久也没找到有用的信息。直到在某次小米3上再次测试的时候,发现了log里面还有一条必然出现的信息:
E/MemoryHeapBase(18703): error creating ashmem region: Too many open files
这个信息间接的指出了问题,也给了我们一些提示:似乎打开了过多的文件。于是靠着这个灵光,我们尝试着在程序中输出所有已打开的文件:
SHOW FILE HANDLES:
(socket:[285038]): read-write
(/dev/null): read-write
(/dev/null): read-write
(/dev/log/main): cloexec write-only
(/dev/log/radio): cloexec write-only
(/dev/log/events): cloexec write-only
(/dev/log/system): cloexec write-only
(/sys/kernel/debug/tracing/trace_marker): write-only
(/dev/__properties__):
(/dev/binder): cloexec read-write
(/dev/log/main): cloexec write-only
(/dev/log/radio): cloexec write-only
(/dev/log/events): cloexec write-only
(/dev/log/system): cloexec write-only
(/system/framework/framework-res.apk):
(/system/framework/core-libart.jar):
(pipe:[282578]): nonblock
(/dev/alarm):
(/dev/cpuctl/tasks): cloexec write-only
(/dev/cpuctl/bg_non_interactive/tasks): cloexec write-only
(socket:[282569]): read-write
(pipe:[282570]):
(pipe:[282570]): write-only
(pipe:[282578]): nonblock write-only
(anon_inode:[eventpoll]): read-write
(/data/app/---app_name---/base.apk):
(/data/data/---app_name---/databases/bugly_db): cloexec read-write
(socket:[285047]): read-write
(anon_inode:mali-8938): cloexec
(socket:[282605]): nonblock read-write
(socket:[283605]): nonblock read-write
(/dev/null): read-write
(/dev/ump): read-write
(socket:[285045]): nonblock read-write
(/dev/null): read-write
(/dev/mali): read-write
(anon_inode:mali-8938): cloexec
(anon_inode:mali-8938): cloexec
(/data/app/---app_name---/base.apk):
(anon_inode:mali-8938): cloexec
(anon_inode:mali-8938): cloexec
(/dev/null): read-write
(/dev/null): read-write
(/data/app/---app_name---/base.apk):
(/dev/null): read-write
(anon_inode:mali-8938): cloexec
(/data/data/---app_name---/files/DefaultFont.ttf):
(/data/app/---app_name---/base.apk):
(anon_inode:sync_fence):
(/dev/null): read-write
(socket:[285060]): cloexec read-write
(anon_inode:mali-8938): cloexec
(anon_inode:mali-8938): cloexec
(/dev/null): read-write
(anon_inode:sync_fence):
(pipe:[284134]): write-only
(anon_inode:sync_fence):
(anon_inode:sync_fence):
(anon_inode:sync_fence):
通过不停测试程序,发现已打开的文件数量一直有增无减,而当这些被打开的文件数量接近1024的时候,上面的eglSwapBuffers必然出错。于是乎我们得出一个中间结论:
如果程序打开的文件数量过多,会导致OpenGL swap buffer失败!
这从字面上看着似乎有些扯淡,因为这两者总感觉没啥联系。这个问题只会出现在Adreno的GPU上面,于是我们猜想:
Adreno的驱动在swap buffer的时候,需要申请新的FD,这个FD可能是某些硬件IO,具体不得而知;
如果程序中其他的各种FD使用过多接近上限,会导致Adreno的驱动申请不到必要的FD,因此导致swap buffer失败。
这样看起来似乎就比较有道理了。虽然sawp buffer本身是不会Crash的,他并没有raise任何signal,只是简单的返回了一个错误的结果,但这会导致上层逻辑出现异常。这些异常在不同的设备上表现不一样:
有的设备会在Java层的eglSwapBuffers触发Java层的Exception导致Crash;
有的设备不会出现异常,但是会导致OpenGL停止工作(halt rendering),其表现结果就是程序卡住无响应;
有的设备可能什么都不会发生,但是如果你的交互触发了其他逻辑:比如按回退键弹出对话框,对话框也需要FD,但是获得不到,那么弹出对话框的逻辑将抛出异常,
于是这就有了各种奇奇怪怪的Crash。
通过对代码的排查,我们发现在使用SoundPool处理音效的时候,确实存在FD泄露的情况:
private SoundPool m_soundP
public int loadSound(String path) {
int soundID = m_soundPool.load(getAssets().openFd(path), 0);
return soundID;
public unloadSound(int soundID) {
m_soundPool.unload(soundID);
虽然我们在不需要这些音效的时候,对其进行了卸载处理,但不知道是SoundPool类自身的缺陷,还是我们的使用不当,在实际测试中我们发现unload过后,在load中通过openFd打开的FD并没有被释放掉。
强制调用System.gc()在一些设备(例如小米3)上可以释放掉这部分FD,但是另一些设备(例如HTC M8)即使强制gc这无法卸载掉它们,于是便出现了FD泄露的情况。
最终我们自行对这些FD进行管理,并且在unload的时候手动调用这些FD的close方法:
private SoundPool m_soundP
private HashMap&Integer, AssetFileDescriptor& m_soundFdMap
public int loadSound(String path) {
AssetFileDescriptor fd = getAssets().openFd(path);
int soundID = m_soundPool.load(fd, 0);
m_soundFdMap.put(soundID, fd);
return soundID;
public unloadSound(int soundID) {
m_soundPool.unload(soundID);
m_soundFdMap.get(soundID).close();
这之后FD再无泄露的情况发生,之前的各种设备上面的各种奇奇怪怪的Crash都被处理好了。
这个问题粗略说起来就是:因为播放了太多的音效,导致Adreno底层渲染失败,以至于上层逻辑各种失措,产生了很多奇奇怪怪的Crash。
准确的解释应该是:程序中的FD泄露如同内存泄露一样是同样需要得到关注的问题,FD的耗尽如同内存的耗尽一样会导致程序的各种异常情况发生,但是前者不如后者那么知名也不如后者容易被察觉。
小编有话说
不总结哪来经验,不分享经验何用?
在此小编号召大家多总结,互分享,踊跃给我们投稿,把自己踩过并爬出来的坑树个指示牌警醒后人,让猿们的开发生活更加美好!
投稿方式:将文章和个人介绍邮件到 ,字数不限。
本文系腾讯Bugly特邀文章,转载请注明作者和出处“腾讯Bugly()”
关注微信公众号
即时获取最新信息您的当前位置: > 正文
苍翼之刃评测体验最真的爽快打击
来源:作者:张小北
苍翼之刃是一款时下非常流行的2D格斗类游戏,由Arc Systerm Works正式授权,并由91Act负责研发的横板动作手游,森利道全程监修,也是苍翼默示录系列唯一的一部横板动作手游。之前曝光额概念网站非常吸引玩家的眼球,现如今游戏已经正式开测,游戏狗小北也是第一时间就拿到了游戏的安装包,如此让人热血沸腾的格斗狂潮怎么能轻易错过?
游戏画质:★★★☆
游戏操作:★★★
游戏音效:★★★☆
游戏可玩性:★★★★
推荐指数:8.8分
殿堂级格斗勇士震撼登场
作为日系殿堂级格斗游戏《苍翼默示录》的全球首次手游化,《苍翼之刃》延续了原作超一流的游戏品质,将全部的视线与精力投入到精致的画面制作中,初次登陆游戏界面之后便能进入详尽的新手指引,殿堂级格斗正在等待您的召唤。
画面震撼操作洒脱
进入游戏后首先映入眼帘的就是简单的新手教学,在这里玩家们将要进行简单的人机对抗,根据系统的提示进行的操作战斗大体分为四个部分,方向键与技能键配合使用后会有意想不到的特效被触发,在试玩过程中丝毫没有卡顿的现象。另外值得惊喜的是,游戏中右手边的技能操作是区域性的,并没有像其他游戏一样的一个个按键,所以在右手边所有的技能打斗都是靠滑动式来实现,避免了手指按错位而导致不能释放技能的现象。
无CD更畅快
在游戏中试玩了一圈之后发现在寻常游戏中技能冷却的设定,在《苍翼之刃》中是果断没有的!无冷却意味着一场激烈的战斗存在着更多的可能性,所以说只有你技术够硬,时机抓得好,无限连击、残血反杀都不是梦。游戏界面的右方能够显示连击的次数,如果技能没有放空,右边的连接特效会随着连击次数增多而变得更加华丽。
超快击杀迅雷不及掩耳
就像我们刚刚说的那样,游戏右边的技能释放按键都是无显示,整个右边的区域留给玩家来自行操控,绚丽的特效和连招全部自主掌控,左边只能看见两个掌握左右方向的按键,追溯这个问题我们就要去探究《苍翼之刃》创作之初说起,根据我们的了解,游戏的主创团队从项目立定的开始就立志要做一款可以随心所欲的格斗操作系统,在经过多番调研与实验之后,最终产生了《苍翼之刃》所独有的按键加划屏的自由操作模式,兼顾了游戏格斗操作性的深度与广度,打斗酷炫随心,令人欲罢不能!
另外值得一题的是游戏左右方向键加上不同的手势还能创造出意想不到的炫酷招式。
顶级声优刺激体验
众所周知日本游戏最大的特点就是以声效方面见长,这款游戏作为殿堂级的格斗手游又怎么能缺少原汁原味的声优助阵呢。此次苍翼之刃的声优阵容强大到你想不到,曾获得2009年第三届声优奖助演男声优的杉田智和、曾隶属于81 Produce事务所的柿原彻也、中村悠一、斋藤千和、植田佳奈、悠木碧等一系列星光熠熠的名字赫然在内,为最为顶尖的游戏倾情献声。
两大模式自由选择
在《苍翼之刃》游戏中,你可以首先在&剧情模式&下通过一些技能的衔接以及角色的特点来进行战斗的练习,当然这一点在格斗类游戏里面非常的重要,只有练就好了自己的一身本领才能不断的提升自己的熟悉度,当然如果你玩惯了剧情模式,那么活动模式也是值得你进行比拼,进入之后有&资源掠夺&&时空之门&&无尽之塔&以及&联盟争斗&等待你的光临,这里的战斗充满未知、充满惊险,让你一次爽个够。
通过以上的试玩我们也是看到了不论从画面还是操作层面,我们看到了开发商倾尽全力来使游戏变得更有特色,滑动式游戏操作简单便捷,不受屏幕按钮的局限,充满日系的风格也让喜欢的玩家爱不释手,如果你也和小北一样喜欢惊险刺激的格斗类游戏,那就赶紧来试一试吧!
看完这篇文章有何感觉?已经有0人表态红米手机软件为什么移不到内存卡里面_百度知道
红米手机软件为什么移不到内存卡里面
红米手机的软件为什么移不到内存卡里面
嗨!亲,为了系统的稳定与数据安全,MIUI的V5系统不允许将软件安装到SD卡中,强制移动软件,可能使部分软件无法正常使用。将应用安装到手机内存中有很多优点。 1.安装到手机中运行速度更快 2.安装到手机中更省电 3.手机ROM只能用来安装软件,将应用安装到手机中,可以节省您SD卡空间。
已回答987519
响应时间&7小时
其他类似问题
为您推荐:
其他2条回答
红米手机的软件因为是系统自带的,如果是自己安装的软件,选择目录是在sd卡是可以移植的,你可以尝试使用360的手机管家,把软件backup备份导出来!以后可以用手机管家恢复到新手机里面,免去安装的麻烦,目前百度 推出 轻应用 ,免安装使用,和方便的!
安装个手机助手类的软件。就可以把软件移到一内存卡里的。
红米的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁全民突击荣耀6为什么移不到内存卡里_百度知道
全民突击荣耀6为什么移不到内存卡里
我有更好的答案
用安全软件强制移过去
点击移到内存卡选项不行吗
有时手机应用那里移不了。。用安全软件比较好移动
什么安全软件
360。。腾讯管家之类都可以
为什么点击移至内存卡选项不行
有没有内存卡?
我的也是荣耀6
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 手机显示内存卡已移除 的文章

 

随机推荐