Android 7.0 新特性詳解

Android 7.0 新特性(源自官方文檔)

Android 7.0(API 級(jí)別 24) 除了提供諸多新特性和功能外脉幢,還對(duì)系統(tǒng)和 API 行為做出了各種變更。本文重點(diǎn)介紹您應(yīng)該了解并在開(kāi)發(fā)應(yīng)用時(shí)加以考慮的一些主要變更被辑。

如果您之前發(fā)布過(guò) Android 應(yīng)用纫溃,請(qǐng)注意您的應(yīng)用可能受到這些平臺(tái)變化的影響沪羔。

電池和內(nèi)存

Android 7.0 包括旨在延長(zhǎng)設(shè)備電池壽命和減少 RAM 使用的系統(tǒng)行為變更。這些變更可能會(huì)影響您的應(yīng)用訪(fǎng)問(wèn)系統(tǒng)資源葵姥,以及您的應(yīng)用通過(guò)特定隱式 intent 與其他應(yīng)用交互的方式荷鼠。

低電耗模式

Android 6.0(API 級(jí)別 23)引入了低電耗模式,當(dāng)用戶(hù)設(shè)備未插接電源榔幸、處于靜止?fàn)顟B(tài)且屏幕關(guān)閉時(shí)允乐,該模式會(huì)推遲 CPU 和網(wǎng)絡(luò)活動(dòng)矮嫉,從而延長(zhǎng)電池壽命。而 Android 7.0 則通過(guò)在設(shè)備未插接電源且屏幕關(guān)閉狀態(tài)下牍疏、但不一定要處于靜止?fàn)顟B(tài)(例如用戶(hù)外出時(shí)把手持式設(shè)備裝在口袋里)時(shí)應(yīng)用部分 CPU 和網(wǎng)絡(luò)限制蠢笋,進(jìn)一步增強(qiáng)了低電耗模式。

圖1_Image.png

圖 1. 低電耗模式如何應(yīng)用第一級(jí)系統(tǒng)活動(dòng)限制以延長(zhǎng)電池壽命的圖示鳞陨。

當(dāng)設(shè)備處于充電狀態(tài)且屏幕已關(guān)閉一定時(shí)間后昨寞,設(shè)備會(huì)進(jìn)入低電耗模式并應(yīng)用第一部分限制:關(guān)閉應(yīng)用網(wǎng)絡(luò)訪(fǎng)問(wèn)、推遲作業(yè)和同步厦滤。如果進(jìn)入低電耗模式后設(shè)備處于靜止?fàn)顟B(tài)達(dá)到一定時(shí)間援岩,系統(tǒng)則會(huì)對(duì) PowerManager.WakeLock、AlarmManager 鬧鈴掏导、GPS 和 WLAN 掃描應(yīng)用余下的低電耗模式限制享怀。無(wú)論是應(yīng)用部分還是全部低電耗模式限制,系統(tǒng)都會(huì)喚醒設(shè)備以提供簡(jiǎn)短的維護(hù)時(shí)間窗口碘菜,在此窗口期間凹蜈,應(yīng)用程序可以訪(fǎng)問(wèn)網(wǎng)絡(luò)并執(zhí)行任何被推遲的作業(yè)/同步限寞。

圖2_Image.png

圖 2. 低電耗模式如何在設(shè)備處于靜止?fàn)顟B(tài)達(dá)到一定時(shí)間后應(yīng)用第二級(jí)系統(tǒng)活動(dòng)限制的圖示忍啸。

請(qǐng)注意,激活屏幕或插接設(shè)備電源時(shí)履植,系統(tǒng)將退出低電耗模式并移除這些處理限制计雌。此項(xiàng)新增的行為不會(huì)影響有關(guān)使您的應(yīng)用適應(yīng) Android 6.0(API 級(jí)別 23)中所推出的舊版本低電耗模式的建議和最佳做法,如對(duì)低電耗模式和應(yīng)用待機(jī)模式進(jìn)行針對(duì)性?xún)?yōu)化中所討論玫霎。您仍應(yīng)遵循這些建議(例如使用 Google 云消息傳遞 (GCM) 發(fā)送和接收消息)并開(kāi)始安排更新計(jì)劃以適應(yīng)新增的低電耗模式行為凿滤。

Project Svelte:后臺(tái)優(yōu)化

Android 7.0 移除了三項(xiàng)隱式廣播,以幫助優(yōu)化內(nèi)存使用和電量消耗庶近。此項(xiàng)變更很有必要翁脆,因?yàn)殡[式廣播會(huì)在后臺(tái)頻繁啟動(dòng)已注冊(cè)偵聽(tīng)這些廣播的應(yīng)用。刪除這些廣播可以顯著提升設(shè)備性能和用戶(hù)體驗(yàn)鼻种。

移動(dòng)設(shè)備會(huì)經(jīng)歷頻繁的連接變更反番,例如在 WLAN 和移動(dòng)數(shù)據(jù)之間切換時(shí)。目前叉钥,可以通過(guò)在應(yīng)用清單中注冊(cè)一個(gè)接收器來(lái)偵聽(tīng)隱式 CONNECTIVITY_ACTION 廣播罢缸,讓?xiě)?yīng)用能夠監(jiān)控這些變更。由于很多應(yīng)用會(huì)注冊(cè)接收此廣播投队,因此單次網(wǎng)絡(luò)切換即會(huì)導(dǎo)致所有應(yīng)用被喚醒并同時(shí)處理此廣播枫疆。

同理,在之前版本的 Android 中敷鸦,應(yīng)用可以注冊(cè)接收來(lái)自其他應(yīng)用(例如相機(jī))的隱式 ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 廣播息楔。當(dāng)用戶(hù)使用相機(jī)應(yīng)用拍攝照片時(shí)寝贡,這些應(yīng)用即會(huì)被喚醒以處理廣播。

為緩解這些問(wèn)題值依,Android 7.0 應(yīng)用了以下優(yōu)化措施:

  • 面向 Android 7.0 開(kāi)發(fā)的應(yīng)用不會(huì)收到 CONNECTIVITY_ACTION 廣播兔甘,即使它們已有清單條目來(lái)請(qǐng)求接受這些事件的通知。在前臺(tái)運(yùn)行的應(yīng)用如果使用 BroadcastReceiver 請(qǐng)求接收通知鳞滨,則仍可以在主線(xiàn)程中偵聽(tīng) CONNECTIVITY_CHANGE洞焙。
  • 應(yīng)用無(wú)法發(fā)送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 廣播。此項(xiàng)優(yōu)化會(huì)影響所有應(yīng)用拯啦,而不僅僅是面向 Android 7.0 的應(yīng)用澡匪。
    如果您的應(yīng)用使用任何 intent,您仍需要盡快移除它們的依賴(lài)關(guān)系褒链,以正確適配 Android 7.0 設(shè)備唁情。Android 框架提供多個(gè)解決方案來(lái)緩解對(duì)這些隱式廣播的需求。例如甫匹,JobScheduler API 提供了一個(gè)穩(wěn)健可靠的機(jī)制來(lái)安排滿(mǎn)足指定條件(例如連入無(wú)限流量網(wǎng)絡(luò))時(shí)所執(zhí)行的網(wǎng)絡(luò)操作甸鸟。您甚至可以使用 JobScheduler 來(lái)適應(yīng)內(nèi)容提供程序變化。

如需了解有關(guān) Android N 中后臺(tái)優(yōu)化以及如何改寫(xiě)應(yīng)用的詳細(xì)信息兵迅,請(qǐng)參閱后臺(tái)優(yōu)化抢韭。

權(quán)限更改

Android 7.0 做了一些權(quán)限更改,這些更改可能會(huì)影響您的應(yīng)用恍箭。

系統(tǒng)權(quán)限更改

為了提高私有文件的安全性刻恭,面向 Android 7.0 或更高版本的應(yīng)用私有目錄被限制訪(fǎng)問(wèn) (0700)。此設(shè)置可防止私有文件的元數(shù)據(jù)泄漏扯夭,如它們的大小或存在性鳍贾。此權(quán)限更改有多重副作用:

  • 私有文件的文件權(quán)限不應(yīng)再由所有者放寬,為使用 MODE_WORLD_READABLE 和/或 MODE_WORLD_WRITEABLE 而進(jìn)行的此類(lèi)嘗試將觸發(fā) SecurityException交洗。
    注:迄今為止骑科,這種限制尚不能完全執(zhí)行。應(yīng)用仍可能使用原生 API 或 File API 來(lái)修改它們的私有目錄權(quán)限构拳。但是咆爽,我們強(qiáng)烈反對(duì)放寬私有目錄的權(quán)限。

  • 傳遞軟件包網(wǎng)域外的 file:// URI 可能給接收器留下無(wú)法訪(fǎng)問(wèn)的路徑隐圾。因此伍掀,嘗試傳遞 file:// URI 會(huì)觸發(fā) FileUriExposedException。分享私有文件內(nèi)容的推薦方法是使用 FileProvider暇藏。

  • DownloadManager 不再按文件名分享私人存儲(chǔ)的文件蜜笤。舊版應(yīng)用在訪(fǎng)問(wèn) COLUMN_LOCAL_FILENAME 時(shí)可能出現(xiàn)無(wú)法訪(fǎng)問(wèn)的路徑。面向 Android 7.0 或更高版本的應(yīng)用在嘗試訪(fǎng)問(wèn) COLUMN_LOCAL_FILENAME 時(shí)會(huì)觸發(fā) SecurityException盐碱。通過(guò)使用 DownloadManager.Request.setDestinationInExternalFilesDir() 或 DownloadManager.Request.setDestinationInExternalPublicDir() 將下載位置設(shè)置為公共位置的舊版應(yīng)用仍可以訪(fǎng)問(wèn) COLUMN_LOCAL_FILENAME 中的路徑把兔,但是我們強(qiáng)烈反對(duì)使用這種方法沪伙。對(duì)于由 DownloadManager 公開(kāi)的文件,首選的訪(fǎng)問(wèn)方式是使用ContentResolver.openFileDescriptor()县好。

在應(yīng)用間共享文件

對(duì)于面向 Android 7.0 的應(yīng)用围橡,Android 框架執(zhí)行的 StrictMode API 政策禁止在您的應(yīng)用外部公開(kāi) file:// URI。如果一項(xiàng)包含文件 URI 的 intent 離開(kāi)您的應(yīng)用缕贡,則應(yīng)用出現(xiàn)故障翁授,并出現(xiàn) FileUriExposedException 異常。

要在應(yīng)用間共享文件晾咪,您應(yīng)發(fā)送一項(xiàng) content:// URI收擦,并授予 URI 臨時(shí)訪(fǎng)問(wèn)權(quán)限。進(jìn)行此授權(quán)的最簡(jiǎn)單方式是使用 FileProvider 類(lèi)谍倦。如需了解有關(guān)權(quán)限和共享文件的詳細(xì)信息塞赂,請(qǐng)參閱共享文件

無(wú)障礙改進(jìn)

為提高平臺(tái)對(duì)于視力不佳或視力受損用戶(hù)的易用性昼蛀,Android 7.0 做出了一些更改宴猾。這些更改一般并不要求更改您的應(yīng)用代碼,不過(guò)您應(yīng)仔細(xì)檢查并使用您的應(yīng)用測(cè)試這些功能叼旋,以評(píng)估它們對(duì)用戶(hù)體驗(yàn)的潛在影響仇哆。

屏幕縮放

Android 7.0 支持用戶(hù)設(shè)置顯示尺寸,以放大或縮小屏幕上的所有元素送淆,從而提升設(shè)備對(duì)視力不佳用戶(hù)的可訪(fǎng)問(wèn)性税产。用戶(hù)無(wú)法將屏幕縮放至低于最小屏幕寬度 sw320dp怕轿,該寬度是 Nexus 4 的寬度偷崩,也是常規(guī)中等大小手機(jī)的寬度。

圖3_1_Image.png
圖3_2_Image.png

圖 3. 右側(cè)屏幕顯示的是一臺(tái)運(yùn)行

Android 7.0 系統(tǒng)映像的設(shè)備增大顯示尺寸后的效果撞羽。

當(dāng)設(shè)備密度發(fā)生更改時(shí)阐斜,系統(tǒng)會(huì)以如下方式通知正在運(yùn)行的應(yīng)用:

  • 如果是面向 API 級(jí)別 23 或更低版本系統(tǒng)的應(yīng)用,系統(tǒng)會(huì)自動(dòng)終止其所有后臺(tái)進(jìn)程诀紊。這意味著如果用戶(hù)切換離開(kāi)此類(lèi)應(yīng)用谒出,轉(zhuǎn)而打開(kāi) Settings 屏幕并更改 Display size 設(shè)置,則系統(tǒng)會(huì)像處理內(nèi)存不足的情況一樣終止該應(yīng)用邻奠。如果應(yīng)用具有任何前臺(tái)進(jìn)程笤喳,則系統(tǒng)會(huì)如處理運(yùn)行時(shí)更改中所述將配置變更通知給這些進(jìn)程,就像對(duì)待設(shè)備屏幕方向變更一樣碌宴。

  • 如果是面向 Android 7.0 的應(yīng)用杀狡,則其所有進(jìn)程(前臺(tái)和后臺(tái))都會(huì)收到有關(guān)配置變更的通知,如處理運(yùn)行時(shí)更改中所述贰镣。
    大多數(shù)應(yīng)用并不需要進(jìn)行任何更改即可支持此功能呜象,不過(guò)前提是這些應(yīng)用遵循 Android 最佳做法膳凝。具體要檢查的事項(xiàng):

  • 在屏幕寬度為 sw320dp 的設(shè)備上測(cè)試您的應(yīng)用,并確保其充分運(yùn)行恭陡。

  • 當(dāng)設(shè)備配置發(fā)生變更時(shí)蹬音,更新任何與密度相關(guān)的緩存信息,例如緩存位圖或從網(wǎng)絡(luò)加載的資源休玩。當(dāng)應(yīng)用從暫停狀態(tài)恢復(fù)運(yùn)行時(shí)著淆,檢查配置變更。
    注:如果您要緩存與配置相關(guān)的數(shù)據(jù)拴疤,則最好也包括相關(guān)元數(shù)據(jù)牧抽,例如該數(shù)據(jù)對(duì)應(yīng)的屏幕尺寸或像素密度。保存這些元數(shù)據(jù)便于您在配置變更后決定是否需要刷新緩存數(shù)據(jù)遥赚。

  • 避免用像素單位指定尺寸扬舒,因?yàn)橄袼夭粫?huì)隨屏幕密度縮放。應(yīng)改為使用與密度無(wú)關(guān)像素 (dp) 單位指定尺寸凫佛。

設(shè)置向?qū)е械囊曈X(jué)設(shè)置

Android 7.0 在“Welcome”屏幕中加入了“Vision Settings”讲坎,用戶(hù)可以在新設(shè)備上設(shè)置以下無(wú)障礙功能設(shè)置:Magnification gesture、Font size愧薛、Display size 和話(huà)語(yǔ)提示晨炕。此項(xiàng)變更讓您可以更容易發(fā)現(xiàn)與不同屏幕設(shè)置有關(guān)的錯(cuò)誤。要評(píng)估此功能的影響毫炉,您應(yīng)在啟用這些設(shè)置的狀態(tài)下測(cè)試應(yīng)用瓮栗。您可以在 Settings > Accessibility 中找到這些設(shè)置。

NDK 應(yīng)用鏈接至平臺(tái)庫(kù)

從 Android 7.0 開(kāi)始瞄勾,系統(tǒng)將阻止應(yīng)用動(dòng)態(tài)鏈接非公開(kāi) NDK 庫(kù)费奸,這種庫(kù)可能會(huì)導(dǎo)致您的應(yīng)用崩潰。此行為變更旨在為跨平臺(tái)更新和不同設(shè)備提供統(tǒng)一的應(yīng)用體驗(yàn)进陡。即使您的代碼可能不會(huì)鏈接私有庫(kù)愿阐,但您的應(yīng)用中的第三方靜態(tài)庫(kù)可能會(huì)這么做。因此趾疚,所有開(kāi)發(fā)者都應(yīng)進(jìn)行相應(yīng)檢查缨历,確保他們的應(yīng)用不會(huì)在運(yùn)行 Android 7.0 的設(shè)備上崩潰。如果您的應(yīng)用使用原生代碼糙麦,則只能使用公開(kāi) NDK API辛孵。

您的應(yīng)用可通過(guò)以下三種方式嘗試訪(fǎng)問(wèn)私有平臺(tái) API:

  • 您的應(yīng)用直接訪(fǎng)問(wèn)私有平臺(tái)庫(kù)。您應(yīng)更新您的應(yīng)用以添加該應(yīng)用的庫(kù)副本赡磅,或使用公開(kāi) NDK API魄缚。
  • 您的應(yīng)用使用一個(gè)可訪(fǎng)問(wèn)私有平臺(tái)庫(kù)的第三方庫(kù)。即使您確定您的應(yīng)用不會(huì)直接訪(fǎng)問(wèn)私有庫(kù)仆邓,您仍應(yīng)針對(duì)此情景測(cè)試您的應(yīng)用鲜滩。
  • 您的應(yīng)用引用一個(gè)其 APK 中未包含的庫(kù)伴鳖。例如,如果您嘗試使用您自己的 OpenSSL 副本徙硅,但忘記將它與應(yīng)用的 APK 進(jìn)行捆綁榜聂,則可能會(huì)出現(xiàn)此情況。正常情況下嗓蘑,此應(yīng)用可在包含 libcrypto.so 的 Android 平臺(tái)版本上運(yùn)行须肆。不過(guò),此應(yīng)用在不包含此庫(kù)的新版 Android(例如桩皿,Android 6.0 和更高的版本)上會(huì)崩潰豌汇。為修復(fù)此問(wèn)題,請(qǐng)確保您的 APK 捆綁您的所有非 NDK 庫(kù)泄隔。
    應(yīng)用不應(yīng)使用 NDK 中未包含的原生庫(kù)拒贱,因?yàn)檫@些庫(kù)可能會(huì)發(fā)生更改或在不同 Android 版本之間的可用性不同。例如佛嬉,從 OpenSSL 切換至 BoringSSL 即屬于此類(lèi)更改逻澳。此外,由于不屬于 NDK 中的平臺(tái)庫(kù)沒(méi)有兼容性要求暖呕,因此不同的設(shè)備可能提供不同級(jí)別的兼容性斜做。

為降低此限制可能對(duì)當(dāng)前發(fā)布的應(yīng)用的影響,面向 API 級(jí)別 23 或更低級(jí)別的應(yīng)用在 Android N 上可暫時(shí)訪(fǎng)問(wèn)頗為常用的一組庫(kù)湾揽,例如 libandroid_runtime.so瓤逼、libcutils.so、libcrypto.so 和 libssl.so库物。如果您的應(yīng)用加載其中某個(gè)庫(kù)霸旗,logcat 會(huì)生成一個(gè)警告,并在目標(biāo)設(shè)備上顯示一個(gè) Toast 來(lái)通知您艳狐。如果您看到這些警告定硝,您應(yīng)更新您的應(yīng)用以添加該應(yīng)用自己的庫(kù)副本,或僅使用公開(kāi) NDK API毫目。將來(lái)發(fā)布的 Android 平臺(tái)可能會(huì)完全限制對(duì)私有庫(kù)的使用,并導(dǎo)致您的應(yīng)用崩潰诲侮。

所有應(yīng)用在調(diào)用既非公開(kāi)又不可暫時(shí)訪(fǎng)問(wèn)的 API 時(shí)都會(huì)生成一個(gè)運(yùn)行時(shí)錯(cuò)誤镀虐。結(jié)果就是 System.loadLibrary 和 dlopen(3) 同時(shí)返回 NULL,并可能導(dǎo)致您的應(yīng)用崩潰沟绪。您應(yīng)檢查應(yīng)用代碼以移除對(duì)私有平臺(tái) API 的使用刮便,并使用預(yù)覽版設(shè)備或模擬器全面測(cè)試應(yīng)用。如果您不確定您的應(yīng)用是否使用私有庫(kù)绽慈,您可以檢查 logcat 以識(shí)別運(yùn)行時(shí)錯(cuò)誤恨旱。

下表描述的是根據(jù)應(yīng)用使用的私有原生庫(kù)及其目標(biāo) API 級(jí)別 (android:targetSdkVersion)辈毯,應(yīng)用預(yù)期顯示的行為。

Paste_Image.png

檢查您的應(yīng)用是否使用私有庫(kù)

為幫助您識(shí)別加載私有庫(kù)的問(wèn)題搜贤,logcat 可能會(huì)生成一個(gè)警告或運(yùn)行時(shí)錯(cuò)誤谆沃。例如,如果您的應(yīng)用面向 API 級(jí)別 23 或更低級(jí)別仪芒,并在運(yùn)行 Android 7.0 的設(shè)備上嘗試訪(fǎng)問(wèn)私有庫(kù)唁影,您可能會(huì)看到一個(gè)類(lèi)似于下面所示的警告:

03-21 17:07:51.502 31234 31234 W linker  : library "libandroid_runtime.so"
("/system/lib/libandroid_runtime.so") needed or dlopened by
"/data/app/com.popular-app.android-2/lib/arm/libapplib.so" is not accessible
for the namespace "classloader-namespace" - the access is temporarily granted
as a workaround for http://b/26394120

這些 logcat 警告通知您哪個(gè)庫(kù)正在嘗試訪(fǎng)問(wèn)私有平臺(tái) API,但不會(huì)導(dǎo)致您的應(yīng)用崩潰掂名。但是据沈,如果應(yīng)用面向 API 級(jí)別 24 或更高級(jí)別,logcat 會(huì)生成以下運(yùn)行時(shí)錯(cuò)誤饺蔑,您的應(yīng)用可能會(huì)崩潰:

java.lang.UnsatisfiedLinkError: dlopen failed: library "libcutils.so"
("/system/lib/libcutils.so") needed or dlopened by
"/system/lib/libnativeloader.so" is not accessible for the namespace
"classloader-namespace"
  at java.lang.Runtime.loadLibrary0(Runtime.java:977)
  at java.lang.System.loadLibrary(System.java:1602)
  

如果您的應(yīng)用使用動(dòng)態(tài)鏈接到私有平臺(tái) API 的第三方庫(kù)锌介,您可能也會(huì)看到上述 logcat 輸出。利用 Android 7.0DK 中的 readelf 工具猾警,您可以通過(guò)運(yùn)行以下命令生成給定 .so 文件的所有動(dòng)態(tài)鏈接的共享庫(kù)列表:

aarch64-linux-android-readelf -dW libMyLibrary.so

更新您的應(yīng)用

通過(guò)下面的一些步驟掏湾,您可以修復(fù)上述類(lèi)型的錯(cuò)誤并確保您的應(yīng)用不會(huì)在將來(lái)的更新版平臺(tái)上崩潰:

  • 如果您的應(yīng)用使用私有平臺(tái)庫(kù),您應(yīng)更新它肿嘲,以添加該應(yīng)用自己的庫(kù)副本或使用公開(kāi) NDK API融击。
  • 如果您的應(yīng)用使用訪(fǎng)問(wèn)私有符號(hào)的第三方庫(kù),則聯(lián)系庫(kù)作者以更新庫(kù)雳窟。
  • 請(qǐng)確保將您的所有非 NDK 庫(kù)與您的 APK 打包在一起尊浪。
  • 使用標(biāo)準(zhǔn) JNI 函數(shù)而非來(lái)自 libandroid_runtime.so 的 getJavaVM 和 getJNIEnv:
AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h>
AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or
JavaVM::AttachCurrentThread from <jni.h>.

  • 使用 __system_property_get 而非來(lái)自 libcutils.so 的私有 property_get 符號(hào)。為此封救,請(qǐng)使用 __system_property_get 及以下 include 函數(shù):
#include <sys/system_properties.h>

注:系統(tǒng)屬性的可用性和內(nèi)容未通過(guò) CTS 進(jìn)行測(cè)試拇涤。應(yīng)執(zhí)行進(jìn)一步修復(fù)以避免同時(shí)使用這些屬性。

  • 使用來(lái)自 libcrypto.so 的 SSL_ctrl 符號(hào)的本地版本誉结。例如鹅士,您應(yīng)在您的 .so 文件中靜態(tài)鏈接 libcyrpto.a,或從 BoringSSL/OpenSSL 添加一個(gè)動(dòng)態(tài)鏈接的 libcrypto.so 版本惩坑,并將其打包到您的 APK 中掉盅。

Android for Work

Android 7.0 包含一些針對(duì)面向 Android for Work 的應(yīng)用的變更,包括對(duì)證書(shū)安裝以舒、密碼重置趾痘、二級(jí)用戶(hù)管理、設(shè)備標(biāo)識(shí)符訪(fǎng)問(wèn)權(quán)限的變更蔓钟。如果您是要針對(duì) Android for Work 環(huán)境開(kāi)發(fā)應(yīng)用永票,則應(yīng)仔細(xì)檢查這些變更并相應(yīng)地修改您的應(yīng)用。

  • 您必須先安裝授權(quán)證書(shū)安裝程序,然后 DPC 才能對(duì)其進(jìn)行設(shè)置侣集。對(duì)于面向 N SDK 的配置文件和設(shè)備所有者應(yīng)用键俱,您應(yīng)在設(shè)備規(guī)范控制器 (DPC) 調(diào)用 DevicePolicyManager.setCertInstallerPackage() 之前安裝授權(quán)證書(shū)安裝程序。如果尚未安裝此安裝程序世分,則系統(tǒng)會(huì)引發(fā) IllegalArgumentException编振。
  • 針對(duì)設(shè)備管理員的重置密碼限制現(xiàn)在也適用于配置文件所有者。設(shè)備管理員無(wú)法再使用 DevicePolicyManager.resetPassword() 來(lái)清除或更改已經(jīng)設(shè)置的密碼罚攀。設(shè)備管理員仍可以設(shè)置密碼党觅,但只能在設(shè)備沒(méi)有密碼、PIN 碼或圖案時(shí)這樣做斋泄。
  • 即使設(shè)置了限制杯瞻,設(shè)備所有者和配置文件所有者仍可以管理帳戶(hù)。而且炫掐,即使具有 DISALLOW_MODIFY_ACCOUNTS 用戶(hù)限制魁莉,設(shè)備所有者和配置文件所有者仍可調(diào)用 Account Management API。
  • 設(shè)備所有者可以更輕松地管理二級(jí)用戶(hù)募胃。當(dāng)設(shè)備在設(shè)備所有者模式下運(yùn)行時(shí)旗唁,系統(tǒng)將自動(dòng)設(shè)置 DISALLOW_ADD_USER 限制。這樣可以防止用戶(hù)創(chuàng)建非托管二級(jí)用戶(hù)痹束。此外检疫,CreateUser() 和 createAndInitializeUser() 方法已棄用,取而代之的是 DevicePolicyManager.createAndManageUser() 方法祷嘶。
  • 設(shè)備所有者可以訪(fǎng)問(wèn)設(shè)備標(biāo)識(shí)符屎媳。設(shè)備所有者可以使用 DevicePolicyManagewr.getWifiMacAddress() 訪(fǎng)問(wèn)設(shè)備的 WLAN MAC 地址。如果設(shè)備上從未啟用 WLAN论巍,則此方法將返回一個(gè) null 值烛谊。
  • 工作模式設(shè)置控制工作應(yīng)用訪(fǎng)問(wèn)。當(dāng)工作模式關(guān)閉時(shí)嘉汰,系統(tǒng)啟動(dòng)器通過(guò)使工作應(yīng)用顯示為灰色來(lái)指示它們不可用丹禀。啟用工作模式會(huì)再次恢復(fù)正常行為。
  • 從 Settings UI 安裝包含客戶(hù)端證書(shū)鏈和對(duì)應(yīng)的私鑰的 PKCS #12 文件時(shí)鞋怀,系統(tǒng)不再將該證書(shū)鏈中的 CA 證書(shū)安裝到受信任的憑據(jù)存儲(chǔ)空間双泪。當(dāng)應(yīng)用稍后嘗試檢索客戶(hù)端證書(shū)鏈時(shí),這不會(huì)影響 KeyChain.getCertificateChain() 的結(jié)果接箫。如果需要攒读,使用 .crt 或 .cer 文件擴(kuò)展名的 DER 編碼格式通過(guò) Settings UI 單獨(dú)將 CA 證書(shū)安裝到受信任的憑據(jù)存儲(chǔ)空間。
  • 從 Android 7.0 開(kāi)始辛友,可針對(duì)每個(gè)用戶(hù)管理指紋登記和存儲(chǔ)空間。如果配置文件所有者的設(shè)備規(guī)范客戶(hù)端 (DPC) 面向 Android N 設(shè)備上的 Android N 之前的版本,則用戶(hù)仍可以在該設(shè)備上設(shè)置指紋废累,但工作應(yīng)用不能訪(fǎng)問(wèn)設(shè)備指紋邓梅。當(dāng) DPC 面向 Android N 和更高版本時(shí),用戶(hù)可以通過(guò)轉(zhuǎn)到 Settings > Security > Work profile security 專(zhuān)門(mén)為托管配置文件設(shè)置指紋邑滨。
  • DevicePolicyManager.getStorageEncryptionStatus() 返回新的加密狀態(tài) ENCRYPTION_STATUS_ACTIVE_PER_USER日缨,以表明加密處于活動(dòng)狀態(tài),且加密密鑰與用戶(hù)關(guān)聯(lián)掖看。僅當(dāng) DPC 面向 API 級(jí)別 24 和更高級(jí)別時(shí)才會(huì)返回新的狀態(tài)匣距。對(duì)于面向更早的 API 級(jí)別的應(yīng)用,即使加密密鑰是用戶(hù)或配置文件特有的哎壳,系統(tǒng)也會(huì)返回 ENCRYPTION_STATUS_ACTIVE毅待。
  • 在 Android 7.0 中,如果設(shè)備通過(guò)單獨(dú)的工作挑戰(zhàn)安裝了托管配置文件归榕,則原本通常會(huì)影響整個(gè)設(shè)備的多個(gè)方法將會(huì)改變其行為方式尸红。這些方法將僅應(yīng)用于托管配置文件,而不是影響整個(gè)設(shè)備刹泄。(此類(lèi)方法的完整列表位于 DevicePolicyManager.getParentProfileInstance() 文檔中外里。)例如,DevicePolicyManager.lockNow() 只鎖定托管配置文件特石,而不是鎖定整個(gè)設(shè)備盅蝗。對(duì)于上述每個(gè)方法,您可以通過(guò)對(duì) DevicePolicyManager 的父實(shí)例調(diào)用該方法來(lái)獲取以前的行為姆蘸;您可以通過(guò)調(diào)用 DevicePolicyManager.getParentProfileInstance() 獲取此父項(xiàng)墩莫。例如,如果您調(diào)用父實(shí)例的 lockNow() 方法乞旦,則整個(gè)設(shè)備將被鎖定贼穆。
    如需了解有關(guān) Android 7.0 中針對(duì) Android for Work 所做變更的詳細(xì)信息,請(qǐng)參閱 Android for Work 更新兰粉。

注解保留

Android 7.0 修復(fù)了一個(gè)注解可見(jiàn)性被忽略的錯(cuò)誤故痊。這種問(wèn)題會(huì)導(dǎo)致應(yīng)用可在運(yùn)行時(shí)訪(fǎng)問(wèn)原本不允許訪(fǎng)問(wèn)的注解。這些注解包括:

  • VISIBILITY_BUILD:僅應(yīng)編譯時(shí)可見(jiàn)玖姑。
  • VISIBILITY_SYSTEM:運(yùn)行時(shí)應(yīng)可見(jiàn)愕秫,但僅限底層系統(tǒng)。
    如果您的應(yīng)用依賴(lài)這種行為焰络,請(qǐng)為運(yùn)行時(shí)必須可用的注解添加保留政策戴甩。您可通過(guò)使用 @Retention(RetentionPolicy.RUNTIME) 來(lái)執(zhí)行此操作。

其他重要說(shuō)明

  • 如果一個(gè)應(yīng)用在 Android 7.0 上運(yùn)行闪彼,但卻是針對(duì)更低 API 級(jí)別開(kāi)發(fā)的甜孤,那么在用戶(hù)更改顯示尺寸時(shí)协饲,系統(tǒng)將終止此應(yīng)用進(jìn)程。應(yīng)用必須能夠妥善處理此情景缴川。否則茉稠,當(dāng)用戶(hù)從最近使用記錄中恢復(fù)運(yùn)行應(yīng)用時(shí),應(yīng)用將會(huì)出現(xiàn)崩潰現(xiàn)象把夸。
    您應(yīng)測(cè)試應(yīng)用以確保不會(huì)發(fā)生此行為而线。要進(jìn)行此測(cè)試,您可以通過(guò) DDMS 手動(dòng)終止應(yīng)用恋日,以造成相同的崩潰現(xiàn)象膀篮。
    在密度發(fā)生更改時(shí),系統(tǒng)不會(huì)自動(dòng)終止面向 N 及更高版本的應(yīng)用岂膳;不過(guò)誓竿,這些應(yīng)用仍可能對(duì)配置變更做出不良響應(yīng)。

  • Android 7.0 上的應(yīng)用應(yīng)能夠妥善處理配置變更闷营,并且在后續(xù)啟動(dòng)時(shí)不會(huì)出現(xiàn)崩潰現(xiàn)象烤黍。您可以通過(guò)更改字體大小 (Setting >Display > Font size) 并隨后從最近使用記錄中恢復(fù)運(yùn)行應(yīng)用,來(lái)驗(yàn)證應(yīng)用行為傻盟。

  • 由于之前的 Android 版本中的一項(xiàng)錯(cuò)誤速蕊,系統(tǒng)未能將對(duì)主線(xiàn)程上的一個(gè) TCP 套接字的寫(xiě)入操作舉報(bào)為違反嚴(yán)格模式。Android 7.0 修復(fù)了此錯(cuò)誤娘赴。呈現(xiàn)出這種行為的應(yīng)用現(xiàn)在會(huì)引發(fā) android.os.NetworkOnMainThreadException规哲。一般情況下,我們不建議在主線(xiàn)程上執(zhí)行網(wǎng)絡(luò)操作诽表,因?yàn)檫@些操作通常會(huì)出現(xiàn)可能導(dǎo)致 ANR 和卡頓的高尾延遲唉锌。

  • Debug.startMethodTracing() 方法系列現(xiàn)在默認(rèn)在您的共享存儲(chǔ)空間上的軟件包特定目錄中存儲(chǔ)輸出,而非 SD 卡根目錄竿奏。這意味著應(yīng)用不再需要請(qǐng)求 WRITE_EXTERNAL_STORAGE 權(quán)限來(lái)使用這些 API 袄简。

  • 許多平臺(tái) API 現(xiàn)在開(kāi)始檢查在 Binder 事務(wù)間發(fā)送的大負(fù)載,系統(tǒng)現(xiàn)在會(huì)將 TransactionTooLargeExceptions 作為 RuntimeExceptions 再次引發(fā)泛啸,而不再只是默默記錄或抑制它們绿语。一個(gè)常見(jiàn)例子是在 Activity.onSaveInstanceState() 上存儲(chǔ)過(guò)多數(shù)據(jù),導(dǎo)致 ActivityThread.StopInfo 在您的應(yīng)用面向 Android 7.0 時(shí)引發(fā) RuntimeException候址。

  • 如果應(yīng)用向 View 發(fā)布 Runnable 任務(wù)吕粹,并且 View 未附加到窗口,系統(tǒng)會(huì)用 View 為 Runnable 任務(wù)排隊(duì)岗仑;在 View 附加到窗口之前匹耕,不會(huì)執(zhí)行 Runnable 任務(wù)。此行為會(huì)修復(fù)以下錯(cuò)誤:

    • 如果一項(xiàng)應(yīng)用是從并非預(yù)期窗口 UI 線(xiàn)程的其他線(xiàn)程發(fā)布到 View荠雕,則 Runnable 可能會(huì)因此運(yùn)行錯(cuò)誤的線(xiàn)程稳其。
      如果 Runnable 任務(wù)是從并非環(huán)路線(xiàn)程的其他線(xiàn)程發(fā)布驶赏,則應(yīng)用可能會(huì)曝光 Runnable 任務(wù)。
    • 如果 Android 7.0 上一項(xiàng)有 DELETE_PACKAGES 權(quán)限的應(yīng)用嘗試刪除一個(gè)軟件包欢际,但另一項(xiàng)應(yīng)用已經(jīng)安裝了這個(gè)軟件包,則系統(tǒng)需要用戶(hù)進(jìn)行確認(rèn)。在這種情況下,應(yīng)用在調(diào)用 PackageInstaller.uninstall() 時(shí)預(yù)計(jì)的返回狀態(tài)應(yīng)為 STATUS_PENDING_USER_ACTION链韭。
  • 名為 Crypto 的 JCA 提供程序已棄用,因?yàn)樗鼉H有的 SHA1PRNG 算法為弱加密殖蚕。應(yīng)用無(wú)法再使用 SHA1PRNG(不安全地)派生密鑰蛤育,因?yàn)椴辉偬峁┐颂峁┏绦蚪ΑH缧枇私庠敿?xì)信息,請(qǐng)參閱博文 Android N 中已棄用“Crypto”安全提供程序旁趟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耕餐,一起剝皮案震驚了整個(gè)濱河市槽华,隨后出現(xiàn)的幾起案子亚隅,更是在濱河造成了極大的恐慌硼莽,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煮纵,死亡現(xiàn)場(chǎng)離奇詭異懂鸵,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)行疏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)匆光,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人酿联,你說(shuō)我怎么就攤上這事终息。” “怎么了贞让?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵周崭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我喳张,道長(zhǎng)续镇,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任销部,我火速辦了婚禮摸航,結(jié)果婚禮上制跟,老公的妹妹穿的比我還像新娘。我一直安慰自己酱虎,他們只是感情好雨膨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著读串,像睡著了一般聊记。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爹土,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天甥雕,我揣著相機(jī)與錄音,去河邊找鬼胀茵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挟阻,可吹牛的內(nèi)容都是我干的琼娘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼附鸽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼脱拼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起坷备,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤熄浓,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后省撑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赌蔑,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年竟秫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娃惯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肥败,死狀恐怖趾浅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情馒稍,我是刑警寧澤皿哨,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站纽谒,受9級(jí)特大地震影響证膨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜佛舱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一椎例、第九天 我趴在偏房一處隱蔽的房頂上張望挨决。 院中可真熱鬧,春花似錦订歪、人聲如沸脖祈。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盖高。三九已至,卻和暖如春眼虱,著一層夾襖步出監(jiān)牢的瞬間喻奥,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工捏悬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撞蚕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓过牙,卻偏偏與公主長(zhǎng)得像甥厦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寇钉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理刀疙,服務(wù)發(fā)現(xiàn),斷路器扫倡,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 午后撵溃,我在擦拭著杯子疚鲤,待整理完畢,坐下來(lái)打開(kāi)電腦征懈,寫(xiě)寫(xiě)文章石咬。 或者,捧著一本書(shū)卖哎,癱在沙發(fā)上啃著紙上的文字鬼悠,品著其中...
    老顯閱讀 433評(píng)論 0 2
  • 一個(gè)月前看可愛(ài)的詛咒的時(shí)候焕窝,第一次看到救贖性轉(zhuǎn)折點(diǎn)的時(shí)候,就有點(diǎn)震驚维贺,這不是是我大部分的日常嗎它掂,一直想寫(xiě)可愛(ài)的...
    寶谷米的紅閱讀 728評(píng)論 0 0
  • 張雨綺《美人魚(yú)》后似乎大蛻變 動(dòng)不動(dòng)就在微博興風(fēng)作浪 不時(shí)曬個(gè)大白腿與鎖骨 風(fēng)情堪稱(chēng)俏嬌娘 娛樂(lè)圈虐秋,沒(méi)有作品沒(méi)有關(guān)...
    辣八閱讀 599評(píng)論 0 0