page.title=行為變更 page.keywords=預覽版,sdk,相容性 sdk.platform.apiLevel=MNC @jd:body

本文件內容

  1. 執行階段權限
  2. 省電最佳化
    1. 休眠
    2. 應用程式待命
  3. 可採用的儲存裝置
  4. 移除 Apache HTTP 用戶端
  5. AudioManager 變更
  6. 文字選取
  7. Android 金鑰存放區變更
  8. Wi-Fi 和網路變更
  9. 相機服務變更
  10. ART 執行階段
  11. APK 驗證
  12. Android for Work 變更

API 差異

  1. API 級別 22 到 M 預覽版»

另請參閱

  1. M 開發人員預覽版 API 總覽

除了新特性和功能以外,M 開發人員預覽版還包含各種不同的系統變更和 API 行為變更。 本文件將強調說明一些您應該知道且在您的應用程式中加以考量的重要變更。

如果您先前曾發行過適用於 Android 的應用程式,請注意,您的應用程式可能會受到平台中的這類變更所影響。

執行階段權限

這個預覽版引進了新的權限模型,使用者現在可以在執行階段直接管理應用程式權限。 這個模型為使用者提供了改良的能見度並使其可完全控制權限,同時為應用程式開發人員提供更流暢的安裝和自動更新程序。使用者可以針對安裝的應用程式個別授與或撤銷權限。

在目標為 M 預覽版的應用程式中,請務必在執行階段檢查並要求權限。 如要判斷您的應用程式是否已獲授與權限,請呼叫新的 {@code Context.checkSelfPermission()} 方法。 如要要求權限,請呼叫新的 {@code Activity.requestPermission()} 方法。即使您的應用程式目標不是 M,還是應該在新的權限模型下測試您的應用程式。

如需在您的應用程式中支援新權限模型的詳細資訊,請參閱權限開發人員預覽版頁面。 如需評估對您應用程式的影響的祕訣,請參閱測試指南

省電最佳化

這個預覽版針對閒置的裝置和應用程式引進了新的省電最佳化功能。

休眠

如果拔除裝置電源並關閉螢幕使其保持靜止狀態一段時間,該裝置即會進入「休眠」模式,它會嘗試讓系統保持睡眠狀態。 在此模式中,裝置會在短期間內定期繼續執行正常操作,因此,會進行應用程式同步處理,而系統可以執行任何待處理的操作。

處於休眠狀態時,下列限制會套用到您的應用程式:

當裝置離開休眠狀態時,就會執行所有待處理的工作和同步處理。

您可以測試此功能,方法是將執行 M 預覽版的裝置連接到您的開發電腦並呼叫下列命令:

$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step
$ adb shell dumpsys deviceidle -h

注意:即將發行的 Google 雲端通訊版本讓您能夠指定高優先順序的訊息。 如果您的應用程式收到高優先順序的 GCM 訊息,即使裝置處於休眠狀態,系統還是會授與它短暫的網路存取權限。

如需如何在您的應用程式中測試休眠的祕訣,請參閱測試指南

應用程式待命

使用這個預覽版時,系統可在應用程式處於未使用狀態時,判斷它們是否處於閒置狀態。 除非系統偵測到以下任一個訊號,否則會在一段時間之後將應用程式視為閒置:

如果拔除了裝置電源,即會停用被視為閒置之應用程式的網路存取,並擱置它們的同步處理和工作。 為裝置插上電源時,就允許這些應用程式進行網路存取,且可執行所有已擱置的工作和同步處理。 如果裝置長時間處於閒置狀態,則允許閒置的應用程式進行網路存取,大約是一天一次。

您可以測試此功能,方法是將執行 M 預覽版的裝置連接到您的開發電腦並呼叫下列命令:

$ adb shell dumpsys battery unplug
$ adb shell am set-idle <packageName> true
$ adb shell am set-idle <packageName> false
$ adb shell am get-idle <packageName>

注意:即將發行的 Google 雲端通訊 (GCM) 版本讓您能夠指定高優先順序的訊息。 如果您的應用程式收到高優先順序的 GCM 訊息,即使應用程式處於閒置狀態,系統還是會授與它短暫的網路存取權限。

如需如何在您的應用程式中測試應用程式待命的祕訣,請參閱測試指南

可採用的儲存裝置

使用這個預覽版時,使用者可以採用像是 SD 卡的外部儲存裝置。採用外部儲存裝置會加密並格式化裝置,使其可如內部儲存空間般運作。 此功能讓使用者能夠在儲存裝置之間移動應用程式和這些應用程式的私人資料。 移動應用程式時,系統會採用宣示說明中的 {@code android:installLocation} 偏好設定。

如果您的應用程式會存取下列 API 或欄位,請注意,在內部和外部儲存裝置之間移動應用程式時,它們傳回的檔案路徑將會動態變更。建置檔案路徑時,強烈建議您一律動態呼叫這些 API。請勿使用硬式編碼的檔案路徑或保留先前建置的完整檔案路徑。

如要在開發人員預覽版中對此功能進行偵錯,您可以執行下列命令來採用 USB 磁碟機 (這個磁碟機是透過 USB On-The-Go (OTG) 纜線連接到 Android 裝置):

$ adb shell sm set-force-adoptable true

移除 Apache HTTP 用戶端

這個預覽版已移除對於 Apache HTTP 用戶端的支援。如果您的應用程式正在使用這個用戶端且目標為 Android 2.3 (API 級別 9) 或更高版本,請改為使用 {@link java.net.HttpURLConnection} 類別。 這個 API 的效率更高,因為它能透過透明的壓縮和回應快取來降低網路使用量,並將電源耗用量降至最低。 如要繼續使用 Apache HTTP API,您必須先在 {@code build.gradle} 檔案中宣告下列編譯時期的相依性:

android {
    useLibrary 'org.apache.http.legacy'
}

Android 正從 OpenSSL 移至 BoringSSL 程式庫。 如果您正在應用程式中使用 Android NDK,請勿連結不屬於 NDK API 一部分的密碼編譯程式庫,例如 {@code libcrypto.so} 和 {@code libssl.so}。 這些程式庫不是公用 API,而且可能在沒有通知的情況下,在新的版本和裝置上變更或終止支援。此外,您可能會讓自己暴露於安全性弱點中。 因此,請改為修改您的原生程式碼,透過 JNI 來呼叫 Java 密碼編譯 API,或以靜態方式連結您選擇的密碼編譯程式庫。

AudioManager 變更

不再支援透過 {@link android.media.AudioManager} 類別直接設定音量或將特定串流設定為靜音。 {@link android.media.AudioManager#setStreamSolo(int,boolean) setStreamSolo()} 方法已過時,您應該改為呼叫 {@code AudioManager.requestAudioFocus()} 方法。同樣地, {@link android.media.AudioManager#setStreamMute(int,boolean) setStreamMute()} 方法已過時;請改為呼叫 {@code AudioManager.adjustStreamVolume()} 方法並傳入方向值 {@code ADJUST_MUTE} 或 {@code ADJUST_UNMUTE}。

文字選取

當使用者在您的應用程式中選取文字時,您現在可以在浮動工具列中顯示文字選取動作,例如,剪下、複製及貼上。 使用者互動實作類似於針對內容關聯動作列所做的實作,如為個別的檢視啟用內容關聯動作模式中所述。

如要實作適用於文字選取的浮動工具列,請在您現有的應用程式中進行下列變更:

  1. 在您的 {@link android.view.View} 或 {@link android.app.Activity} 物件中,將 {@link android.view.ActionMode} 呼叫從 {@code startActionMode(Callback)} 變更為 {@code startActionMode(Callback, ActionMode.TYPE_FLOATING)}。
  2. 進行 {@code ActionMode.Callback} 的現有實作,並改為讓它擴充 {@code ActionMode.Callback2}。
  3. 覆寫 {@code Callback2.onGetContentRect()} 方法,以在檢視中提供內容 {@link android.graphics.Rect} 物件 (例如,文字選取矩形區塊) 的座標。
  4. 如果矩形區塊位置不再有效,而且這是唯一變成無效的元素,請呼叫 {@code ActionMode.invalidateContentRect()} 方法。

如果您正在使用 Android 支援程式庫版本 22.2,請注意,浮動工具列無法向下相容,而且 appcompat 預設會取得 {@link android.view.ActionMode} 物件的完整控制權。 這可防止浮動工具列顯示。如要在 {@link android.support.v7.app.AppCompatActivity} 中啟用 {@link android.view.ActionMode} 支援,請呼叫 {@code android.support.v7.app.AppCompatActivity.getDelegate()},然後在傳回的 {@link android.support.v7.app.AppCompatDelegate} 物件中呼叫 {@code android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled()},並將輸入參數設定為 {@code false}。 這個呼叫會將 {@link android.view.ActionMode} 物件的控制權傳回架構中。 儘管在 M 預覽版之前的裝置中,只支援 {@link android.support.v7.app.ActionBar} 模式,但在執行 M 預覽版的裝置中,允許架構支援 {@link android.support.v7.app.ActionBar} 或浮動工具列模式。

Android 金鑰存放區變更

使用這個預覽版時,Android 金鑰存放區供應程式不再支援 DSA。 但仍支援 ECDSA。

在停用或重設安全鎖定螢幕時 (例如,由使用者或裝置管理員執行),將不再刪除其餘不需加密的金鑰。 在這些事件期間,將會刪除其餘需要加密的金鑰。

Wi-Fi 和網路變更

這個預覽版引進了下列對於 Wi-Fi 和網路 API 的行為變更。

相機服務變更

在這個預覽版中,在相機服務中存取分享資源的模型已經從先前的「先進先服務」存取模型變更為依照優先順序針對處理程序進行處理的存取模型。 對於服務行為的變更如下:

ART 執行階段

ART 執行階段現在可以正確實作 {@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} 方法的存取規則。這個變更會修正 Dalvik 在先前版本中以不正確方式檢查存取規則的問題。如果您的應用程式使用 {@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} 方法且您想要覆寫存取檢查,請搭配已設定為 {@code true} 的輸入參數呼叫 {@link java.lang.reflect.Constructor#setAccessible(boolean) setAccessible()} 方法。 如果您的應用程式使用 v7 appcompat 程式庫v7 recyclerview 程式庫,您就必須更新應用程式來使用這些程式庫的最新版本。 否則,請確定從 XML 參考的所有自訂類別都會更新,如此一來就能存取其類別建構函式。

這個預覽版會更新動態連結器的行為。動態連結器現在瞭解程式庫的 {@code soname} 與其路徑 (公開的 Bug 6670) 之間的差異,而且現在會實作依 {@code soname} 進行搜尋。 先前可運作但含有錯誤 {@code DT_NEEDED} 項目 (通常是組建電腦之檔案系統上的絕對路徑) 的應用程式可能會在載入時失敗。

{@code dlopen(3) RTLD_LOCAL} 旗標現在會以正確的方式實作。請注意, {@code RTLD_LOCAL} 是預設值,因此,對 {@code dlopen(3)} 的呼叫 (不會明確使用 {@code RTLD_LOCAL}) 將會受到影響 (除非您的應用程式明確使用 {@code RTLD_GLOBAL})。使用 {@code RTLD_LOCAL},由後續呼叫 {@code dlopen(3)} (相對於 {@code DT_NEEDED} 項目所參考) 所載入的程式庫將無法使用符號。

APK 驗證

此平台現在會執行較嚴格的 APK 驗證。如果檔案宣告於宣示說明中但未出現在 APK 本身中,則 APK 會被視為毀損。 如果移除了任何內容,就必須重新簽署 APK。

Android for Work 變更

這個預覽版包含下列對於 Android for Work 的行為變更: