目前谷歌已經放出了Android O(8.0)的預覽版厌衙,但很多app并沒有使用6.0以來的新特性畦木。下面就結合官方文檔和自己工作中需要的一些問題兜粘,簡單總結了下申窘,在對您的應用進行針對target23以其以上重構時,需要注意和兼容的問題孔轴。
一剃法,低耗電模式。
Android 6.0(API 級別 23)引入了低電耗模式路鹰,當用戶設備未插接電源贷洲、處于靜止狀態(tài)且屏幕關閉時收厨,該模式會推遲 CPU 和網絡活動,從而延長電池壽命优构。而 Android 7.0 則通過在設備未插接電源且屏幕關閉狀態(tài)下诵叁、但不一定要處于靜止狀態(tài)(例如用戶外出時把手持式設備裝在口袋里)時應用部分 CPU 和網絡限制,進一步增強了低電耗模式钦椭。
A.網絡訪問的限制
在涉及到網絡訪問拧额,特別時后臺訪問網絡的,需要測試下彪腔,在低耗電模式下势腮,應用是否執(zhí)行正常,會不會anr或者崩潰
B.后臺喚醒機制
即對齊喚醒漫仆,主要涉及到的是WakeLockAlarm捎拯,后臺的一些定時服務,可能會不準
二盲厌,后臺優(yōu)化
Android 7.0移除了三項隱式廣播署照,以幫助優(yōu)化內存使用和電量消耗。此項變更很有必要吗浩,因為隱式廣播會在后臺頻繁啟動已注冊偵聽這些廣播的應用建芙。刪除這些廣播可以顯著提升設備性能和用戶體驗。
A. CONNECTIVITY_ACTION
面向 Android 7.0 開發(fā)的應用不會收到CONNECTIVITY_ACTION廣播懂扼,即使它們已有清單條目來請求接受這些事件的通知禁荸。在前臺運行的應用如果使用BroadcastReceiver請求接收通知,則仍可以在主線程中偵聽CONNECTIVITY_CHANGE阀湿。
B. ACTION_NEW_PICTURE
C. ACTION_NEW_VIDEO
應用無法發(fā)送或接收ACTION_NEW_PICTURE或ACTION_NEW_VIDEO廣播赶熟。此項優(yōu)化會影響所有應用,而不僅僅是面向 Android 7.0 的應用陷嘴。
三映砖,權限更改
A.私有文件的文件權限不應再由所有者放寬,為使用MODE_WORLD_READABLE和/或MODE_WORLD_WRITEABLE而進行的此類嘗試將觸發(fā)SecurityException灾挨。
B.當你跨package域傳遞file://的URI時邑退,接收者得到的將是一個無權訪問的路徑,將會觸發(fā)FileUriExposedException劳澄。官方推薦的方式是使用FileProvider地技,也可以使用ContentProvider
Eg:調用系統(tǒng)相機拍照并存入指定路徑中
Api24之前,可以這樣
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Uri uri = Uri.fromFile(sdcardTempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
Target=24時秒拔,會報crash FileUriExposedException
Target24上的正確方法是:
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);
或者使用FileProvider方式
這塊兒莫矗,分享模塊或者其他有 調起三方應用并給其傳遞我們應用理解的圖片等文件資源的話,會存在這個問題。這塊兒有個帖子寫到了他們的解決辦法
http://www.reibang.com/p/68a4e8132fcd
四趣苏,屏幕縮放
Android 7.0 支持用戶設置顯示尺寸,以放大或縮小屏幕上的所有元素梯轻,從而提升設備對視力不佳用戶的可訪問性食磕。用戶無法將屏幕縮放至低于最小屏幕寬度
在android N上,Setting多了一個Display size設置喳挑,更改這個屬性彬伦,系統(tǒng)會以如下方式通知正在運行的應用:
A.如果是面向API級別23或更低版本系統(tǒng)的應用,系統(tǒng)會自動終止其所有后臺進程伊诵。這意味著如果用戶切換離開此類應用单绑,轉而打開Settings屏幕并更改Display size設置,則系統(tǒng)會像處理內存不足的情況一樣終止該應用曹宴。如果應用具有任何前臺進程搂橙,則系統(tǒng)會如處理運行時更改中所述將配置變更通知給這些進程,就像對待設備屏幕方向變更一樣笛坦。
B.如果是面向Android 7.0的應用区转,則其所有進程(前臺和后臺)都會收到有關配置變更的通知
在這里,需要測試這幾個方面的問題:
a.界面顯示問題版扩,既在用戶更改了這個屬性時废离,整個界面元素的大小都會變化,需要測試此時我們的界面是否ok
b.當設備配置發(fā)生變更時礁芦,更新任何與密度相關的緩存信息
五蜻韭,NDK應用鏈接至平臺庫
從 Android 7.0 開始,系統(tǒng)將阻止應用動態(tài)鏈接非公開 NDK 庫柿扣,這種庫可能會導致您的應用崩潰肖方。
即使您的代碼可能不會鏈接私有庫,但您的應用中的第三方靜態(tài)庫可能會這么做未状。因此窥妇,所有開發(fā)者都應進行相應檢查,確保他們的應用不會在運行 Android 7.0 的設備上崩潰娩践。
Logcat會給我們一些提示活翩。
應用面向 API 級別 24 或更高級別,logcat 會生成以下運行時錯誤翻伺,您的應用可能會崩潰:
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)
利用 Android 7.0DK 中的 readelf 工具材泄,您可以通過運行以下命令生成給定.so文件的所有動態(tài)鏈接的共享庫列表:
aarch64-linux-android-readelf -dW libMyLibrary.so
六,Android for Work
可以使用DevicePolicyManagewr.getWifiMacAddress()訪問設備的 WLAN MAC 地址吨岭。如果設備上從未啟用 WLAN拉宗,則此方法將返回一個null值。
七,權限旦事,重要的權限需要授權魁巩。
網上很多開源的授權工具類,例如這個
八姐浮,其他
懸浮窗授權谷遂。 很多時候程序里面有在當前界面彈出一個授權窗口,引導用戶去授權或者開啟輔助選項等卖鲤。在api24上肾扰,需要對在當前頁面彈窗這一動作授權
Note:If the app targets API level 23 or higher, the app user must explicitly grant this permission to the app through a permission management screen. The app requests the user's approval by sending an intent with actionACTION_MANAGE_OVERLAY_PERMISSION. The app can check whether it has this authorization by callingSettings.canDrawOverlays().
Constant Value: "Android.permission.SYSTEM_ALERT_WINDOW"
代碼如下:
if?(Build.VERSION.SDK_INT?>=?23)?{
if(!Settings.canDrawOverlays(getApplicationContext()))?{
//啟動Activity讓用戶授權
Intent?intent?=?new?Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(intent);
return;
}?else?{
//執(zhí)行6.0以上繪制代碼
}
}?else?{
//執(zhí)行6.0以下繪制代碼
}