Android N:開發者應注意什么?

Android 6.0這個棉花糖可能很多人還沒嘗到呢,但不管怎樣,Android N還是要來了。


Android N發布時間線
Android N發布時間線

新的Android系統帶來了很多新特性:

  • 多窗口支持
  • 通知欄直接回復
  • 通知分組
  • Doze模式2.0

在關注這些新特性的同時,作為開發者,我們更應該注意新的是Android N給開發者帶來了哪些改變?本文就給開發者朋友們講述下我們應該注意什么(本文主要內容譯自Behavior Changes一文,但還有很多筆者自己的理解)。

Doze

其實Doze模式在6.0就引入了,在Android 6.0系統的手機上,如果用戶拔掉電源,在關閉手機屏幕并且不動的一段時間后,系統便會進入Doze模式。此時,手機通過延緩CPU和網絡活動減少電量的消耗。在Android N上,Doze模式的功能更加強大,在你拔掉電源關閉手機屏幕后,即使你的手機在“運動”,比如在你的口袋里隨你一起搖擺,它也會進入Doze模式。

Doze模式的第一階段

Doze模式的第一階段:手機在非充電狀態下鎖屏一定時間后,Doze模式就開始工作了,它控制手機不再讓你的app訪問網絡,推遲異步和同步任務的執行。如果手機在維持第一階段一定時間后,Doze就升級到第二階段,此時系統開始限制GPS使用、WI-FI掃描甚至還有WakeLock以及AlarManager

Doze第二階段

不過在Doze模式下手機也并非完全不工作,在特定的維護窗口期(maintenance windows),不管是在Doze的第一階段還是第二階段,系統將允許app訪問網絡并執行被推遲的異步或同步任務,但是這個窗口期很短暫。
注意,手機在屏幕點亮或者是插上電源時就會退出Doze模式,當然之前的限制也就不復存在了。那Doze模式中,app如何工作呢,假如我們的app是即時通信的應用,你把我網斷了,那消息如何及時送達?針對該問題,Google給了解決方案:那就是集成GCM,GCM針對Doze和stand by模式做了優化,即使手機處于這兩種模式下,GCM仍然可以保證消息到達,這樣你就可以激活App了。但是,天朝的開發者怎么辦,GCM在我大天朝完全不靠譜呀!這時,作為開發者,我們就不得不考慮其他方式了,比如在自身的推送上增加第三方推送,Github上有個關于第三方推送集成的issue,有興趣的可以看下。通過討論區的留言可以看出大家統一的方案便是自身Push通道+第三方推送+小米Push+華為Push。
在我看來小米Push必須要接入的,有兩個原因:

  • 1、小米手機用戶量很大(畢竟國內出貨量第一呀!);
  • 2、小米的一鍵清理太強大,可以殺掉所有app相關的進程(就算你是前臺Service也是照殺不誤)。

為了保證小米手機上用戶能夠及時收到消息,它自家的Push必須要接入呀,就算以后7.0 Doze 2.0閃亮登場,小米Push應該也能保證推送消息在小米手機上的正常到達吧。
同樣,基于同樣的原因,華為Push也要考慮集成,這樣至少可以保證華為手機用戶可以及時收到消息了(不知道是不是我打開的姿勢不對,華為Push的Demo在我的三星手機上通知欄推送就是無法彈出通知欄)。所以針對小米Push和華為Push,開發者在集成時還是要考慮到Rom的過濾,比如只在MIUI上開啟小米Push,而只有在華為的EMUI上才打開華為Push,其它手機廠商還是以自身Push通道為主。哎,我天朝的開發者就是悲催呀,不知道是不是以后三星、聯想、魅族、HTC等等一眾手機廠商都會給出自家的Push方案,或者針對Android的Doze給出解決方案,否則開發者的日子還怎么過呀......

工程瘦身:后臺優化

為了優化內存使用和電量的消耗,Android N去掉了三個隱式的廣播。這個改變對用戶來說絕對一大利好,因為后臺注冊這些廣播的app在后臺會經常被拉起,自然而然會影響到設備性能進而影響用戶體驗(很不幸,對開發者來講,又有一些trick被限制了)。比如CONNECTIVITY_ACTION,在N之前的系統中,注冊該廣播的app在網絡連接有變動時都會收到系統發出的廣播,這樣主進程被kill的app就可以復活了。此外還有ACTION_NEW_PICTURE
ACTION_NEW_VIDEO
對于這三個廣播,Android N具體做了如下的優化:

  • CONNECTIVITY_ACTION:targetSdk為Android N的app如果在后臺就無法收到該廣播,即使你在manifest中做了相應配置,但如果app在前臺,依然還是可以收到。
  • ACTION_NEW_PICTURECONNECTIVITY_ACTION:這兩個廣播的優化會影響所有app,只要你的app運行在Android N系統的手機上,不管targetSdk是不是Android N,都會受到限制。

權限變更

Android N權限變化主要在于文件系統權限的更改,此外還有一個權限被廢棄--GET_ACCOUNTS,在targetSdk為N的app中,系統將忽略GET_ACCOUNTS的請求,這里主要說下文件系統權限。

文件系統權限的變化

為了提高私有文件的安全性,在targetSdk版本為N或者以后版本的app中,其私有目錄將會限制訪問。這可以防止私有文件元數據的泄露,比如文件大小或者是文件是否存在。但這給開發者帶來了很多不利的影響:

  • 文件的owner不能放寬文件權限,如果你使用MODE_WORLD_READABLE
    或者 MODE_WORLD_WRITEABLE操作文件,將會觸發SecurityException
  • 當你跨package域傳遞file://的URI時,接收者得到的將是一個無權訪問的路徑,因此,這將會觸發FileUriExposedException。對于這類操作,官方推薦的方式是使用FileProvider,當然你也可以使用ContentProvider
    這里只看文字理解起來可能有點小困難,所以我將以調用系統拍照為例說明下:
    在targetSdk為Android N之前的系統版本時,你可以使用如下方法調用系統相機拍照并存入指定路徑中。
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri uri = Uri.fromFile(sdcardTempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

但是當你將targetSdk設置為Android N時,很不幸,在執行到這段代碼時app就crash了,crash的原因便是FileUriExposedException。OK,把代碼修改下,使用ContentProvider方式傳遞uri,這樣在Android N上便可以正常運行了。

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
ContentValues contentValues = new ContentValues(1);
contentValues.put(MediaStore.Images.Media.DATA, sdcardTempFile.getAbsolutePath());
Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);

輔助功能改進

Android N針對低視力或弱視用戶做了一些改進,雖然這些改變不需要開發者修改app的代碼,但開發者仍然需要查看這些特性并進行測試,從而評估這些更改對用戶體驗帶來的潛在影響。

屏幕縮放

Android N允許用戶縮放屏幕上的所有元素,從而提高對視力不佳的用戶的設備可用性,但是用戶不能縮放到寬度小于sw320dp,這是Nexus 4手機的寬度,也是常見的中型手機尺寸。

NDK Apps Linking to Platform Libraries

這里實在是不知道如何翻譯了,就直接用英文標題吧
Android N對native方法的使用作出了嚴格的限制,namespace的改變將阻止使用非公有(non-pulic)的c/c++ API,因此你的native代碼就只能使用android平臺提供的共有API,在Android N的正式版中使用non-public的API會導致app crash。
為了警告你使用了non-public的API,運行在Android N設備上的app在調用non-public的API時,logcat會打出error信息,這條錯誤信息同時也會顯示在屏幕上,以幫助提高對這種情況的認知。開發者應該認真檢查native代碼以確保移除了non-public API的調用,然后在Android N的設備或模擬器上進行徹底的測試。
如果你的app依賴了平臺庫,請查閱典型修復的NDK文檔,然后用相應的公共API替換掉私有API。你也有可能鏈接到了平臺庫但是沒有意識到這一點,尤其是你的app使用到的庫一部分是平臺庫,但卻不是NDK的一部分。

注意: 一些第三方庫可能使用了non-public API. 如果你的app用到了這些第三方庫, 那么在Android N正式設備運行時你的app將有可能會crash.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容