Android6.0 新特性詳解

jopen 9年前發布 | 22K 次閱讀 Android開發 移動開發 Android6.0

本文描述了Android6.0在運行時權限、存儲、電源管理方面的改進,譯自官方文檔。

一 運行時權限

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

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

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

    受影響的權限

    系統要求標記為危險(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
    • </ul>

      權限遷移

      在設備從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守護來包裹原始存儲設備來完成的。
      • </ul>

        運行時權限

        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權限的應用可見。
        • </ul>

          在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(豁免)。預裝在設備上的系統應用和云消息服務,默認通常被豁免。應用開發者可以要求其應用使用這種設定。用戶也可以在設置中來豁免某些應用。
          • </ul>

            AppStandby

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

            生命周期

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

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

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

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

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

              Doze

              支持Doze功能的要求:

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

                生命周期

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

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

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

                  退出

                  • 用戶交互
                  • 設備移動
                  • 亮屏
                  • 鬧鈴
                  • </ul>

                    集成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.
                      3. </ol> </li>

                      4. 確認必要的服務從Doze中豁免。
                      5. </ol>

                        豁免應用

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

                        參考鏈接

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!