科普 | 下載應用這件事,Play 商店為什麼比國內軟件商店更好?

語言: CN / TW / HK

對有一定經驗的 Android 玩家來説,在下載 App 這件事情上,Play 商店依然是那個值得排除萬難、能上就上的選擇,沒有之一。坊間還流傳着各種關於「Play 版」應用的傳聞:Play 版應用有 FCM 推送、Play 版應用更省電、Play 版應用沒廣吿、Play 版應用有更適合現代設備的 64 位版本……

這種「Play 版更好」的説法究竟是科技圈的都市傳説還是確有其事?為什麼國產應用在 Play 商店中正變得越來越少了?

今天這篇文章,我們從一個對普通用户而言可能會有點陌生的概念——目標 API 級別入手,希望能為你解答上面所提到的一部分問題。

Android 有幾種寫法?

對 Android 系統而言,同一個系統版本一般都對應了不止一種名稱,比如對消費者而言 Android 12 是 Android 12,或者根據 Google 按照字母表順序命名的習慣叫做 Android S;而如果 2019 年 Google 沒有官宣取消甜品代號命名方式,Android 12 的甜品代號 Snow Cone 應該也會更加為大眾所熟知。

針對開發者,每個 Android 版本還會被分配到一個唯一的整數標識符,這個整數標識符就是 API 級別。

針對這些不同的命名方式,GitHub 上也有人做了一個清晰明瞭的 網站 ,有興趣的朋友可以去看看。從網站提供的表格不難看出,和一個甜品代號可以對應多個 Android 版本不同——比如 Android 7.0 和 Android 7.1 都可以叫「牛軋糖」—— API 級別和 Android 版本是嚴格對應的

API 級別 32 只可能對應 Android 12L,Android 12L 的 API 級別也只能是 32。對於市面上運行系統版本千差萬別的 Android 設備而言(你同樣可以在上面那個網站中看到不同 Android 版本的累計用户佔比),API 級別也成為了開發者辨別用户系統版本和應用運行環境、保證應用兼容性的重要參考。

具體而言:

  • 最低 API 級別:代表了應用可以運行的最低系統版本。如果一款應用的最低 API 級別為 28,那麼這款應用只能保證在 Android 9 及以上系統版本中的兼容性
  • 目標 API 級別:代表了應用被設計用於運行的系統版本。如果一款應用的目標 API 級別為 32,則代表這款應用被設計用於在 Android 12L 中運行,因此也理所當然地支持 Android 12L 引入的新特性

參考鏈接:

  1. 瞭解 Android API 級別 - Xamarin | Microsoft Docs
  2. API Levels

目標 API 級別與體驗

聊完概念我們再來聊聊現象。

即便不談應用商店本身的使用體驗,在能不能下到好應用這一核心需求上,Google Play 和各種國內應用商店都有着天壤之別。

對國內應用商店而言,兼容各種魚龍混雜、質量參差不齊的應用才是頭等大事。畢竟為了賺錢,大部分 Android 設備默認的應用商店也都是自家的,如果用户發現某個應用無法正常運行,即便這個應用本身做得非常糟糕,他們往往也會將「鍋」扔給手機廠商。一傳十十傳百,這家廠商的手機在這位朋友的圈子裏就會被打上「不推薦」的評級。

Google Play 商店不一樣。

在更廣泛的 Android 生態裏,大多數 Android 設備都會搭載 GMS 套件、不同廠商的 Android 設備也能從同一個 Google Play 商店中獲取應用。因此 Play 商店作為由 Google 直接控制的應用商店,需要做好的就是平台本身:如何規範應用行為、如何保證設備安全、如何進行高效分發……

關聯閲讀: 必須兼容 PD 快充,Google 為 Android 設下了這些新標準

相對而言,Google 的地位也更加主動一點,如果某款 Play 商店的應用無法正常運行,用户只會將責任歸咎於手機和手機系統本身,或是在商店裏留個一星差評罵罵開發者。

解決方案藏在目標 API 級別這個概念裏。

通過讀取應用開發者為應用聲明的 targetSdkVersion 清單屬性,Android 系統得以判斷這款應用的目標 API 級別是多少,進而確定哪些新特性可以在這款應用中啟用、哪些特性則需要做適當的兼容處理。

以前幾年大家熱切期盼的「沙盒」機制分區存儲為例,應用必須首先通過清單屬性吿訴 Android 系統「我的目標 API 級別是 30,是支持最新特性的好應用」,系統在讀取到這一聲明後才會為應用啟用分區存儲機制;而對當時需要時間過渡的應用而言,它們在吿訴系統自己的目標 API 級別不夠 30 之後,系統則不會為這些應用啟用「沙盒」機制。

所以在 Android 開發者網站所列出的各種 API 接口、聲明數值、字符串等信息旁,也都會有一行小字説明這個功能是在哪一個 API 級別中所加入的;在 Android 13 的介紹中,Google 也有一個專門的頁面來説明目標 API 級別在 Android 13 及以上(另一種説法是「以 Android 13 或更高版本為目標平台」)的應用將受到哪些行為變更影響。

兩年為期、相對嚴格

我們可以將 2017 年看作是 Google 開始着手治理 Android 系統「碎片化」問題的開始,這一年,Android 系統本身引入了著名的Project Treble,讓那些開發實力的團隊在系統大版本更新這件事情上直接轉入了「快車道」。

但系統更新僅僅是一方面,系統更新帶來的各種新功能,除了手機廠商的配合,還是需要應用開發者這邊積極響應,才能將 Google 所預想的 Android 體驗帶到用户手中。

因此也是在 2017 年,Google 開始通過 Play 商店對 Android 應用的最終體驗進行干預,首先在 64 位應用支持這件事情上開始了籌備。2021 年 8 月,經過四年多的籌備和過渡,Play 商店中的所有應用都具備了向 64 位設備提供對應支持的能力。

同時,近幾年 Play 商店在 API 級別上的規範也逐漸成型。

總體而言,對於那些需要在 Play 商店中持續提供更新的大部分應用,Google Play 商店一般會提供一年左右的時間來讓開發者針對最新的目標 API 級別進行適配。

這裏 Play 商店將應用分成了三類:新應用、應用更新和現有應用,新應用指此前從未在 Play 商店發佈過的應用,應用更新指已經在 Play 商店上架的應用所提供的更新版本,現有應用則對應那些已經發布在 Play 商店、但並不提供任何更新的應用。

舉個例子,Android 11 正式版發佈於 2020 年 9 月,目前 Google Play 管理中心的要求是:

  1. 2021 年 8 月 2 日之後,新應用必須將目標 API 級別設置為對應的 API 級別 30
  2. 2021 年 11 月 1 日之後,應用更新必須將 API 級別設置為對應的 API 級別 30
  3. 2022 年 11 月 1 日之後,現有應用必須將目標 API 級別設置為對應的 API 級別 30

如此一來,新應用開發和現有應用針對新版本系統特性跟進適配的窗口時間,便被控制在了系統更新後的一年左右時間內。

至於那些妄圖通過不提供應用更新保留 Play 商店上架狀態的應用,上述限制的存在也有一定的限制作用:2022 年 11 月 1 日之後,如果你的手機已經升級到了 Android 11 及以上系統版本,那些目標 API 級別低於 30 的應用就不會出現在 Play 商店的頁面和搜索結果當中了。

參考鏈接: Google Play 應用在目標 API 級別方面需滿足的要求 - Play 管理中心幫助

我們姑且以「Play 商店中能否搜到」這個行為為前提,對應 Android 版本和 API 級別,梳理一下最近一段時間內 Play 版應用將會提供的一些體驗。在 2022 年 11 月 1 日後:

所有能在 Play 商店中下載到的應用,都將提供分區存儲(也就是「沙盒」)機制支持。關於分區存儲的詳細介紹,可以參見少數派此前的文章。

關聯閲讀: 還存儲空間一片清朗:Android 的「沙盒」機制何時到來?

在數月未使用的情況下,已經授予的運行時敏感權限都會被系統自動重置;

申請位置信息訪問權限時,最高都只能申請到「僅在使用中允許」,「總是允許」只能在系統設置中手動開啟;查詢設備上已安裝應用的列表時,則只能獲取到系統過濾後的已安裝應用列表。

另外,2022 年 11 月 1 日後,此前已上架應用的新版本都將支持 Android 12 的新特性 ,比如自定義通知佈局、應用休眠、傳感器採樣率限制、前台服務啟動限制、更快的通知操作響應速度(trampoline 優化)……

參考鏈接:

  1. Google Play 應用在目標 API 級別方面需滿足的要求 | Play 管理中心幫助
  2. 行為變更:以 Android 11 為目標平台的應用 | Android 開發者
  3. 行為變更:以 Android 12 為目標平台的應用 | Android 開發者

國內還停留在三年前

如果用一句話從用户角度去概括本文第三部分的所有內容,那應該是:

在 Android 11 正式版發佈兩年後,所有 Play 商店中能夠搜到的應用,無一例外都是支持 Android 11 新特性的。

所以我們説 Play 商店在目標 API 級別要求上的「嚴格」,其實也是一種相對而言的説法。 因為國內主流應用商店在目標 API 級別的要求普遍還停留在 3 年前

2018 年 7 月,電信終端產業協會(TAF)發佈了一份《 移動應用軟件高API等級預置與分發自律公約 》,這份公約由 OPPO、華為、百度、360、阿里、小米、vivo、騰訊發起,要求自 2019 年 5 月 1 日起,新上架和預置應用的目標 API 級別為 26 及以上,自 2019 年 8 月 1 日起,現有應用的更新則必須以目標 API 級別 26 及以上進行開發。目標 API 級別 26 對應的版本是 Android 8.0,Android 8.0 的正式版發佈時間是 2017 年 8 月。彼時的國內主流應用商店,還能給出一份與 Google Play 商店節奏一致的目標 API 級別要求。

不知道是電信終端產業協會後續在這方面沒有持續跟進,還是 Google 在 2020 年的 Android 11 正式版中引入的分區存儲機制過於激進,國內應用商店在目標 API 級別要求這件事情上自那之後便陷入了停滯。目前,我們在 OPPO、小米等廠商的相關開發者文檔中,能夠檢索到的目標 API 級別相關要求大多數都與三年前那份《移動應用軟件高API等級預置與分發自律公約》有關。

我所使用的設備上所安裝應用的目標 API 級別統計

換句話説,以五年前 Android 8.0 系統體驗為基礎的應用,依然存在於 2022 年的國內應用商店中。至於數量有多少,你可以下載 AppChecker 這類應用自行檢查。

與 Play 商店實際仍有些保守的做法相比,國內應用商店還有更長的路要走,甚至應該先從態度上重視起來——比起最近在 64 位應用這件事情上的 被動應戰 ,國內應用商店、尤其是已經有着相當大影響力和號召力的 O、V、華、米幾家國內應用商店,應該主動擁抱的「優秀品質」還有不少,與時俱進的目標 API 級別要求可以是其中之一。

關聯閲讀:

> 下載少數派 2.0 客户端、關注 少數派公眾號,解鎖全新閲讀體驗 :newspaper: 

> 實用、好用的正版軟件,少數派為你呈現 :rocket: