Android7.0适配方案
1安裝時(shí)解析錯(cuò)誤
?
我們的App通常會(huì)有檢查更新的功能。用戶在收到提示更新并且下載完后,會(huì)自動(dòng)打開安裝頁(yè)面讓用戶來(lái)去安裝。這時(shí)就會(huì)出現(xiàn)安裝錯(cuò)誤的問題,這類的問題的可能性比較多。比如較低版本的App想要覆蓋已有的較高版本App會(huì)提示安裝未完成,或是簽名不一致導(dǎo)致的。
?
不過7.0上常見的有以下兩種情況。
?
1.應(yīng)用間共享文件
?
在targetSdkVersion大于等于的24的App中,但是我們沒有去適配7.0。那么在調(diào)用安裝頁(yè)面,或修改用戶頭像操作時(shí),就會(huì)失敗。那么就需要你去適配7.0或是將targetSdkVersion改為24以下(不推薦)。
?
適配的方法這里就不細(xì)講,大家可以看看?Android 7.0 行為變更 通過FileProvider在應(yīng)用間共享文件吧?這篇文章。
?
2.APK signature scheme v2
?
Android?7.0 引入一項(xiàng)新的應(yīng)用簽名方案 APK Signature Scheme v2,它能提供更快的應(yīng)用安裝時(shí)間和更多針對(duì)未授權(quán) APK 文件更改的保護(hù)。在默認(rèn)情況下,android?Studio 2.2 和 Android Plugin for Gradle 2.2 會(huì)使用 APK Signature Scheme v2 和傳統(tǒng)簽名方案來(lái)簽署您的應(yīng)用。詳細(xì)看安卓官方說明(https://developer.android.google.cn/about/versions/nougat/android-7.0.html#apk_signature_v2)。
?
簡(jiǎn)單地說就是任何方式的篡改APK 文件,在利用了V2簽名的apk上會(huì)失效。
我所用的Android Studio目前是2.3.3 在?Gradle?2.2.3時(shí)。
?
打包頁(yè)面是這樣
?
?
可以看到默認(rèn)是V1 和V2選中的。
1)只勾選v1簽名就是傳統(tǒng)方案簽署,但是在7.0上不會(huì)使用V2安全的驗(yàn)證方式。?
2)只勾選V2簽名7.0以下會(huì)顯示未安裝,7.0上則會(huì)使用了V2安全的驗(yàn)證方式。?
3)同時(shí)勾選V1和V2則所有版本都沒問題。
?
這里問題就來(lái)了,默認(rèn)全部勾選,按道理所有版本是沒有問題的。
?
那么我們?yōu)槭裁催€是安裝錯(cuò)誤?
?
其實(shí)是因?yàn)槲覀冺?xiàng)目采用了美團(tuán)早期的快速生成渠道包(https://tech.meituan.com/mt-apk-packaging.html)方案。這種方案不適用于V2的簽名方案。(因?yàn)閷?shí)現(xiàn)思路就是給已有的apk文件中添加空的渠道文件)
?
解決辦法:
?
1.如果你的渠道較少,可以用gradle方式的多渠道打包。渠道多的話就不適用了。
?
2.畢竟V2不是強(qiáng)制的,那么我們要用傳統(tǒng)方案簽署,可以打開模塊級(jí)build.gradle?文件,然后將行v2SigningEnabled false添加到您的版本簽名配置中:
?
android {...defaultConfig { ... }signingConfigs {release {storeFile file("myreleasekey.keystore")storePassword "password"keyAlias "MyReleaseKey"keyPassword "password"v2SigningEnabled false //<--這里}}}?
或者將Gradle?升級(jí)為2.3以上。那么打包頁(yè)面是這樣
?
?
我們可以不勾選V2選項(xiàng)。
?
3.前兩種方法是比較快速的可以解決問題,但是一旦這種安全措施被強(qiáng)制(畢竟我們可以感受到安卓在安全方面的努力,比如權(quán)限控制、應(yīng)用間共享文件),我們?cè)趺崔k。
?
其實(shí)美團(tuán)早早發(fā)現(xiàn)了這個(gè)問題,具體看這篇?新一代開源Android渠道包生成工具Walle(https://tech.meituan.com/android-apk-v2-signature-scheme.html)。里面有深度的原理講解,滿滿的干貨。
?
?
2PopupWindow位置不正確
?
7.0系統(tǒng)的手機(jī)上,PopupWindow彈出位置不正確。
?
有兩種可能:
?
1.我們使用了update方法,同時(shí)設(shè)置了Gravity(Gravity.NO_GRAVITY沒事)。因?yàn)樵趗pdate方法中有調(diào)用computeGravity方法去獲取Gravity。(7.0以下沒有獲取Gravity進(jìn)行更新判斷)
?
?
public void update() {// 省略部分代碼final int newGravity = computeGravity();if (newGravity != p.gravity) {p.gravity = newGravity;update = true;}if (update) {setLayoutDirectionFromAnchor();mWindowManager.updateViewLayout(mDecorView, p);}}?
?
Android 7.0 computeGravity方法源碼
?
?
private int computeGravity() {int gravity = Gravity.START | Gravity.TOP;if (mClipToScreen || mClippingEnabled) {gravity |= Gravity.DISPLAY_CLIP_VERTICAL;}return gravity; }?
Android 7.1 computeGravity方法
?
?
private int computeGravity() {int gravity = mGravity == Gravity.NO_GRAVITY ? Gravity.START | Gravity.TOP : mGravity;if (mIsDropdown && (mClipToScreen || mClippingEnabled)) {gravity |= Gravity.DISPLAY_CLIP_VERTICAL;}return gravity; }?
很顯然在7.0上我們?cè)O(shè)置的Gravity被覆蓋了。解決就很簡(jiǎn)單了,不使用update方法。如果你真的要使用可以參考這篇文章的方法。
?
PopupWindow 在 Android N(7.0) 的兼容性問題
http://www.jianshu.com/p/0df10893bf5b
?
2.PopupWindow高度為MATCH_PARENT,在顯示的時(shí)候調(diào)用showAsLocation方法時(shí),PopupWindow并沒有在指定控件的下方顯示。如果使用showAsDropDown,會(huì)全屏顯示。
?
解決方法:
?
1.最簡(jiǎn)單的解決方法就是指定?PopupWindow?的高度為?WRAP_CONTENT, 調(diào)用?showAsDropDown方法。
2.或者彈出時(shí)做一下判斷處理(代碼來(lái)自PopupWindowCompat?https://github.com/tianma8023/PopupWindowCompat)
?
?
if (Build.VERSION.SDK_INT >= 24) { // Android 7.x中,PopupWindow高度為match_parent時(shí),會(huì)出現(xiàn)兼容性問題,需要處理兼容性int[] location = new int[2]; // 記錄anchor在屏幕中的位置anchor.getLocationOnScreen(location);int offsetY = location[1] + anchor.getHeight();if (Build.VERSION.SDK_INT >= 25) { // Android 7.1 ,8.0中,PopupWindow高度為 match_parent 時(shí),會(huì)占據(jù)整個(gè)屏幕// 故而需要在 Android 7.1上再做特殊處理int screenHeight = ScreenUtils.getScreenHeight(context); // 獲取屏幕高度popupWindow.setHeight(screenHeight - offsetY); // 重新設(shè)置 PopupWindow 的高度}popupWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, 0, offsetY); } else {popupWindow.showAsDropDown(anchor); }?
3后臺(tái)優(yōu)化
?
小伙伴們都知道在Android中有一些隱式廣播,使用這些隱式廣播可以做一些特定的功能,如,當(dāng)手機(jī)網(wǎng)絡(luò)變成WiFi時(shí)自動(dòng)下載更新包等。?
?
但,這些隱式廣播會(huì)在后臺(tái)頻繁啟動(dòng)已注冊(cè)偵聽這些廣播的應(yīng)用,從而帶來(lái)很大的電量消耗,為緩解這一問題來(lái)提升設(shè)備性能和用戶體驗(yàn),在Android 7.0中刪除了三項(xiàng)隱式廣播,以幫助優(yōu)化內(nèi)存使用和電量消耗。
?
Android 7.0 應(yīng)用了以下優(yōu)化措施:
?
-
在 Android 7.0上 應(yīng)用不會(huì)收到?CONNECTIVITY_ACTION?廣播,即使你在manifest清單文件中設(shè)置了請(qǐng)求接受這些事件的通知。 但,在前臺(tái)運(yùn)行的應(yīng)用如果使用BroadcastReceiver 請(qǐng)求接收通知,則仍可以在主線程中偵聽 CONNECTIVITY_CHANGE。
-
在 Android 7.0上應(yīng)用無(wú)法發(fā)送或接收?ACTION_NEW_PICTURE?或ACTION_NEW_VIDEO?類型的廣播。
?
?
應(yīng)對(duì)策略:Android 框架提供多個(gè)解決方案來(lái)緩解對(duì)這些隱式廣播的需求。 例如,JobScheduler API?
https://developer.android.google.cn/reference/android/app/job/JobScheduler.html
提供了一個(gè)穩(wěn)健可靠的機(jī)制來(lái)安排滿足指定條件(例如連入無(wú)線流量網(wǎng)絡(luò))時(shí)所執(zhí)行的網(wǎng)絡(luò)操作。?
您甚至可以使用?JobScheduler API?來(lái)適應(yīng)內(nèi)容提供程序變化。
?
另外,大家如果想了解更多關(guān)于后臺(tái)的優(yōu)化可查閱后臺(tái)優(yōu)化。
https://developer.android.google.cn/preview/features/background-optimization.html
?
移動(dòng)設(shè)備會(huì)經(jīng)歷頻繁的連接變更,例如在 Wi-Fi 和移動(dòng)數(shù)據(jù)之間切換時(shí)。 目前,可以通過在應(yīng)用清單中注冊(cè)一個(gè)接收器來(lái)偵聽隱式?CONNECTIVITY_ACTION?廣播,?
讓應(yīng)用能夠監(jiān)控這些變更。?
?
由于很多應(yīng)用會(huì)注冊(cè)接收此廣播,因此單次網(wǎng)絡(luò)切換即會(huì)導(dǎo)致所有應(yīng)用被喚醒并同時(shí)處理此廣播。
?
以上內(nèi)容來(lái)自這里
https://github.com/crazycodeboy/crazycodeboy.github.io/blob/master/_posts/2016-9-28-Android7.0適配心得.md
?
?
4其他
?
多語(yǔ)言特性
?
首先是官方的API指南:語(yǔ)言和語(yǔ)言區(qū)域
http://blog.csdn.net/qq_17766199/article/details/n/guide/topics/resources/multilingual-support.html
變化對(duì)比:?Android 7.0多語(yǔ)言支持開發(fā)淺析
http://blog.csdn.net/cekiasoo/article/details/53012646
實(shí)現(xiàn)功能:?Android 實(shí)現(xiàn)應(yīng)用內(nèi)置語(yǔ)言切換
http://blog.csdn.net/cekiasoo/article/details/54933135
?
通知欄適配
?
這里有一篇非常詳細(xì)的通知欄介紹與適配,分享給大家:Android通知欄介紹與適配總結(jié)
http://iluhcm.com/2017/03/12/experience-of-adapting-to-android-notifications/
?
WebView問題
?
-
Android 7.0 WebView 部分機(jī)型打不開
http://blog.csdn.net/u012347067/article/details/70829013
-
Android 7.0 WebView 二級(jí)跳轉(zhuǎn)后界面空白
http://www.jianshu.com/p/07b781795b78
?
最后覺得不錯(cuò),點(diǎn)個(gè)贊吧!
原文鏈接:https://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650823906&idx=1&sn=7a0351cad466a4c6cde4fafe9378efc9&chksm=80b7887cb7c0016a69cfd98c2187b76813b161b9dc329df7889d4b78a4f61582fe7328d981a2&scene=21#wechat_redirect
總結(jié)
以上是生活随笔為你收集整理的Android7.0适配方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intellij IDEA(Androi
- 下一篇: Android8.0适配方案