Android7.0 之 行為變更

來源:互聯網
上載者:User

標籤:本地   儲存   限制   軟體包   odi   start   條件   dir   -name   

我只是Google的搬運工......

行為變更本文內容
  1. 效能提升
    1. 低電耗模式
    2. 後台最佳化
  2. 許可權更改
  3. 應用間共用檔案
  4. 無障礙改進
    1. 螢幕縮放
    2. 設定嚮導中的視覺設定
  5. NDK 應用連結至平台庫
  6. Android for Work
  7. 註解保留
  8. 其他重要說明
另請參閱
  1. Android N API 概覽

Android N 除了提供諸多新特性和功能外,還對系統和 API 行為做出了各種變更。 本文重點介紹您應該瞭解並在開發應用時加以考慮的一些重要變更。

如果您之前發布過 Android 應用,請注意您的應用可能受到這些平台變更的影響。

電池和記憶體

Android N 包括旨在延長裝置電池壽命和減少 RAM 使用的系統行為變更。 這些變更可能會影響您的應用訪問系統資源,以及您的系統通過特定隱式 Intent 與其他應用互動的方式。

低電耗模式

Android 6.0(API 層級 23)引入了低電耗模式,當使用者裝置未插接電源、處於靜止狀態且螢幕關閉時,該模式會延遲 CPU 和網路活動,從而延長電池壽命。而 Android N 則通過在裝置未插接電源且螢幕關閉狀態下、但不一定要處於靜止狀態(例如使用者外出時把手持式裝置裝在口袋裡)時應用部分 CPU 和網路限制,進一步增強了低電耗模式。



圖 1. 低電耗模式如何應用第一級系統活動限制以延長電池壽命的圖示。


當裝置處於充電狀態且螢幕已關閉一定時間後,裝置會進入低電耗模式並應用第一部分限制: 關閉應用網路訪問、延遲作業和同步。 如果進入低電耗模式後裝置處於靜止狀態達到一定時間,系統則會對 PowerManager.WakeLockAlarmManager 鬧鈴、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)。 此設定可防止私人檔案的中繼資料泄漏,如它們的大小或存在。 此許可權更改有多重副作用:

  • 私人檔案的檔案許可權不應再由所有者放寬,為使用 MODE_WORLD_READABLE 和/或 MODE_WORLD_WRITEABLE 而進行的此類嘗試將觸發SecurityException

    註:迄今為止,這種限制尚不能完全執行。 應用仍可能使用原生 API 或 File API 來修改它們的私人目錄許可權。 但是,我們強烈反對放寬私人目錄的許可權。

  • 傳遞軟體包網域外的 file:// URI 可能給接收器留下無法訪問的路徑。 因此,嘗試傳遞 file:// URI 會觸發 FileUriExposedException。 分享私人檔案內容的推薦方法是使用 FileProvider
  • DownloadManager 不再按檔案名稱分享私人儲存的檔案。 舊版應用在訪問 COLUMN_LOCAL_FILENAME 時可能出現無法訪問的路徑。 面向 Android N 或更高版本的應用在嘗試訪問 COLUMN_LOCAL_FILENAME 時會觸發 SecurityException。 通過使用DownloadManager.Request.setDestinationInExternalFilesDir() 或DownloadManager.Request.setDestinationInExternalPublicDir() 將下載位置設定為公用位置的舊版應用仍可以訪問COLUMN_LOCAL_FILENAME 中的路徑,但是我們強烈反對使用這種方法。 訪問由 DownloadManager 公開的檔案的首選方式是使用ContentResolver.openFileDescriptor()
應用間共用檔案

對於面向 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 最佳實務。具體要檢查的事項:

  • 在螢幕寬度為 sw320dp 的裝置上測試您的應用,並確保其充分運行。
  • 當裝置配置發生變更時,更新任何與密度相關的緩衝資訊,例如緩衝位元影像或從網路載入的資源。當應用從暫停狀態恢複運行時,檢查配置變更。

    註:如果您要緩衝與配置相關的資料,則最好也包括相關中繼資料,例如該資料對應的螢幕尺寸或像素密度。 儲存這些中繼資料便於您在配置變更後決定是否需要重新整理快取資料。

  • 避免用像素單位指定尺寸,因為像素不會隨螢幕密度縮放。應改為使用與密度無關像素 (dp) 單位指定尺寸。
設定嚮導中的視覺設定

Android N 在“Welcome”螢幕中加入了“Vision Settings”,使用者可以在新裝置上設定以下無障礙功能設定: Magnification gestureFont sizeDisplay 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 ...

以下是遇到這類錯誤的應用的一些典型修複:

  • 可以使用標準 JNI 函數來替代使用 libandroid_runtime.so 中的 getJavaVM 和 getJNIEnv:
    AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h>AndroidRuntime::getJNIEnv -> JavaVM::GetEnv orJavaVM::AttachCurrentThread from <jni.h>.
  • 可以使用公開 alternative __system_property_get 來替代使用 libcutils.so 中的 property_get 符號。如需這樣做,請使用__system_property_get 及以下 include 函數:
    #include <sys/system_properties.h>
  • 應使用應用本地版本來替代使用 libcrypto.so 中的 SSL_ctrl 符號。例如,您應在 .so 檔案中靜態連結 libcyrpto.a,或者在應用中包含您自己的來自 BoringSSL 或 OpenSSL 的動態 libcrypto.so
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) 來如此做。

其他重要說明
  • 如果一個應用在 Android N 上運行,但卻是針對更低 API 層級開發的,那麼在使用者更改顯示尺寸時,系統將終止此應用進程。 應用必須能夠正常處理此情景。 否則,當使用者從最近使用記錄中恢複運行應用時,應用將會出現崩潰現象。

    您應測試應用以確保不會發生此行為。要進行此測試,您可以通過 DDMS 手動終止應用,以造成相同的崩潰現象。

    在密度發生更改時,系統不會自動終止面向 N 及更高版本的應用;不過,這些應用仍可能對配置變更做出不良響應。

  • Android N 上的應用應能夠正常處理配置變更,並且在後續啟動時不會出現崩潰現象。您可以通過更改字型大小 (Setting > Display > Font size) 並隨後從最近使用記錄中恢複運行應用,來驗證應用行為。
  • 由於之前的 Android 版本中的一項錯誤,系統未能將對主線程上的一個 TCP 通訊端的寫入操作舉報為嚴格模式違反。 Android N 修複了此錯誤。呈現出這種行為的應用引發 android.os.NetworkOnMainThreadException。一般情況下,我們不建議在主線程上執行網路操作,因為這些操作通常都有可能導致 ANR 和卡頓的高尾延遲。
  • Debug.startMethodTracing() 方法族現在預設在您的共用的儲存空間上的軟體包特定目錄中儲存輸出,而非 SD 記憶卡頂級。 這意味著應用不再需要請求 WRITE_EXTERNAL_STORAGE 使用這些 API 的許可權。
  • 許多平台 API 現在開始檢查在 Binder 事務間發送的大負載,系統現在會將 TransactionTooLargeExceptions 再次作為 RuntimeExceptions 引發,而不再只是默默記錄或抑制它們。 一個常見例子是在 Activity.onSaveInstanceState() 上儲存過多資料,導致 ActivityThread.StopInfo在您的應用面向 Android N 時引發 RuntimeException
  • 如果應用向 View 發布 Runnable 任務,並且 View 未附加到視窗,系統會用 View 為 Runnable 任務排隊;在 View 附加到視窗之前,Runnable 任務不會執行。 此行為會修複以下錯誤:
    • 如果一項應用是從並非預期視窗 UI 線程的其他線程發布到 View,則Runnable 可能會因此運行錯誤的線程。
    • 如果 Runnable 任務是從並非環路線程的其他線程發布,則應用可能會曝光 Runnable 任務。
  • 如果 Android N 上一項有 DELETE_PACKAGES 許可權的應用嘗試刪除一個軟體包,但另一項應用已經安裝了這個軟體包,則系統可能要求使用者確認。 在這種情況下,應用在調用 PackageInstaller.uninstall() 時的返回狀態應為 STATUS_PENDING_USER_ACTION

Android7.0 之 行為變更

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.