程序员MM的自白:磨人小妖精之安卓碎片化
文/腾讯优测 章婉霞
除了crash问题,Android平台的碎片化越来越受到移动开发的关注,且不谈支持Android系统的移动设备早已过万款,屏幕、品牌以及传感器等方面的碎片化问题也困扰着开发者。
初级Android的开发人员经常关心的问题就是开发的应用能不能在需求的设备上正常运行。为什么我没有说所有设备呢?长期盘踞各Android设备市场份额或市场关注度榜单前十位,被大家熟知的品牌,它们ROM的个性化都足以让人眼花缭乱了,更何况在如今“乱世”里那些七零八落的机型了。想要做更全面的自动化机型测试,破解兼容问题,腾讯优测是很好的选择。
最近笔者在做Launcher上图标的清理,接到这个需求的时候,内心是感到轻松的,感觉查询需要删除的图标然后删除不就OK了。但事实证明,我还真是很年轻呢。
Launcher个性化
我们都知道,Android源码中有Google做的原生Launcher。在2.1及之前的版本中,使用com.android.launcher;2.2至4.3版本使用的是com.android.launcher2;4.4版本开始则使用com.android.launcher3。
为了探究一下不同机型的Launcher应用,我分别查看了五部手机,结果如下:
|
型号 |
系统版本 |
Launcher包名 |
|
|
1 |
三星I9082 |
4.1.2 |
com.sec.android.app.launcher |
|
2 |
华为G606 |
4.0.3 |
com.huawei.android.launcher |
|
3 |
HTC T328W |
4.0.3 |
com.htc.launcher |
|
4 |
努比亚Z9 Mini |
5.0.2 |
cn.nubia.launcher |
|
5 |
锤子 T1 |
4.4.2 |
com.android.launcher3 |
除了锤子使用了原生的Launcher外,其他四个机型都经过了个性化再开发。在实际操作中也可以发现,对图标上的操作响应也不尽相同。
对于点击Home键后有“应用”图标的Launcher,长按应用并拖动可在桌面上创建快捷方式。而没有“应用”图标的Launcher,长按加拖动则只能实现应用图标的移动。
应用要创建和删除自己的快捷方式图标只需发送如下两个Intent即可:
com.android.launcher.action.INSTALL_SHORTCUT
com.android.launcher.action.UNINSTALL_SHORTCUT
同时需要在AndroidManifest.xml中添加如下两个权限:
android:name="com.android.launcher.permission.INSTALL_SHORTCUT
android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT
而第三方应用要对Launcher上其他应用的快捷方式图标进行删除,最简单粗暴的方式是直接从数据库里删除,当然我们并不推荐,即便发送删除的Intent也需要获知该图标在Launcher保存信息的数据库launcher.db中的一条具有独特性的信息。
接下来我们看看launcher.db数据库是不是像网络上说的那般,favorites表中保存着图标信息。
数据库个性化
从导出launcher.db来看,上述表中的五部手机大部分都在favorites表中保存图标信息,三星I9082则在favorites中只保存主桌面图标,其他应用图标保存在favorites_normal表中。而各机型launcher.db中存放的数据及形式也有所区别,详细情况见如下两图:

权限个性化
一旦要对Launcher数据库有访问,至少需要有对数据库的读权限,而要进行操作,权限要求会更高(写数据库的权限安全等级一般都是signatureOrSystem)。据不完全统计,要适配市场上大部分的设备,如下所列出的一大长串权限是免不了的,而且肯定还有不少漏网之鱼。
android:name="com.android.launcher.permission.READ_SETTINGS"
android:name="com.android.launcher.permission.WRITE_SETTINGS"
android:name="com.android.launcher2.permission.READ_SETTINGS"
android:name="com.android.launcher2.permission.WRITE_SETTINGS"
android:name="com.android.launcher3.permission.READ_SETTINGS"
android:name="com.android.launcher3.permission.WRITE_SETTINGS"
android:name="cn.nubia.launcher.permission.READ_SETTINGS"
android:name="cn.nubia.launcher.permission.WRITE_SETTINGS"
android:name="org.adw.launcher.permission.READ_SETTINGS"
android:name="org.adw.launcher.permission.WRITE_SETTINGS"
android:name="com.htc.launcher.permission.READ_SETTINGS"
android:name="com.htc.launcher.permission.WRITE_SETTINGS"
android:name="com.qihoo360.launcher.permission.READ_SETTINGS"
android:name="com.qihoo360.launcher.permission.WRITE_SETTINGS"
android:name="com.lge.launcher.permission.READ_SETTINGS"
android:name="com.lge.launcher.permission.WRITE_SETTINGS"
android:name="net.qihoo.launcher.permission.READ_SETTINGS"
android:name="net.qihoo.launcher.permission.WRITE_SETTINGS"
android:name="org.adwfreak.launcher.permission.READ_SETTINGS"
android:name="org.adwfreak.launcher.permission.WRITE_SETTINGS"
android:name="org.adw.launcher_donut.permission.READ_SETTINGS"
android:name="org.adw.launcher_donut.permission.WRITE_SETTINGS"
android:name="com.huawei.launcher3.permission.READ_SETTINGS"
android:name="com.huawei.launcher3.permission.WRITE_SETTINGS"
android:name="com.fede.launcher.permission.READ_SETTINGS"
android:name="com.fede.launcher.permission.WRITE_SETTINGS"
android:name="com.sec.android.app.twlauncher.settings.READ_SETTINGS"
android:name="com.sec.android.app.twlauncher.settings.WRITE_SETTINGS"
android:name="com.anddoes.launcher.permission.READ_SETTINGS"
android:name="com.anddoes.launcher.permission.WRITE_SETTINGS"
android:name="com.tencent.qqlauncher.permission.READ_SETTINGS"
android:name="com.tencent.qqlauncher.permission.WRITE_SETTINGS"
android:name="com.huawei.launcher2.permission.READ_SETTINGS"
android:name="com.huawei.launcher2.permission.WRITE_SETTINGS"
android:name="com.android.mylauncher.permission.READ_SETTINGS"
android:name="com.android.mylauncher.permission.WRITE_SETTINGS"
android:name="com.ebproductions.android.launcher.permission.READ_SETTINGS"
android:name="com.ebproductions.android.launcher.permission.WRITE_SETTINGS"
android:name="com.oppo.launcher.permission.READ_SETTINGS"
android:name="com.oppo.launcher.permission.WRITE_SETTINGS"
android:name="com.huawei.android.launcher.permission.READ_SETTINGS"
android:name="com.huawei.android.launcher.permission.WRITE_SETTINGS"
android:name="telecom.mdesk.permission.READ_SETTINGS"
android:name="telecom.mdesk.permission.WRITE_SETTINGS"
仅一个Launcher就这么任性,千千万万的Android开发人员,多少次问自己:
爱卓,我怕了吗?
眼泪,我忘了吗?
产品催,机型差
应用怎么开发???
不管是创业公司还是具备一定规模的企业,为了开发和测试自己的应用,采购覆盖Android市场80%甚至更高的机型,是一件既不现实也不容易更不合理的事。想要为开发者压缩时间成本,为公司节省采购和管理成本,不妨尝试一下腾讯优测,会让你得到意想不到的效果哦,这可是程序员MM发自内心地呐喊~
想了解更多干货,欢迎关注腾讯优测微信号:优测网(wxutest)
腾讯优测:
腾讯优测是备受客户信赖的移动云测试平台,为应用、游戏,H5混合应用的研发团队提供产品质量检测与问题解决服务。不仅在线上平台提供「云手机远程操控与调试」、「自动化全面兼容性测试」、「APK源码级缺陷性分析」等多种质量检测工具,更为VIP客户配备专家团队提供定制化综合测试解决方案。真机实验室配备上千款手机,覆盖市面98%主流机型,7*24小时在线运行,覆盖亿级用户。
程序员MM的自白:磨人小妖精之安卓碎片化的更多相关文章
- 漫谈程序员(十一)老鸟程序员知道而新手不知道的小技巧之Web 前端篇
老鸟程序员知道而新手不知道的小技巧 Web 前端篇 常充电!程序员只有一种死法:土死的. 函数不要超过50行. 不要一次性写太多来不及测的代码,而是要写一段调试一段. UI和编码要同步做. 多写注释方 ...
- 作为一名双非本科毕业的Java程序员,我该如何在日益严重的内卷化中避免被裁?
前言 对一个 Java 程序员而言,并发编程能否熟练掌握是判断他是不是优秀的重要标准之一.因为并发编程在 Java 语言中最为晦涩的知识点,它涉及内存.CPU.操作系统.编程语言等多方面的基础能力,更 ...
- 黑马程序员_Java基础:多功能小窗口,swing,io,net综合应用
------- android培训.java培训.期待与您交流! ---------- 概念原理的理解,不代表能熟练应用. 如果将多个知识点关联并应用起来,这能加快我们对知识的掌握. 作为一个初学者, ...
- 程序员都会的 35 个 jQuery 小技巧
收集的35个 jQuery 小技巧/代码片段,可以帮你快速开发. 1. 禁止右键点击 $(document).ready(function(){ $(document).bind("cont ...
- 每个程序员都会的 35 个 jQuery 小技巧
1. 禁止右键点击 $(document).ready(function(){ $(document).bind("contextmenu",function(e){ return ...
- 每个程序员都会的35个jQuery小技巧!
1. 禁止右键点击$(document).ready(function(){ $(document).bind("contextmenu",function(e){ return ...
- 从程序员的角度分析微信小程序(编程语言:用到什么学什么)
从程序员的角度分析微信小程序(编程语言:用到什么学什么) 一.总结 一句话总结:微信小程序原理就是用JS调用底层native组件,和React Native非常类似.(需要时,用到时再学) 1.选择语 ...
- 从程序员的角度分析微信小程序
昨天朋友圈被微信小程序刷爆了. 我赶快在书架上拿出三年前买的书,把上面的土擦干净,压压惊. 作为一个并不是资深的程序员. 从程序员的角度分析一下微信小程序,欢迎指点. 首先吐槽 微信小程序只发了200 ...
- 【转载、推荐】不要自称是程序员,我十多年的 IT 职场总结
注评:一气读完后,有些和我的观点类似.这篇文章显然是外国老写的,但是不妨碍我们的跨国交流. 如果我可以给每个工程教育增加一门课,它不会涉及编译器.门电路或是时间复杂度,而是一门介绍行业现实的入门课,因 ...
随机推荐
- Union all的用法实例sql
---Union all的用法实例sqlSELECT TOP (100) PERCENT ID, bid_user_id, UserName, amount, createtime, borrowTy ...
- javascript 错误处理
try{ var date=new Date(); date.test();//调用date的未定义的test方法; document.wrire("try块执行结束<br>&q ...
- Android Phonebook编写联系人UI加载及联系人保存流程(三)
2014-01-07 09:54:13 将百度空间里的东西移过来. 本文从点击“添加联系人”Button开始,分析新建联系人页面UI是如何加载,以及新的联系人信息是如何保存的,借此,我们一探Phon ...
- 长理ACM 13-围圈报数(谌海军)
题目标题:围圈报数(谌海军) 题目描述:有n(n<=100)围成一圈,顺序排号(从1排到n).从第一个人开始报数(从1报到m(m<=9)),凡报到m的人退出圈子,问最后留下的是原来第几号的 ...
- MATLAB图像处理函数汇总(一)
1.applylut功能: 在二进制图像中利用lookup表进行边沿操作.语法:A = applylut(BW,lut)举例lut = makelut('sum(x(:)) == 4',2);BW1 ...
- 一张图告诉你为什么 Gmail 是最好的邮箱,以及大量私货
今天早上,我的同事详细介绍了 Gmail 相比其他邮箱的优势,比如强大的垃圾邮件过滤.简单的使用界面.强大的功能设置等等.但是对我来说,这些并不是我使用 Gmail 的最重要原因. 我第一个正式的邮箱 ...
- 千寻浏览器 1.0 Beta 1(524)(2014年5月27日)
千寻浏览器--又一款新生浏览器今天进入各位浏览迷的视野.千寻浏览器基于IE内核,据传是由百度浏览器的上海团队操刀,在功能定位上,与目前的QQ浏览器有些相似. 千寻来自官方的解释:寻,追寻,探索,又是古 ...
- SharePoint表单和工作流 - Nintex篇(五)
博客地址 http://blog.csdn.net/foxdave 接上篇点击打开链接 本篇我们应用Nintex来创建一个简单的工作流. 首先创建一个自定义列表,用于存放请假数据用,我们就叫做Leav ...
- vs2012 .netFramwork2.0发布到xp
开发环境 windows server2008R2 VS2012 .net Framwork2.0 开发的winform程序 在有的xp系统下不能运行 选择 项目属性=>编译 Build=&g ...
- ognl表达式root中取值顺序
不加#,先从栈顶取,如果没有(是没有这个属性而不是这个属性没有值),再往下取. 如果栈顶和非栈顶的对象拥有同一个属性名称,想直接取非栈顶的属性可以在ognl中用#root[i].属性名,可以取到属性的 ...