Android6.0 新特性詳解


一 運行時權限

Android6.0 引入了一個新的應用權限模型,期望對用戶更容易理解,更易用和更安全。該模型將標記為危險的權限從安裝時權限(Install Time Permission)模型 移動到 運行時權限模型(Runtime Permissions):

  • 安裝時權限模型(Android5.1以及更早)。用戶在應用安裝和更新時,對危險權限授權。但是OEM和運行商預裝的應用將自動預授權。
  • 運行時權限(Android6.0及以后)。用戶在應用運行時,對應用授予危險權限。由應用決定何時去申請權限(例如,在應用啟動時或者用戶訪問某個特性時),但必須容許用戶來授予或者拒絕應用對特定權限組的訪問。OEM和運營商 可以預裝應用,但是不能對權限進行預授權(例外情況請看這里Create exception)。

運行時權限提供給用戶關於應用所需權限更多的相關上下文和可視性,這也讓開發者幫助用戶更好的理解:為什么應用需要所請求的權限,授權將有什么樣的好處,拒絕將有何種不便。用戶可以通過設置中的菜單來撤銷應用的權限。

受影響的權限

系統要求標記為危險(dangerous)的權限使用運行時權限模型。查看危險權限列表可以使用命令:adb shell pm list permissions -g -d。

Android6.0並不改變正常權限的行為。正常權限指的是所有非危險(non-dangerous)權限,包括normal,system和signature 權限。正常權限風險較低,用於容許應用以最小風險來訪問隔離的應用級別的特性。在Android5.1和早期版本中,系統在安裝時自動將正常權限授予請求的應用,並不提示用戶。

請求

運行時權限模型適用於所有應用,包括預裝應用。應用軟件的要求包括:

  • 運行時權限模型必須在所有運行Android6.0的設備上是一致的。這通過CTS來實施。
  • 應用必須在運行時提示用戶進行授權。
  • 帶有危險權限的預裝應用,必須符合API level 23,必須維護Android6.0的AOSP權限模型(例如,應用安裝的UI流程不應該脫離AOSP的packageInstaller的實現;用戶可以撤銷預裝應用的危險權限;等等)。
  • 無界面的應用必須使用Activity來申請權限,或者與其他有相應權限的應用共享UID。細節請參考Headless applications

權限遷移

在設備從Android5.x升級到Android6.0之后,授予應用的權限仍然有效。但是用戶可以在任何時候撤銷這些權限。

二 存儲:

從Android6.0開始,Android支持移動存儲(adoptable storage),例如SD卡或者USB。移動存儲可以像內部存儲一樣加密和格式化,可以存儲所有類型的應用數據。

權限

是否訪問外部存儲由各種Android權限保護。

  • 從Android1.0開始,寫訪問需要 WRITE_EXTERNAL_STORAGE 權限;
  • 從Android4.0開始,讀訪問需要READ_EXTERNAL_STORAGE。
  • 從Android4.4開始,外部存儲設備上的文件,也能夠基於目錄結構來合成(synthesized )不同的DAC權限(owner,group,mode)。這容許應用能夠在外部存儲上管理一個包相關的目錄,而無需WRITE_EXTERNAL_STORAGE 。例如, 應用com.example.foo 可以自由訪問外部存儲上的Android/data/com.example.foo/。這種合成權限是通過fuse守護來包裹原始存儲設備來完成的。

運行時權限

Android6.0 引入了新的運行時權限(runtime permissions)模型,用於應用在運行中必要時申請權限。由於新模型包含了READ/WRITE_EXTERNAL_STORAGE,因此平台需要在不殺死或者重啟運行中的應用的前提下,動態對存儲訪問授權。這是通過維護所有掛載的存儲設備的三個不同視圖來實現的:

  • /mnt/runtime/default 對所有的應用、root名字空間(adb 和其他系統組件)可見,而無需任何權限
  • /mnt/runtime/read 對有READ_EXTERNAL_STORAGE權限的應用可見。
  • /mnt/runtime/write 對有WRITE_EXTERNAL_STORAGE權限的應用可見。

在zygote fork時,我們為每個運行中的應用創建一個mount名字空間,在其中bind mount合適的初始視圖。然后,當被授予運行時權限時,vold在運行中的應用的名字空間上,通過bind mount來更新視圖。注意,如果權限被撤銷,將意味着該應用被kill。

系統使用setns()函數來實現上述特性,這要求Linux3.8,不過Linux3.4加上補丁上也可以支持該功能。

在Android6.0中,第三方應用不再被加入sdcard_r和sdcard_rw組中。相反,通過給應用掛載合適的運行時視圖,實現對外部存儲的訪問控制。同時,使用everybodyGID來進行的跨用戶交互被禁止了。

三 電源管理

Android6.0引入了下列特性來延長電池使用時間:

  • App Standby(應用待機)。系統可以將未使用的應用置為AppStandby模式,臨時限制這些應用的網絡訪問,延遲同步和后台job
  • Doze(瞌睡)。如果用戶在某個時間期限內未主動使用設備(屏幕關閉、設備靜止),平台將進入深度睡眠狀態。因為該特性要求平台檢測靜止狀態,因此只有那些在Sensor HAL中實現了顯式移動檢測API的設備中才有效。
  • Exemptions(豁免)。預裝在設備上的系統應用和雲消息服務,默認通常被豁免。應用開發者可以要求其應用使用這種設定。用戶也可以在設置中來豁免某些應用。

AppStandby

對於不常用的應用的,AppStandby通過延遲后台網絡活動和任務來延長電池壽命。

生命周期

檢測:當設備不在充電時,且在某個特定時鍾期限內和亮屏時長中,用戶沒有直接或者間接啟動該應用。間接啟動指的是:前台應用訪問另外某個應用的service。

App Standy模式中:平台限制應用一天內最多訪問一次網絡,延遲其同步和其他后台任務。

退出:當應用被激活,或者設備充電時,平台將該應用移出App Standby狀態。

活動的應用不受AppStandby的影響。活動的含義是:

  • 進程處於前台(Activity 或者 前台服務,或者 由另外一個Activity 或 前台服務所使用),例如 notification listener,輔助服務,live 牆紙,等等
  • 供用戶查看的通知,可以是鎖屏通知或者通知圖標。
  • 用戶顯式啟動的應用。

Doze

支持Doze功能的要求:

  • 設備在Sensor HAL實現了significant motion detector (SMD) APIs 。
  • 設備有某個雲消息服務,如 Google Cloud Messaging (GCM)。這使得設備可以知道何時從Doze中喚醒。

生命周期

檢測:當未在充電時,且當設備靜止且滅屏了一段時間。

Doze期間: 平台嘗試讓系統處於休眠狀態,周期性地進入在一個維持窗口恢復正常操作,然后進入更長的休眠狀態。在休眠狀態:

  • 禁止網絡訪問
  • 忽略 wakelock
  • 延遲鬧鍾,除了鬧鈴 和使用setAndAllowWhileIdle()設置的鬧鍾,以榮喜日歷等應用顯示事件提醒
  • 停止WIFI掃描
  • 同步和后台任務被推遲到下一個維護窗口。
  • 接收短信和MMS消息的應用位於一個臨時白名單,這樣他們可以完成其工作。

退出

  • 用戶交互
  • 設備移動
  • 亮屏
  • 鬧鈴

集成Doze

  1. 確認設備支持 SENSOR_TYPE_SIGNIFICANT_MOTION .
  2. 確認設備安裝了一種雲消息服務。????
  3. 在配置文件overlay/frameworks/base/core/res/res/values/config.xml中,修改:bool name=”config_enableAutoPowerModes”>true
  4. 檢查裝應用和服務: 
    1. Use the new power-saving optimization guidelines. For details, see Testing and optimizing applications.
    2. OR,Are exempted from Doze and App Standby. For details, see Exempting applications.
  5. 確認必要的服務從Doze中豁免。

豁免應用

你可以在設置中,手動將某些應用從Doze和AppStandby中排除。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM