作者简介:章婉霞,腾讯优测高级Android工程师

除了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中存放的数据及形式也有所区别,详细情况见如下两图:

图1-1 努比亚launcher.db数据

图1-2 三星I9082 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"

责任编辑:唐小引(@唐门教主),邮箱:tangxy@csdn.net,欢迎投稿、约稿以及给文章挑错。

程序媛的自白:磨人小妖精之Android碎片化相关推荐

  1. 程序员MM的自白:磨人小妖精之安卓碎片化

    2019独角兽企业重金招聘Python工程师标准>>> 文/腾讯优测 章婉霞 除了crash问题,Android平台的碎片化越来越受到移动开发的关注,且不谈支持Android系统的移 ...

  2. 蜜糖?砒霜? 区块链真skr磨人小妖精!

    哪里有天才,我是把别人喝咖啡的工夫都用在工作上的.──鲁迅  中国软件网每日精选文集 "大家都在讨论区块链, 但我还是搞不懂它是什么, 和我又有什么关系." 今天各位"吃 ...

  3. Tensflow版本升级就是磨人的妖精——regular能用吗?

    磨人的妖精,版本带来的伤筋动骨,有发展就有版本升级,自己模块有方法变化.不同模块之间还有相互依赖变化,coding中有1/3的时间都是在解决版本升级后新特性学习问题解决,1/3是在debug,真正写核 ...

  4. 2018年39名最牛的女程序媛,第三名很多人都认识!

    这些有着工程师背景的女性,她们负责许多大公司里的重要业务部门,创造着未来的尖端科技,或者在科技公司扮演者领导者的角色. 尽管人们都说STEM(科学.技术.工程和数学,Science. Technolo ...

  5. 磨人小问题-正正经经解决方法(2)——关于u盘(资料已备份)被写保护无法操作文件如何解决的问题——使用量产工具

    现象情况:本来使用此u盘制作系统安装盘,在频繁查看和备份数据的时候,U盘莫名就被写保护了,而且u盘并没有外置推动按钮解锁.反复多次试过无效后,只能上网百度查看,然而很多方法,包括修改注册表之类的等等, ...

  6. 磨人小问题-偶遇神奇解决方法(3)——关于win10专业版勒索软件防护感叹号且忽略点不了和提示设置onedrive

    现象情况:某天开机,发现突然defender上有个感叹号,提示上图的情况,但是这个情况的忽略死活点不了(bug),这就纳闷了,又不想设置OneDrive(微软想你用OneDrive),一直有个感叹号也 ...

  7. 看看女程序媛们的自述

    我叫仓鼠, 作为女程序员写了8年代码了~感觉自己职业发展到目前还算顺利,很幸运没怎么因为性别受到不公正的待遇和评价,分享点体验吧:) 首先完全不要去管这个问题下那些说什么"女程序员只是鼓励师 ...

  8. CSDN --- 现实中的女程序媛

    关于我自己 嗯嗯嗯 hello大家好啊 我是90后刚毕业1年的女程序媛 锤石的打工人一名啊 --在某政府单位做驻场运维 念书主修计算机网络技术 但后期迷上软件开发跟着办理报了达内培训班 上学学了C语言 ...

  9. 「磨人的小妖精」JavaWeb如何学习?先肝了这套教程

    都说一入Java深似海,从此代码是爱人,但是学习的过程却从来都不轻松. 当下,越来越多的互联网企业,招聘Java工程师时,明确要求需熟练掌握JavaWeb技术.作为衔接前后端的重要一环,JavaWeb ...

最新文章

  1. IDEA设置单击左侧项目文件,自动在右侧编辑器打开
  2. .NET (C#) Internals: ASP.NET 应用程序与页面生命周期——吴秦(Tyler)
  3. MySQL中show语法使用总结
  4. Dev-C++安装教程附免费安装包资源
  5. bash的一些小技巧
  6. Python面向对象基础:编码细节和注意事项
  7. 处女篇:ObjectDataSource+CodeSmith实现基础增删改查功能
  8. EasyUI DataGrid 可编辑列级联操作
  9. 中国水墨动画系列 内容简介
  10. Hadoop2.7.1+Hbase1.2.1集群环境搭建(5)hbase安装
  11. 二维离散沃尔什变换及matlab实现
  12. BDBR和BD-PSNR
  13. 推特用户曝Win10版微信截图 微信或将回归Win系统
  14. SQL SERVER 插入时表名显示对象名无效 问题
  15. 基于web的老年保健品销售系统/保健品销售系统
  16. 学习之旅-计算语言学工作者需要了解的数学知识
  17. adguard自定义_AdGuardHome拦截页面模版下载,自定义AdGuardHome拦截页教程,修改AdGuardHome默认拦截页...
  18. 求绝对值指针c语言,C语言实现abs和fabs绝对值
  19. 产品读书《需求:缔造伟大商业传奇的根本力量》
  20. [Python]校园网(网页认证)开机/断网自动连接

热门文章

  1. Elasticsearch使用正则表达式匹配中文字符串结果为空集 es正则表达式查不到结果
  2. [附源码]JAVA毕业设计小王防疫副食品配送商城(系统+LW)
  3. 大学计算机高级应用考试,2016年大学计算机考试选择题及答案
  4. 传统药茶方:教您配制50种茶,喝出健康百病除!
  5. 6713_EMIF操作外部flash
  6. PreparedStatement实现数据查询
  7. 吃鸡2019年5月7日服务器维护,时隔6个月,“吃鸡”玩家打开《全军出击》,天美发来熟悉的提示...
  8. C++中string::相关函数【s.find()、s.npos、s.substr()、 isdigit(c)、stoi(s),erase()函数】
  9. android map有序存储,Android ArrayMap源代码分析
  10. Linux运维实战:Centos逻辑卷磁盘挂载流程