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