转载出处:https://www.cnblogs.com/quejuwen/p/7364163.html
研究换4.1.2也有段时间了,4.1.2各方面功能均让我挺满意的,用着也蛮顺手的。偶尔上论坛,看到有人说,4.1.2存在媒体扫描耗电的bug,当时我还不以为然,也庆幸自己的这个版本没有问题,直到有一天,这个bug爆发了。。。
那天,下了一个叫百词斩背单词的软件,进入软件后,就点了数据包离线下载,下了一段时间后,全部数据下载完毕,噩梦就开始。手机严重发热,1小时掉电20%都不在话下。开始以为是百词斩应用捣的鬼,卸载后耗电依旧。看电池使用情况,发现是一个叫“媒体”的系统应用耗电严重,远超过屏幕耗电。无奈之下,双清,进入系统后,却发现耗电依旧。这回我没办法了。。。
于是乎,我便开始研究起这个耗电的应用程序了,发现这个表面叫媒体的应用程序,实际上是MediaProvider.apk中的一个叫做MediaScannnerService的服务一致在后台运行。禁用服务了此服务,耗电立即中止。但重启后,发现图片,视频,声音都浏览不了了,甚至连相机也无法拍照了。Google了一下,得知,这个服务,实际上是为安卓准备媒体的,估计应该是后台扫描媒体文件,提供给看图程序,播放程序的。那为什么以前这个服务并不耗电,现在就如此耗电了?感觉问题还是出在百词斩上,于是我认真查看了sd存储卡,这才发现百词斩在我sd卡上下载了大量文件(位置在sdcard0\baicizhan),大小倒是不怎么大,也就几百兆,不过文件数量太多了,能有上万个。于是,问题找到了,就是媒体扫描sd卡的时候,由于文件过多,导致扫描阻塞,占用资源,导致发热。
原因找到了,问题也随之而来。这个服务既然不能停,那sd卡上又免不了拷贝很多文件。能不能在扫描时排除用户不想扫描的文件或文件夹呢?问了度娘,拜了谷哥,虽找到些线索,但多半也是语焉不详,最终也无法解决。于是,自己就开始摸索,经过无数次的修改和重启,终于发现了两个办法可以彻底解决此问题:
第一个就是网友们所说的.nomedia方法。即:在不想让系统扫描的文件夹下,创建一个叫.nomedia文件。关于这个文件,网上有两种说法,一种就是创建.nomedia空文件,另一种说法是创建.nomedia文件夹。个人认为,创建.nomedia空文件就可以了,因为,系统就是用这样的方式来规避查找数据文件的。我们不妨来看一下,打开这个目录\sdcard0\Android\Data,发现里面争好有一个.nomedia空文件。由于这个文件是.开头的,安卓会视为隐藏文件,需要使用re管理器才能看到。我们可以直接拷贝这个文件,也可以自己创建一个空文件,改成这个名字。那么也有网友反应,说即使在文件夹下创建了这个文件,系统依然会扫描这个文件夹,那么接下来就事要做重要的两步了。
由于之前系统已经对文件夹执行过扫描,这个文件夹已经存在了数据库,因此,即使有这个.nomedia文件,系统依然会进行扫描。解决的办法是:到应用程序管理器中,找到媒体存储的应用,点击清空缓存,这样,所有扫描过的数据文件都被清除了,这回重启就不会扫描了。
下面说第二个方法:这个方法只适用于4.1以上的机型并且是已经root,通过修改/system/csc/feature.xml文件来实现。
修改:<CscFeature_MediaScanner_SkipFolder4>/storage/sdcard0/autonavidata50/,/storage/sdcard0/DioDict3B/</CscFeature_MediaScanner_SkipFolder4>
这个元素,我们可以看到,安卓系统也正是通过这个配置,来禁止扫描导航数据和词典数据来提升系统性能的。那么,我们也来模仿,比如说,我们不想让系统扫描sdcard0上的baicizhan目录,那么就添加或改写一项。
<CscFeature_MediaScanner_SkipFolder4>/storage/sdcard0/baicizhan/,/storage/sdcard0/DioDict3B/</CscFeature_MediaScanner_SkipFolder4>
因为我没用三星自带的导航,所以,这里我是改写的。注意,目录一定要写对。同样,修改完之后,需要到应用程序管理器中,清空媒体存储的缓存,重启。
这回开机再看看开机后,媒体扫描的时间是多少?是不是较以前大大改善了,如果不确定媒体是否扫描了这个文件夹,那么可以往这个文件夹里拷贝几张图片,看看我们设置排除的文件夹里的图片是否被加载到了图库。
以上两种方法,本人均已测试成功,要说两种方法有什么区别,个人认为,创建.nomedia的方法较为简单,而且也有专门的管理工具,例如:小熊.nomedia管理工具等,googlplay上搜索nomedia,有很多的。那么这个方法的弊端是,媒体必须扫描到这个文件夹里的.nomedia文件,才会跳出对这个文件夹的扫描。相比之下,第二个方法,便是真正的跳过扫描,只是设置起来比较繁琐。两个方法都需要清空媒体存储的缓存,并重启。