admin管理员组

文章数量:1026989

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

作者简介:章婉霞,腾讯优测高级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三星I90824.1.2com.sec.android.app.launcher
2华为G6064.0.3com.huawei.android.launcher
3HTC T328W4.0.3com.htc.launcher
4努比亚Z9 Mini5.0.2cn.nubia.launcher
5锤子 T14.4.2com.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,欢迎投稿、约稿以及给文章挑错。

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

作者简介:章婉霞,腾讯优测高级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三星I90824.1.2com.sec.android.app.launcher
2华为G6064.0.3com.huawei.android.launcher
3HTC T328W4.0.3com.htc.launcher
4努比亚Z9 Mini5.0.2cn.nubia.launcher
5锤子 T14.4.2com.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,欢迎投稿、约稿以及给文章挑错。

本文标签: 程序媛的自白磨人小妖精之Android碎片化