程序員MM的自白:磨人小妖精安卓碎片化
除了crash問題,Android平臺的碎片化越來越受到移動開發(fā)的關注,且不談支持Android系統(tǒng)的移動設備早已過萬款,屏幕、品牌以及傳感器等方面的碎片化問題也困擾著開發(fā)者。
初級Android的開發(fā)人員經常關心的問題就是開發(fā)的應用能不能在需求的設備上正常運行。為什么我沒有說所有設備呢?長期盤踞各Android設備市場份額或市場關注度榜單前十位,被大家熟知的品牌,它們ROM的個性化都足以讓人眼花繚亂了,更何況在如今“亂世”里那些七零八落的機型了。想要做更全面的自動化機型測試,破解兼容問題,騰訊優(yōu)測是很好的選擇。
最近筆者在做Launcher上圖標的清理,接到這個需求的時候,內心是感到輕松的,感覺查詢需要刪除的圖標然后刪除不就OK了。但事實證明,我還真是很年輕呢。
Launcher個性化
我們都知道,Android源碼中有Google做的原生Launcher。在2.1及之前的版本中,使用com.android.launcher;2.2至4.3版本使用的是com.android.launcher2;4.4版本開始則使用com.android.launcher3。
為了探究一下不同機型的Launcher應用,我分別查看了五部手機,結果如下:
|
型號 |
系統(tǒng)版本 |
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外,其他四個機型都經過了個性化再開發(fā)。在實際操作中也可以發(fā)現,對圖標上的操作響應也不盡相同。
對于點擊Home鍵后有“應用”圖標的Launcher,長按應用并拖動可在桌面上創(chuàng)建快捷方式。而沒有“應用”圖標的Launcher,長按加拖動則只能實現應用圖標的移動。
應用要創(chuàng)建和刪除自己的快捷方式圖標只需發(fā)送如下兩個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上其他應用的快捷方式圖標進行刪除,最簡單粗暴的方式是直接從數據庫里刪除,當然我們并不推薦,即便發(fā)送刪除的Intent也需要獲知該圖標在Launcher保存信息的數據庫launcher.db中的一條具有獨特性的信息。
接下來我們看看launcher.db數據庫是不是像網絡上說的那般,favorites表中保存著圖標信息。
數據庫個性化
從導出launcher.db來看,上述表中的五部手機大部分都在favorites表中保存圖標信息,三星I9082則在favorites中只保存主桌面圖標,其他應用圖標保存在favorites_normal表中。而各機型launcher.db中存放的數據及形式也有所區(qū)別,詳細情況見如下兩圖:
圖1-1 努比亞launcher.db數據
圖1-2 三星I9082 launcher.db數據
權限個性化
一旦要對Launcher數據庫有訪問,至少需要有對數據庫的讀權限,而要進行操作,權限要求會更高(寫數據庫的權限安全等級一般都是signatureOrSystem)。據不完全統(tǒng)計,要適配市場上大部分的設備,如下所列出的一大長串權限是免不了的,而且肯定還有不少漏網之魚。
- 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開發(fā)人員,多少次問自己:
愛卓,我怕了嗎?
眼淚,我忘了嗎?
產品催,機型差
應用怎么開發(fā)???
不管是創(chuàng)業(yè)公司還是具備一定規(guī)模的企業(yè),為了開發(fā)和測試自己的應用,采購覆蓋Android市場80%甚至更高的機型,是一件既不現實也不容易更不合理的事。想要為開發(fā)者壓縮時間成本,為公司節(jié)省采購和管理成本,不妨嘗試一下騰訊優(yōu)測,會讓你得到意想不到的效果哦,這可是程序員MM發(fā)自內心地吶喊~