一 運(yùn)行時(shí)權(quán)限
Android6.0 引入了一個(gè)新的應(yīng)用權(quán)限模型盯串,期望對(duì)用戶更容易理解庶近,更易用和更安全冤寿。該模型將標(biāo)記為危險(xiǎn)的權(quán)限從安裝時(shí)權(quán)限(Install Time Permission)模型 移動(dòng)到 運(yùn)行時(shí)權(quán)限模型(Runtime Permissions):
安裝時(shí)權(quán)限模型(Android5.1以及更早)中跌。用戶在應(yīng)用安裝和更新時(shí)毯辅,對(duì)危險(xiǎn)權(quán)限授權(quán)须妻。但是OEM和運(yùn)行商預(yù)裝的應(yīng)用將自動(dòng)預(yù)授權(quán)仔蝌。
運(yùn)行時(shí)權(quán)限(Android6.0及以后)。用戶在應(yīng)用運(yùn)行時(shí)荒吏,對(duì)應(yīng)用授予危險(xiǎn)權(quán)限敛惊。由應(yīng)用決定何時(shí)去申請(qǐng)權(quán)限(例如,在應(yīng)用啟動(dòng)時(shí)或者用戶訪問(wèn)某個(gè)特性時(shí))绰更,但必須容許用戶來(lái)授予或者拒絕應(yīng)用對(duì)特定權(quán)限組的訪問(wèn)瞧挤。OEM和運(yùn)營(yíng)商 可以預(yù)裝應(yīng)用,但是不能對(duì)權(quán)限進(jìn)行預(yù)授權(quán)(例外情況請(qǐng)看這里Create exception)动知。
運(yùn)行時(shí)權(quán)限提供給用戶關(guān)于應(yīng)用所需權(quán)限更多的相關(guān)上下文和可視性皿伺,這也讓開發(fā)者幫助用戶更好的理解:為什么應(yīng)用需要所請(qǐng)求的權(quán)限,授權(quán)將有什么樣的好處盒粮,拒絕將有何種不便鸵鸥。用戶可以通過(guò)設(shè)置中的菜單來(lái)撤銷應(yīng)用的權(quán)限。
受影響的權(quán)限
系統(tǒng)要求標(biāo)記為危險(xiǎn)(dangerous)的權(quán)限使用運(yùn)行時(shí)權(quán)限模型丹皱。查看危險(xiǎn)權(quán)限列表可以使用命令:adb shell pm list permissions -g -d妒穴。
Android6.0并不改變正常權(quán)限的行為。正常權(quán)限指的是所有非危險(xiǎn)(non-dangerous)權(quán)限摊崭,包括normal讼油,system和signature
權(quán)限。正常權(quán)限風(fēng)險(xiǎn)較低呢簸,用于容許應(yīng)用以最小風(fēng)險(xiǎn)來(lái)訪問(wèn)隔離的應(yīng)用級(jí)別的特性矮台。在Android5.1和早期版本中,系統(tǒng)在安裝時(shí)自動(dòng)將正常權(quán)限授予請(qǐng)求的應(yīng)用根时,并不提示用戶瘦赫。
請(qǐng)求
運(yùn)行時(shí)權(quán)限模型適用于所有應(yīng)用,包括預(yù)裝應(yīng)用蛤迎。應(yīng)用軟件的要求包括:
運(yùn)行時(shí)權(quán)限模型必須在所有運(yùn)行Android6.0的設(shè)備上是一致的确虱。這通過(guò)CTS來(lái)實(shí)施。
應(yīng)用必須在運(yùn)行時(shí)提示用戶進(jìn)行授權(quán)替裆。
帶有危險(xiǎn)權(quán)限的預(yù)裝應(yīng)用校辩,必須符合API level 23窘问,必須維護(hù)Android6.0的AOSP權(quán)限模型(例如,應(yīng)用安裝的UI流程不應(yīng)該脫離AOSP的packageInstaller的實(shí)現(xiàn)宜咒;用戶可以撤銷預(yù)裝應(yīng)用的危險(xiǎn)權(quán)限惠赫;等等)。
無(wú)界面的應(yīng)用必須使用Activity來(lái)申請(qǐng)權(quán)限荧呐,或者與其他有相應(yīng)權(quán)限的應(yīng)用共享UID汉形。細(xì)節(jié)請(qǐng)參考Headless applications。
權(quán)限遷移
在設(shè)備從Android5.x升級(jí)到Android6.0之后倍阐,授予應(yīng)用的權(quán)限仍然有效概疆。但是用戶可以在任何時(shí)候撤銷這些權(quán)限。
二 存儲(chǔ):
從Android6.0開始峰搪,Android支持移動(dòng)存儲(chǔ)(adoptable storage)岔冀,例如SD卡或者USB。移動(dòng)存儲(chǔ)可以像內(nèi)部存儲(chǔ)一樣加密和格式化概耻,可以存儲(chǔ)所有類型的應(yīng)用數(shù)據(jù)使套。
權(quán)限
是否訪問(wèn)外部存儲(chǔ)由各種Android權(quán)限保護(hù)。
從Android1.0開始鞠柄,寫訪問(wèn)需要 WRITE_EXTERNAL_STORAGE 權(quán)限侦高;
從Android4.0開始,讀訪問(wèn)需要READ_EXTERNAL_STORAGE厌杜。
從Android4.4開始奉呛,外部存儲(chǔ)設(shè)備上的文件,也能夠基于目錄結(jié)構(gòu)來(lái)合成(synthesized
)不同的DAC權(quán)限(owner夯尽,group瞧壮,mode)。這容許應(yīng)用能夠在外部存儲(chǔ)上管理一個(gè)包相關(guān)的目錄匙握,而無(wú)需WRITE_EXTERNAL_STORAGE
咆槽。例如, 應(yīng)用com.example.foo
可以自由訪問(wèn)外部存儲(chǔ)上的Android/data/com.example.foo/圈纺。這種合成權(quán)限是通過(guò)fuse守護(hù)來(lái)包裹原始存儲(chǔ)設(shè)備來(lái)完成的秦忿。
運(yùn)行時(shí)權(quán)限
Android6.0 引入了新的運(yùn)行時(shí)權(quán)限(runtime
permissions)模型,用于應(yīng)用在運(yùn)行中必要時(shí)申請(qǐng)權(quán)限蛾娶。由于新模型包含了READ/WRITE_EXTERNAL_STORAGE小渊,因此平臺(tái)需要在不殺死或者重啟運(yùn)行中的應(yīng)用的前提下,動(dòng)態(tài)對(duì)存儲(chǔ)訪問(wèn)授權(quán)茫叭。這是通過(guò)維護(hù)所有掛載的存儲(chǔ)設(shè)備的三個(gè)不同視圖來(lái)實(shí)現(xiàn)的:
/mnt/runtime/default 對(duì)所有的應(yīng)用、root名字空間(adb 和其他系統(tǒng)組件)可見半等,而無(wú)需任何權(quán)限
/mnt/runtime/read 對(duì)有READ_EXTERNAL_STORAGE權(quán)限的應(yīng)用可見揍愁。
/mnt/runtime/write 對(duì)有WRITE_EXTERNAL_STORAGE權(quán)限的應(yīng)用可見呐萨。
在zygote fork時(shí),我們?yōu)槊總€(gè)運(yùn)行中的應(yīng)用創(chuàng)建一個(gè)mount名字空間莽囤,在其中bind
mount合適的初始視圖谬擦。然后,當(dāng)被授予運(yùn)行時(shí)權(quán)限時(shí)朽缎,vold在運(yùn)行中的應(yīng)用的名字空間上惨远,通過(guò)bind
mount來(lái)更新視圖。注意话肖,如果權(quán)限被撤銷北秽,將意味著該應(yīng)用被kill。
系統(tǒng)使用setns()函數(shù)來(lái)實(shí)現(xiàn)上述特性最筒,這要求Linux3.8,不過(guò)Linux3.4加上補(bǔ)丁上也可以支持該功能贺氓。
在Android6.0中,第三方應(yīng)用不再被加入sdcard_r和sdcard_rw組中床蜘。相反辙培,通過(guò)給應(yīng)用掛載合適的運(yùn)行時(shí)視圖,實(shí)現(xiàn)對(duì)外部存儲(chǔ)的訪問(wèn)控制邢锯。同時(shí)扬蕊,使用everybodyGID來(lái)進(jìn)行的跨用戶交互被禁止了。
三 電源管理
Android6.0引入了下列特性來(lái)延長(zhǎng)電池使用時(shí)間:
App Standby(應(yīng)用待機(jī))丹擎。系統(tǒng)可以將未使用的應(yīng)用置為AppStandby模式尾抑,臨時(shí)限制這些應(yīng)用的網(wǎng)絡(luò)訪問(wèn),延遲同步和后臺(tái)job
Doze(瞌睡)鸥鹉。如果用戶在某個(gè)時(shí)間期限內(nèi)未主動(dòng)使用設(shè)備(屏幕關(guān)閉蛮穿、設(shè)備靜止),平臺(tái)將進(jìn)入深度睡眠狀態(tài)毁渗。因?yàn)樵撎匦砸笃脚_(tái)檢測(cè)靜止?fàn)顟B(tài)践磅,因此只有那些在Sensor HAL中實(shí)現(xiàn)了顯式移動(dòng)檢測(cè)API的設(shè)備中才有效。
Exemptions(豁免)灸异。預(yù)裝在設(shè)備上的系統(tǒng)應(yīng)用和云消息服務(wù)府适,默認(rèn)通常被豁免。應(yīng)用開發(fā)者可以要求其應(yīng)用使用這種設(shè)定肺樟。用戶也可以在設(shè)置中來(lái)豁免某些應(yīng)用檐春。
AppStandby
對(duì)于不常用的應(yīng)用的,AppStandby通過(guò)延遲后臺(tái)網(wǎng)絡(luò)活動(dòng)和任務(wù)來(lái)延長(zhǎng)電池壽命么伯。
生命周期
檢測(cè):當(dāng)設(shè)備不在充電時(shí)疟暖,且在某個(gè)特定時(shí)鐘期限內(nèi)和亮屏?xí)r長(zhǎng)中,用戶沒(méi)有直接或者間接啟動(dòng)該應(yīng)用。間接啟動(dòng)指的是:前臺(tái)應(yīng)用訪問(wèn)另外某個(gè)應(yīng)用的service俐巴。
App Standy模式中:平臺(tái)限制應(yīng)用一天內(nèi)最多訪問(wèn)一次網(wǎng)絡(luò)骨望,延遲其同步和其他后臺(tái)任務(wù)。
退出:當(dāng)應(yīng)用被激活欣舵,或者設(shè)備充電時(shí)擎鸠,平臺(tái)將該應(yīng)用移出App Standby狀態(tài)。
活動(dòng)的應(yīng)用不受AppStandby的影響缘圈×庸猓活動(dòng)的含義是:
進(jìn)程處于前臺(tái)(Activity 或者 前臺(tái)服務(wù),或者 由另外一個(gè)Activity 或 前臺(tái)服務(wù)所使用)糟把,例如 notification listener绢涡,輔助服務(wù),live 墻紙糊饱,等等
供用戶查看的通知垂寥,可以是鎖屏通知或者通知圖標(biāo)。
用戶顯式啟動(dòng)的應(yīng)用另锋。
Doze
支持Doze功能的要求:
設(shè)備在Sensor HAL實(shí)現(xiàn)了significant motion detector (SMD) APIs 滞项。
設(shè)備有某個(gè)云消息服務(wù),如 Google Cloud Messaging (GCM)夭坪。這使得設(shè)備可以知道何時(shí)從Doze中喚醒文判。
生命周期
檢測(cè):當(dāng)未在充電時(shí),且當(dāng)設(shè)備靜止且滅屏了一段時(shí)間室梅。
Doze期間: 平臺(tái)嘗試讓系統(tǒng)處于休眠狀態(tài)戏仓,周期性地進(jìn)入在一個(gè)維持窗口恢復(fù)正常操作,然后進(jìn)入更長(zhǎng)的休眠狀態(tài)亡鼠。在休眠狀態(tài):
禁止網(wǎng)絡(luò)訪問(wèn)
忽略 wakelock
延遲鬧鐘赏殃,除了鬧鈴 和使用setAndAllowWhileIdle()設(shè)置的鬧鐘,以榮喜日歷等應(yīng)用顯示事件提醒
停止WIFI掃描
同步和后臺(tái)任務(wù)被推遲到下一個(gè)維護(hù)窗口间涵。
接收短信和MMS消息的應(yīng)用位于一個(gè)臨時(shí)白名單仁热,這樣他們可以完成其工作。
退出:
用戶交互
設(shè)備移動(dòng)
亮屏
鬧鈴
集成Doze
確認(rèn)設(shè)備支持 SENSOR_TYPE_SIGNIFICANT_MOTION .
確認(rèn)設(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.
確認(rèn)必要的服務(wù)從Doze中豁免秽褒。
豁免應(yīng)用
你可以在設(shè)置中壶硅,手動(dòng)將某些應(yīng)用從Doze和AppStandby中排除。
失敗是什么震嫉?沒(méi)有什么森瘪,只是更走近成功一步;成功是什么票堵?就是走過(guò)了所有通向失敗的路,只剩下一條路逮栅,那就是成功的路悴势。