參考鏈接:leanote.com/blog/post/561658f938f41126b2000298
本文描述了Android6.0在運行時權(quán)限培愁、存儲、電源管理方面的改進定续,譯自官方文檔私股。
目錄:
一 運行時權(quán)限
Android6.0 引入了一個新的應(yīng)用權(quán)限模型,期望對用戶更容易理解供嚎,更易用和更安全峭状。該模型將標記為危險的權(quán)限從安裝時權(quán)限(Install Time Permission)模型 移動到 運行時權(quán)限模型(Runtime Permissions):
安裝時權(quán)限模型(Android5.1以及更早)优床。用戶在應(yīng)用安裝和更新時,對危險權(quán)限授權(quán)胆敞。但是OEM和運行商預裝的應(yīng)用將自動預授權(quán)。
運行時權(quán)限(Android6.0及以后)仍翰。用戶在應(yīng)用運行時歉备,對應(yīng)用授予危險權(quán)限。由應(yīng)用決定何時去申請權(quán)限(例如喧笔,在應(yīng)用啟動時或者用戶訪問某個特性時)龟再,但必須容許用戶來授予或者拒絕應(yīng)用對特定權(quán)限組的訪問。OEM和運營商 可以預裝應(yīng)用浆劲,但是不能對權(quán)限進行預授權(quán)(例外情況請看這里Create exception)哀澈。
運行時權(quán)限提供給用戶關(guān)于應(yīng)用所需權(quán)限更多的相關(guān)上下文和可視性,這也讓開發(fā)者幫助用戶更好的理解:為什么應(yīng)用需要所請求的權(quán)限膨报,授權(quán)將有什么樣的好處适荣,拒絕將有何種不便。用戶可以通過設(shè)置中的菜單來撤銷應(yīng)用的權(quán)限够吩。
受影響的權(quán)限
系統(tǒng)要求標記為危險(dangerous)的權(quán)限使用運行時權(quán)限模型丈氓。查看危險權(quán)限列表可以使用命令:adb shell pm list permissions -g -d。
Android6.0并不改變正常權(quán)限的行為鱼鼓。正常權(quán)限指的是所有非危險(non-dangerous)權(quán)限该编,包括normal课竣,system和signature 權(quán)限。正常權(quán)限風險較低公条,用于容許應(yīng)用以最小風險來訪問隔離的應(yīng)用級別的特性迂曲。在Android5.1和早期版本中,系統(tǒng)在安裝時自動將正常權(quán)限授予請求的應(yīng)用关霸,并不提示用戶杰扫。
請求
運行時權(quán)限模型適用于所有應(yīng)用,包括預裝應(yīng)用佳遣。應(yīng)用軟件的要求包括:
運行時權(quán)限模型必須在所有運行Android6.0的設(shè)備上是一致的凡伊。這通過CTS來實施。
應(yīng)用必須在運行時提示用戶進行授權(quán)诵盼。
帶有危險權(quán)限的預裝應(yīng)用笨觅,必須符合API level 23见剩,必須維護Android6.0的AOSP權(quán)限模型(例如,應(yīng)用安裝的UI流程不應(yīng)該脫離AOSP的packageInstaller的實現(xiàn)苍苞;用戶可以撤銷預裝應(yīng)用的危險權(quán)限羹呵;等等)。
無界面的應(yīng)用必須使用Activity來申請權(quán)限歉铝,或者與其他有相應(yīng)權(quán)限的應(yīng)用共享UID凑耻。細節(jié)請參考Headless applications柠贤。
權(quán)限遷移
在設(shè)備從Android5.x升級到Android6.0之后臼勉,授予應(yīng)用的權(quán)限仍然有效餐弱。但是用戶可以在任何時候撤銷這些權(quán)限。
二 存儲:
從Android6.0開始瓢谢,Android支持移動存儲(adoptable storage)降允,例如SD卡或者USB。移動存儲可以像內(nèi)部存儲一樣加密和格式化幢尚,可以存儲所有類型的應(yīng)用數(shù)據(jù)翅楼。
權(quán)限
是否訪問外部存儲由各種Android權(quán)限保護毅臊。
從Android1.0開始,寫訪問需要 WRITE_EXTERNAL_STORAGE 權(quán)限皂林;
從Android4.0開始蚯撩,讀訪問需要READ_EXTERNAL_STORAGE。
從Android4.4開始沟启,外部存儲設(shè)備上的文件犹菇,也能夠基于目錄結(jié)構(gòu)來合成(synthesized )不同的DAC權(quán)限(owner,group胳搞,mode)。這容許應(yīng)用能夠在外部存儲上管理一個包相關(guān)的目錄币厕,而無需WRITE_EXTERNAL_STORAGE 芽腾。例如摊滔, 應(yīng)用com.example.foo 可以自由訪問外部存儲上的Android/data/com.example.foo/店乐。這種合成權(quán)限是通過fuse守護來包裹原始存儲設(shè)備來完成的。
運行時權(quán)限
Android6.0 引入了新的運行時權(quán)限(runtime permissions)模型腺兴,用于應(yīng)用在運行中必要時申請權(quán)限廉侧。由于新模型包含了READ/WRITE_EXTERNAL_STORAGE,因此平臺需要在不殺死或者重啟運行中的應(yīng)用的前提下闰蚕,動態(tài)對存儲訪問授權(quán)连舍。這是通過維護所有掛載的存儲設(shè)備的三個不同視圖來實現(xiàn)的:
/mnt/runtime/default 對所有的應(yīng)用索赏、root名字空間(adb 和其他系統(tǒng)組件)可見,而無需任何權(quán)限
/mnt/runtime/read 對有READ_EXTERNAL_STORAGE權(quán)限的應(yīng)用可見埃儿。
/mnt/runtime/write 對有WRITE_EXTERNAL_STORAGE權(quán)限的應(yīng)用可見砾赔。
在zygote fork時,我們?yōu)槊總€運行中的應(yīng)用創(chuàng)建一個mount名字空間暴心,在其中bind mount合適的初始視圖。然后悯衬,當被授予運行時權(quán)限時,vold在運行中的應(yīng)用的名字空間上策橘,通過bind mount來更新視圖娜亿。注意买决,如果權(quán)限被撤銷示罗,將意味著該應(yīng)用被kill。
系統(tǒng)使用setns()函數(shù)來實現(xiàn)上述特性躲舌,這要求Linux3.8,不過Linux3.4加上補丁上也可以支持該功能。
在Android6.0中羹奉,第三方應(yīng)用不再被加入sdcard_r和sdcard_rw組中尘奏。相反病蛉,通過給應(yīng)用掛載合適的運行時視圖,實現(xiàn)對外部存儲的訪問控制俗孝。同時魄健,使用everybodyGID來進行的跨用戶交互被禁止了沽瘦。
三 電源管理
Android6.0引入了下列特性來延長電池使用時間:
App Standby(應(yīng)用待機)。系統(tǒng)可以將未使用的應(yīng)用置為AppStandby模式良哲,臨時限制這些應(yīng)用的網(wǎng)絡(luò)訪問助隧,延遲同步和后臺job
Doze(瞌睡)。如果用戶在某個時間期限內(nèi)未主動使用設(shè)備(屏幕關(guān)閉巍实、設(shè)備靜止),平臺將進入深度睡眠狀態(tài)令漂。因為該特性要求平臺檢測靜止狀態(tài)丸边,因此只有那些在Sensor HAL中實現(xiàn)了顯式移動檢測API的設(shè)備中才有效原环。
Exemptions(豁免)处窥。預裝在設(shè)備上的系統(tǒng)應(yīng)用和云消息服務(wù),默認通常被豁免谒麦。應(yīng)用開發(fā)者可以要求其應(yīng)用使用這種設(shè)定哆致。用戶也可以在設(shè)置中來豁免某些應(yīng)用摊阀。
AppStandby
對于不常用的應(yīng)用的耻蛇,AppStandby通過延遲后臺網(wǎng)絡(luò)活動和任務(wù)來延長電池壽命。
生命周期
檢測:當設(shè)備不在充電時胞此,且在某個特定時鐘期限內(nèi)和亮屏時長中臣咖,用戶沒有直接或者間接啟動該應(yīng)用。間接啟動指的是:前臺應(yīng)用訪問另外某個應(yīng)用的service漱牵。
App Standy模式中:平臺限制應(yīng)用一天內(nèi)最多訪問一次網(wǎng)絡(luò)夺蛇,延遲其同步和其他后臺任務(wù)。
退出:當應(yīng)用被激活酣胀,或者設(shè)備充電時刁赦,平臺將該應(yīng)用移出App Standby狀態(tài)。
活動的應(yīng)用不受AppStandby的影響闻镶。活動的含義是:
進程處于前臺(Activity 或者 前臺服務(wù)儒溉,或者 由另外一個Activity 或 前臺服務(wù)所使用)宦焦,例如 notification listener,輔助服務(wù),live 墻紙波闹,等等
供用戶查看的通知酝豪,可以是鎖屏通知或者通知圖標。
用戶顯式啟動的應(yīng)用精堕。
Doze
支持Doze功能的要求:
設(shè)備在Sensor HAL實現(xiàn)了significant motion detector (SMD) APIs 孵淘。
設(shè)備有某個云消息服務(wù),如 Google Cloud Messaging (GCM)歹篓。這使得設(shè)備可以知道何時從Doze中喚醒瘫证。
生命周期
檢測:當未在充電時,且當設(shè)備靜止且滅屏了一段時間庄撮。
Doze期間: 平臺嘗試讓系統(tǒng)處于休眠狀態(tài)背捌,周期性地進入在一個維持窗口恢復正常操作,然后進入更長的休眠狀態(tài)洞斯。在休眠狀態(tài):
禁止網(wǎng)絡(luò)訪問
忽略 wakelock
延遲鬧鐘毡庆,除了鬧鈴 和使用setAndAllowWhileIdle()設(shè)置的鬧鐘,以榮喜日歷等應(yīng)用顯示事件提醒
停止WIFI掃描
同步和后臺任務(wù)被推遲到下一個維護窗口烙如。
接收短信和MMS消息的應(yīng)用位于一個臨時白名單么抗,這樣他們可以完成其工作。
退出:
用戶交互
設(shè)備移動
亮屏
鬧鈴
集成Doze
確認設(shè)備支持 SENSOR_TYPE_SIGNIFICANT_MOTION .
確認設(shè)備安裝了一種云消息服務(wù)亚铁。蝇刀??徘溢?吞琐?
在配置文件overlay/frameworks/base/core/res/res/values/config.xml中,修改:bool name=”config_enableAutoPowerModes”>true
檢查裝應(yīng)用和服務(wù):
Use the new power-saving optimization guidelines. For details, see Testing and optimizing applications.
OR甸昏,Are exempted from Doze and App Standby. For details, see Exempting applications.
確認必要的服務(wù)從Doze中豁免顽分。
豁免應(yīng)用
你可以在設(shè)置中,手動將某些應(yīng)用從Doze和AppStandby中排除施蜜。
參考鏈接