如何看待 Android Lolipop 禁止安裝存在相互喚醒的應用的機制?

Android Lolipop禁止了同時安裝能相互喚醒的應用,BAT的一票應用在Lolipop上每家只能有一個代表,而這幾個公司遲遲沒有適配Lolipop也搞得Google Play上用戶怨聲載道。如何評價Lolipop的這一機制,國內這些能夠相互喚醒的應用最終會選擇妥協(移除相互喚醒功能)還是設法繞過這一機制?

例如,能否通過以下方式繞過:

  1. X公司旗下App 1在安裝時捆綁安裝一個App Lanucher;

  2. 該公司旗下除App Launcher之外的其他應用都移除喚醒另一應用的功能,如此App 2, App 3, App n都能安裝;
  3. App x啟動時,給App Launcher發送一個消息,然後App Launcher去喚醒除App x的其他該公司旗下的其他App


好像不是樓主認為的這樣,主要還是簽名不一樣引起的。之前看過這個問題,轉一篇之前看到的資料過來,原文地址:關於Android L軟體安裝問題的發現_nexus5吧

==========分割線,以下為轉載==========

自從google開放了Android L的下載後,很多人為了嘗鮮,刷入了這個並不完善的新系統.畢竟是預覽版,難免存在各種各樣的問題,如保留數據刷入導致通知欄無法下拉,按home鍵不能回到桌面,sdcard無法讀取等等.但是相比程序安裝來說這都不是問題,因為前面的可以通過wipe解決,一勞永逸,而後者卻會一直存在.

刷了Android L之後,有一部分軟體無法正常安裝,多表現為 同一家公司開發的軟體只能安裝一個或者一部分,並且基本上安裝的時候都可以在底部看到了非android自帶的許可權, 於是有人猜測是不是它們相互喚醒的原因,其實仔細一想好像也不對,看看谷歌的一堆app就知道了.

通過實驗,發現這些apk有一個或多個相同的自定義許可權,但是簽名不一致,因而無法正常安裝,

並不是什麼防止相互喚醒之類的,這應該是Android L的新規則,

碰到這類無法安裝問題的解決辦法有兩個

1 (無需root)將所有衝突的apk用相同的簽名文件重新簽名即可正常安裝.

2 (需要root,這應該是目前大多數人在用的辦法)用rootexplorer或es文件管理器等將apk文件複製到/data/app/目錄下,然後重啟

順便提一下,如果Android L單純恢復efs電信3g無法正常使用的話,可以嘗試講efs和cache一起恢復.

=================================過程=====================================

下面以百度貼吧和百度輸入法為例說明(這是推測的過程,不是什麼嚴謹的證明,不用過分糾結,有些地方省略),看不懂也沒關係,知道上面的解決辦法就好了

1. 在手機端安裝什麼也看不到,只會顯示安裝失敗,為了查找原因,我使用adb通過命令行安裝,這樣能知道問題出在哪.

首先安裝貼吧,沒什麼問題, 然後安裝輸入法,問題來了,看綠色框, 提示安裝失敗因為許可權重複(INSTALL_FAILED_DUPLICATE_PERMISSION), 具體的許可權是"com.baidu.permission.SHARE",包名是"com.baidu.tieba",也就是已經安裝的貼吧.

是不是安裝順序的問題呢,把貼吧卸載,先安裝輸入法,這次輪到貼吧裝不上了,

2. 看看輸入法里定義了什麼許可權,在底下的綠色框可以看到,輸入法的確存在"com.baidu.permission.SHARE"這樣的permission

再看貼吧,說明一下,因為貼吧要求的許可權太多,沒法一次完整截屏,只截取了開始和結束的部分,

這裡同樣存在"com.baidu.permission.SHARE"

3. 到底是不是因為permission相同的原因導致只能安裝一個呢,還是弄兩個程序驗證下吧. 用android studio新建兩個項目,在兩個項目里都定義了相同的permission,神奇的事情來了,居然兩個都安裝成功了,難道不是permission相同造成的?

這兩者的區別在哪,還有一個地方沒注意到,看每個app的最後一行信息,那一長串字元代表的是證書指紋,這裡用的是md5, 可以看到 貼吧和輸入法的的證書指紋是不一樣的,而我創建的兩個app使用的是相同的簽名文件,所以md5是一樣的,在這裡又可以推測: 證書指紋相同的情況下,定義了相同permission的程序可以共存

4. 最後來驗證一下上面的猜測,給貼吧和輸入法用同一個文件重新簽名試試,這樣兩者就有了相同的簽名.

用 rar 打開 apk文件, 刪掉META-INF文件夾,通過命令行重新簽名,兩個都安裝成功. 這也證實了前面的推測:如果兩個apk定義了相同的permission,正常安裝的條件之一是兩者的簽名相同


?Android Lolipop禁止了同時安裝能相互喚醒的應用?

啊,你們誰把在L上,Manifest中聲明了同一個自定義許可權而簽名又不同的app只能安裝一個,傳成了上面那個題目的…

比如淘寶和旺旺,如果在Manifest里都聲明了 com.taobao.permission.FOO_BAR 這個自定義許可權,那麼就只能安裝一個,禁止相互喚醒只是因為愛亂聲明自定義許可權的app恰好是愛相互喚醒的…


Android 5.0 Behavior Changes

5.0 API Changes中對自定義許可權的安全修改進行了說明:

使用相同自定義許可權的應用只能存在一個,除非兩者使用相同的簽名才可以共存。


喚醒這個,我估計很大的一個原因就是一般一個公司內部都是共用一個推送服務導致的,平時在通知欄給你彈各種消息的一般都是推送服務乾的。推送服務一般都會啟動使用了它的相關應用(一般服務名都是含有push,background等等字眼)。

而且,一般使用推送服務都是需要註冊相關的自定義許可權的。這個課參考 @Mariotaku同學說法。

至於說某個應用寫邏輯去喚醒其他的應用,完全不需要許可權就可以做到,直接啟動其他應用的服務就可以。另外,公司內部每個項目組都忙著自己的事情,誰閑著蛋疼去喚醒其他的啊。要麼領導下令,要麼是同一個團隊開發的產品。這種情形概率很低。


國內軟體已經突破這個限制了!一打開UC瀏覽器就喚醒淘寶。


只是限制了申明相同自定義許可權的多個應用必須是同一簽名,與相互喚醒是無關的。

相互喚醒這事兒,估計google是沒辦法禁止的。

為什麼淘寶 支付寶 其他使用支付寶sdk的應用都不能同時安裝,因為這些應用都申明了一個 名叫com.alipay.trigger.什麼什麼的自定義許可權,所以安裝不了。但如果這些應用都使用同一個證書籤名,就可以同時安裝了。

同時中招的還有個推。這些公司也都還沒有給解決方案。


為啥非要互相喚醒呢?我要用不會自己打開嗎?這些流氓真是不要臉!


互相流氓,互相勾結


推薦閱讀:

移動應用內支付 SDK 哪家強?
你認為一個移動端 App 的核心競爭力應該是什麼?
BaaS服務平台有哪些?
如何詳解 Activity 的生命周期?

TAG:Android | 移動開發 |