標籤:本地 儲存 限制 軟體包 odi start 條件 dir -name
我只是Google的搬運工......
行為變更本文內容
- 效能提升
- 低電耗模式
- 後台最佳化
- 許可權更改
- 應用間共用檔案
- 無障礙改進
- 螢幕縮放
- 設定嚮導中的視覺設定
- NDK 應用連結至平台庫
- Android for Work
- 註解保留
- 其他重要說明
另請參閱
- Android N API 概覽
Android N 除了提供諸多新特性和功能外,還對系統和 API 行為做出了各種變更。 本文重點介紹您應該瞭解並在開發應用時加以考慮的一些重要變更。
如果您之前發布過 Android 應用,請注意您的應用可能受到這些平台變更的影響。
電池和記憶體
Android N 包括旨在延長裝置電池壽命和減少 RAM 使用的系統行為變更。 這些變更可能會影響您的應用訪問系統資源,以及您的系統通過特定隱式 Intent 與其他應用互動的方式。
低電耗模式
Android 6.0(API 層級 23)引入了低電耗模式,當使用者裝置未插接電源、處於靜止狀態且螢幕關閉時,該模式會延遲 CPU 和網路活動,從而延長電池壽命。而 Android N 則通過在裝置未插接電源且螢幕關閉狀態下、但不一定要處於靜止狀態(例如使用者外出時把手持式裝置裝在口袋裡)時應用部分 CPU 和網路限制,進一步增強了低電耗模式。
圖 1. 低電耗模式如何應用第一級系統活動限制以延長電池壽命的圖示。
當裝置處於充電狀態且螢幕已關閉一定時間後,裝置會進入低電耗模式並應用第一部分限制: 關閉應用網路訪問、延遲作業和同步。 如果進入低電耗模式後裝置處於靜止狀態達到一定時間,系統則會對 PowerManager.WakeLock
、AlarmManager
鬧鈴、GPS 和 Wi-Fi 掃描應用餘下的低電耗模式限制。 無論是應用部分還是全部低電耗模式限制,系統都會喚醒裝置以提供簡短的維護時間視窗,在此視窗期間,應用程式可以訪問網路並執行任何被延遲的作業/同步。
圖 2. 低電耗模式如何在裝置處於靜止狀態達到一定時間後應用第二級系統活動限制的圖示。
請注意,啟用螢幕或插接裝置電源時,系統將退出低電耗模式並取消這些處理限制。 此項新增的行為不會影響有關使您的應用適應 Android 6.0(API 層級 23)中所推出的舊版本低電耗模式的建議和最佳實務,如低電耗模式和應用待機模式最佳化中所討論。 您仍應遵循這些建議(例如使用 Google Cloud Messaging (GCM) 發送和接收訊息)並開始安排更新計劃以適應新增的低電耗模式行為。
Project Svelte:後台最佳化
Android N 刪除了三項隱式廣播,以協助最佳化記憶體使用量和電量消耗。 此項變更很有必要,因為隱式廣播會在後台頻繁啟動登入偵聽這些廣播的應用。 刪除這些廣播可以顯著提升裝置效能和使用者體驗。
行動裝置會經曆頻繁的串連變更,例如在 Wi-Fi 和移動資料之間切換時。 目前,可以通過在應用清單中註冊一個接收器來偵聽隱式CONNECTIVITY_ACTION
廣播,讓應用能夠監控這些變更。 由於很多應用會註冊接收此廣播,因此單次網路切換即會導致所有應用被喚醒並同時處理此廣播。
同理,應用可以註冊接收來自其他應用(例如相機)的隱式 ACTION_NEW_PICTURE
和 ACTION_NEW_VIDEO
廣播。 當使用者使用相機應用拍攝照片時,這些應用即會被喚醒以處理廣播。
為緩解這些問題,Android N 應用了以下最佳化措施:
- 面向 Android N 開發的應用不會收到
CONNECTIVITY_ACTION
廣播,即使它們已有清單條目來請求接受這些事件的通知。 在前台啟動並執行應用如果使用BroadcastReceiver
請求接收通知,則仍可以在主線程中偵聽 CONNECTIVITY_CHANGE
。
- 應用無法發送或接收
ACTION_NEW_PICTURE
或 ACTION_NEW_VIDEO
廣播。此項最佳化會影響所有應用,而不僅僅是面向 Android N 的應用。
如果您的應用使用任何 Intent,您仍需要儘快移除它們的依賴關係,以正確適配 Android N 裝置。 Android 架構提供多個解決方案來緩解對這些隱式廣播的需求。 例如,JobScheduler
API 提供了一個穩健可靠的機制來安排滿足指定條件(例如連入無限流量網路)時所執行的網路操作。 您甚至可以使用JobScheduler
來適應內容提供者變化。
如需瞭解有關 Android N 中後台最佳化以及如何改寫應用的詳細資料,請參閱後台最佳化。
許可權更改
Android N 做了一些許可權更改,這些更改可能會影響您的應用。
系統許可權更改
為了提高私人檔案的安全性,面向 Android N 或更高版本的應用私人目錄被限制訪問 (0700
)。 此設定可防止私人檔案的中繼資料泄漏,如它們的大小或存在。 此許可權更改有多重副作用:
應用間共用檔案
對於面向 Android N 的應用,Android 架構執行的 StrictMode
API 政策禁止向您的應用外公開 file://
URI。 如果一項包含檔案 URI 的 Intent 離開您的應用,應用失敗,並出現 FileUriExposedException
異常。
若要在應用間共用檔案,您應發送一項 content://
URI,並授予 URI 臨時存取權限。 進行此授權的最簡單方式是使用 FileProvider
類。 如需有關許可權和共用檔案的更多資訊,請參閱共用檔案。
無障礙改進
為提高平台對於視力不佳或視力受損使用者的可用性,Android N 做出了一些更改。這些更改一般並不要求更改您的應用代碼,不過您應仔細檢查並使用您的應用測試這些功能,以評估它們對使用者體驗的潛在影響。
螢幕縮放
Android N 支援使用者佈建顯示尺寸,以放大或縮小螢幕上的所有元素,從而提升裝置對視力不佳使用者的可訪問性。使用者無法將螢幕縮放至低於最小螢幕寬度 sw320dp,該寬度是 Nexus 4 的寬度,也是常規中等大小手機的寬度。
圖 3. 右側螢幕顯示的是一台運行 Android N 系統映像的裝置增大顯示尺寸後的效果。
當裝置密度發生更改時,系統會以如下方式通知正在啟動並執行應用:
- 如果是面向 API 層級 23 或更低版本系統的應用,系統會自動終止其所有後台進程。 這意味著如果使用者切換離開此類應用,轉而開啟“Settings”螢幕並更改 Display size 設定,則系統會像處理記憶體不足的情況一樣終止該應用。 如果應用具有任何前台進程,則系統會如處理運行時變更中所述將配置變更通知給這些進程,就像對待裝置螢幕方向變更一樣。
- 如果是面向 Android N 的應用,則其所有進程(前台和後台)都會收到有關配置變更的通知,如處理運行時變更中所述。
大多數應用並不需要進行任何更改即可支援此功能,不過前提是這些應用遵循 Android 最佳實務。具體要檢查的事項:
設定嚮導中的視覺設定
Android N 在“Welcome”螢幕中加入了“Vision Settings”,使用者可以在新裝置上設定以下無障礙功能設定: Magnification gesture、Font size、Display size 和 TalkBack。 此項變更增強了與不同螢幕設定相關的錯誤的可見度。 要評估此功能的影響,您應在啟用這些設定的狀態下測試應用。 您可以在Settings > Accessibility 中找到這些設定。
NDK 應用連結至平台庫
Android N 做了一些命名空間更改,以阻止載入非公開 API。 如果您使用 NDK,則只能使用 Android 平台提供的公開 API。 在下一個官方發布的 Android 版本上使用非公開 API 會導致應用崩潰。
為提醒您使用了非公開 API,在 Android N 裝置上啟動並執行應用會在有應用調用非公開 API 時在日誌訊息輸出中產生一個錯誤。 此錯誤還會作為訊息顯示在裝置螢幕上,以協助增強您對此情況的認識。 您應檢查應用代碼以刪除使用非公開平台 API,並使用預覽版裝置或模擬器全面測試應用。
如果您的應用依賴平台庫,則請參見 NDK 文檔,瞭解使用公開 API 等效項替換普通私人 API 的典型修複。 您還可以連結至平台庫,而無需實現此應用,如果應用使用的庫是平台的一部分(例如 libpng
),但不屬於 NDK,則更可如此。 此情況下,請確保您的 APK 包含您打算連結到的所有 .so 檔案。
注意:有些第三方庫可能會連結至非公開 API。 如果您的應用使用這些庫,那麼當您的應用在下一個官方發布的 Android 版本上運行時可能會出現崩潰現象。
應用不應依賴或使用不屬於 NDK 的原生庫,因為這些庫可能會發生更改或從一個 Android 版本遷移至另一版本。 例如,從 OpenSSL 切換至 BoringSSL 即屬於此類更改。 此外,不同的裝置可能提供不同層級的相容性,因為不屬於 NDK 中的平台庫沒有相容性要求。 如果您必須在較舊裝置上訪問非 NDK 庫,則請依據 Android API 層級進行載入。
為協助您診斷此類問題,下面列舉了一些在您試圖使用 Android N 開發應用時可能遇到的 Java 和 NDK 錯誤:
Java 錯誤樣本:
java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so" is not accessible for the namespace "classloader-namespace"
NDK 錯誤樣本:
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
以下是遇到這類錯誤的應用的一些典型修複:
Android for Work
Android N 包含一些針對面向 Android for Work 的應用的變更,包括對認證安裝、密碼重設、二級使用者管理、裝置標識符存取權限的變更。如果您是要針對 Android for Work 環境開發應用,則應仔細檢查這些變更並相應地修改您的應用。
- 您必須先安裝授權認證安裝程式,然後 DPC 才能對其進行設定。 對於面向 N SDK 的設定檔和裝置所有者應用,您應在裝置策略控制器 (DPC) 調用
DevicePolicyManager.setCertInstallerPackage()
之前安裝授權認證安裝程式。 如果尚未安裝此安裝程式,則系統會引發IllegalArgumentException
。
- 針對裝置管理員的重設密碼限制現在也適用於設定檔所有者。 裝置管理員無法再使用
DevicePolicyManager.resetPassword()
來清除或更改已經設定的密碼。 裝置管理員仍可以設定密碼,但只能在裝置沒有密碼、PIN 或圖案時這樣做。
- 即使設定了限制,裝置所有者和設定檔所有者仍可以管理帳戶。而且,即使具有
DISALLOW_MODIFY_ACCOUNTS
使用者限制,裝置所有者和設定檔所有者仍可調用 Account Management API。
- 裝置所有者可以更輕鬆地管理二級使用者。當裝置在裝置所有者模式下運行時,系統將自動化佈建
DISALLOW_ADD_USER
限制。 這樣可以防止使用者建立非託管二級使用者。 此外,CreateUser()
和 createAndInitializeUser()
方法已棄用,取而代之的是DevicePolicyManager.createAndManageUser()
方法。
- 裝置所有者可以訪問裝置標識符。裝置所有者可以使用
DevicePolicyManagewr.getWifiMacAddress()
訪問裝置的 Wi-Fi MAC 位址。 如果裝置上從未啟用 Wi-Fi,則此方法將返回一個 null
值。
- 工作模式設定控制工作應用訪問。當工作模式關閉時,系統啟動器通過使工作應用顯示為灰色來指示它們不可用。 啟用工作模式會再次恢複正常行為。
如需瞭解有關 Android N 中針對 Android for Work 所做變更的詳細資料,請參閱 Android for Work 更新。
註解保留
Android N 在註解可見度被忽略時修複錯誤。這種問題將啟用本不應被允許的運行時訪問註解。 這些註解包括:
VISIBILITY_BUILD
:僅應編譯時間可見。
VISIBILITY_SYSTEM
:運行時應可見,但僅限基本系統。
如果您的應用依賴這種行為,請在註解中添加一項運行時必須可用的保留政策。 您可通過使用 @Retention(RetentionPolicy.RUNTIME)
來如此做。
其他重要說明
Android7.0 之 行為變更