Android各版本差異性
Android?6(api?23)
-
指紋識別
-
運行時權限:動態申請(重點)
-
移除對Apache?HTTP?client的支持,建議使用HttpURLConnection。
-
休眠和應用待機模式(Doze?and?App?Standby)
-
硬件標識符訪問權:WifiInfo.getMacAddress()?返回常量值?02:00:00:00:00:00
Android7(api?24)
-
應用間共享文件規則
-
禁止使用file://URI,?否則拋出FileUriExposedException異常應該通過content://URI,并授權URI?臨時訪問權限
-
FileProvider
-
-
Apk簽名Scheme?V2
- V1簽名不會校驗Apk文件的注釋區V2簽名會校驗Apk文件的注釋區是否修改V2簽名增加一塊簽名區塊,簽名區塊可以根據固定的id,獲取簽名信息簽名區塊不會校驗是否修改
-
畫中畫、分屏多任務、通知欄快速回復、夜間模式
-
后臺優化:
- 刪除3個隱式廣播(CONNECTIVITY_ACTION、ACTION_NEW_PICTURE、ACTION_NEW_VIDEO)
Android8(api?26)
-
運行時權限:系統只會授予應用明確請求的權限
-
通知變更(channel)
-
自適應圖標
-
懸浮窗適配
-
透明主題的Activity:8.0上的Bug?:?只有全屏不透明的Activity才可以設置方向?;?8.1修復
-
后臺服務、廣播限制規則;
-
1.后臺服務限制處于空閑狀態時,應用可以使用的后臺服務存在限制。?這些限制不適用于前臺服務,因為前臺服務更容易引起用戶注意
-
2.廣播限制除了有限的例外情況,無法再使用清單注冊隱式廣播
-
-
后臺位置信息限制
- 為降低耗電量,8.0開始對后臺應用獲取用戶當前位置信息的頻率進行限制,應用每小時僅能接收幾次位置信息更新,會出現后臺應用定位收不到定位信息。
Android9(api?28)
-
新特性
-
劉海屏的支持
-
利用?Wi-Fi?RTT?進行室內定位
-
通知欄功能增強(支持Bubble)
-
多攝像頭支持
-
-
Non-SDK接口使用
- 9.0開始,無法再通過反射,JNI間接地使用非SDK的API接口了
-
挖孔屏適配
- 有狀態欄的頁面,不會受挖孔屏特性的影響全屏顯示的頁面,系統挖孔屏方案會把應用界面下移,避開挖空區域,進行顯示
-
不允許共享WebView數據目錄
- 不能再跨進程共享單個WebView數據目錄,否則會崩潰
-
移除對?Build.serial?的直接訪問
- 需要?Build.serial屬性字段的話,必須請求?READ_PHONE_STATE?權限然后使用?9.0?新增的新?Build.getSerial()?函數來進行獲取
-
SELinux?禁止訪問應用的數據目錄
-
不允許直接通過路徑訪問其他應用的數據目錄
-
可以使用進程間通信?(IPC)?機制(包括通過傳遞?FD)共享數據
-
Android?10?(?api29)
-
定義媒體權限集合
-
訪問共享集合,需通過?MediaStore?API
- MediaStore.ImagesMediaStore.VideoMediaStore.AudioMediaStore.Downloads
-
應用的私有目錄訪問變更
-
為每個應用程序提供了一個獨立的在外部存儲設備的存儲沙箱,沒有其他應用可以直接訪問您應用的沙盒文件。由于文件是私有的,因此訪問這些文件不再需要任何權限。
-
獲取外部存儲私有文件的最佳位置:即Context.getExternalFilesDir返回的位置,因為此位置在所有Android版本中表現一致;使用此方法時,請傳入與要創建或打開的文件類型對應的媒體環境。例如,要訪問或保存app-private圖像,請調用Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
-
-
ACCESS_MEDIA_LOCATION
- 使用這個權限,可以獲取照片中的位置信息
-
Activity后臺活動限制
-
對應用未經通知用戶就啟動App,進行了極大地限制,只有在滿足以下一個或多個條件時才能啟動Activity:
-
1.?App具有可見Activity窗口
-
2.位于前臺的另一個App發送屬于該應用程序的PendingIntent
-
3.系統發送屬于該App的PendingIntent?(比如:點擊通知消息)
-
4.系統向應用程序發送廣播?(比如:SECRET_CODE_ACTION)
-
-
設備位置權限的訪問控制
- 用戶可以更好地控制應用何時可以訪問設備位置,運行的應用程序請求位置訪問時,會通過對話框的形式給用戶進行授權提示。
-
允許應用程序降級
-
對數據和標識符的更改
-
1.獲取聯系人信息,結果不再按交互頻率排序
-
2.MAC地址隨機化,默認傳輸隨機的MAC?地址
-
3.唯一標識符:需要?READ_PRIVILEGED_PHONE_STATE?權限,才能訪問設備的不可重置標識符,包括?IMEI、序列號
-
4.訪問剪貼板數據:除默認輸入法程序外,沒有焦點的應用無法訪問剪貼板數據?:?clipManager.hasPrimaryClip?return?false
-
5.訪問USB串行需要用戶許可:只能在用戶授予您訪問USB設備權限后才能讀取序列號
-
6.相機和連接相關更改:調用getCameraCharacteristics()方法獲取返回的信息的廣度,必須具有?CAMERA?權限才能訪問getCameraCharacteristics()方法的返回值中包含的設備元數據
-
-
啟用、禁用Wi-Fi的限制
- 1.無法啟用、停用Wi-Fi2.WifiManager.setWifiEnabled()?方法始終返回false3.只能使用設置面板提示用戶啟用、禁用Wi-Fi
Android?11(api?30)
-
分區存儲強制執行
- 分區存儲,在Android10就已經推行了,簡單的說,就是應用對于文件的讀寫只能在沙盒環境,也就是屬于自己應用的目錄里面讀寫。其他媒體文件可以通過MediaStore進行訪問。
-
媒體文件訪問權限
- 為了在保證用戶隱私的同時可以更輕松地訪問媒體,Android?11?增加了以下功能。執行批量操作和使用直接文件路徑和原生庫訪問文件
-
軟件包可見性
- 如果你想去獲取其他應用的信息,比如包名,名稱等等,不能直接獲取了,必須必須在清單文件中添加元素,告知系統你要獲取哪些應用信息或者哪一類應用
-
所有文件訪問權限
- 應用可通過執行以下操作,向用戶請求名為“所有文件訪問權限”的特殊應用訪問權限,在清單中聲明MANAGE_EXTERNAL_STORAGE權限,使用ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION?作為Action,?將用戶引導至一個系統設置頁面,在該頁面上,用戶可以為您的應用啟用以下選項:授予所有文件的管理權限。如需確定您的應用是否已獲得?MANAGE_EXTERNAL_STORAGE?權限,請調用Environment.isExternalStorageManager()。
-
電話號碼相關權限
- TelecomManager?類中的?getLine1Number()?方法TelecomManager?類中的?getMsisdn()?方法當用到這兩個API的時候,原來的READ_PHONE_STATE權限不管用了,需要READ_PHONE_NUMBERS權限才行
-
媒體intent操作需要系統默認相機
-
5G
-
需要?APK?簽名方案?v2
-
后臺位置信息訪問權限
-
數據訪問審核
-
用戶可以選擇權限單次授權(僅此一次)
- 我們每次使用的時候都去判斷權限,沒有就去申請即可。
Android?12(API?31)
三方卡片內容:?https://developer.android.google.cn/about/versions/12?hl=zh-cn
-
應用啟動頁?SplashScreen(影響所有應用);
-
從Android?12開始,所有的App在每次啟動時(特指冷啟動與溫啟動),系統都會為我們加上一個默認的啟動畫面
-
應用圖標?+圖標背景+前景遮罩+窗口背景
-
啟動畫面允許我們一定程度的自定義,但總體都無法跳脫出以上4個元素,且無法去除。
-
適配:方案
-
設置除窗口背景之外的元素都為透明
-
改用SplashScreen?API定制系統啟動畫面:可定制程度低,可能無法滿足產品的需求;
-
-
-
麥克風和攝像頭切換開關
-
聲明?android:exported
-
應用組件需顯示聲明?android:exported
-
從?Andorid?12?開始,當您的應用程序將目標版本設置為31或更高版本(targetSdkVersion?31)時,若應用程序組件(Activity、Service、Receiver、Provider)在配置清單manifest中未顯示聲明?android:exported?屬性,則在進行應用開發或打包時,將會出現如下錯誤?:?As?of?Android?12,?android:exported?must?be?set;?use?true?to?make?the?activity?available?to?other?apps,?and?false?otherwise.?For?launcher?activities,?this?should?be?set?to?true.
-
-
通知欄變更
- Notification通知欄布局樣式再次調整
-
前臺服務:
-
將禁止從后臺啟動前臺服務
-
以下情況可啟動前臺服務:1.可見的?Activity?或窗口;2.用戶操作,如通知、小部件等等;3.特定的廣播和回調;4.STICKY?類型的服務可在崩潰或由于低內存而停止運行的情況下重啟;
-
-
藍牙權限:
- Android?12?引入了?BLUETOOTH_SCAN、BLUETOOTH_ADVERTISE?和?BLUETOOTH_CONNECT?權限。這些權限可讓以?Android?應用更輕松地與藍牙設備互動,不再需要申請設備位置信息相關權限。Android?12?開始,Google官方將藍牙掃描與位置權限進行了分離,因為官方發現:在隱私層面上,很難向終端用戶解釋位置權限與藍牙的關系。
-
精確位置
- 從?Andorid?12?開始,當您的應用程序將目標版本設置為31或更高版本(targetSdkVersion?31)時,若應用程序請求設備的精確位置,需同時請求?ACCESS_FINE_LOCATION?和?ACCESS_COARSE_LOCATION?權限。發出精確位置申請后,用戶側設備將彈出動態授權申請彈窗:
-
待處理?intent?可變性
- 簡單講,就是以Android?12為目標平臺的App,在構建PendingIntent時,需要指定Flag為FLAG_IMMUTABLE(建議)或FLAG_MUTABLE二者之一
-
精確的鬧鐘權限
-
通知?trampoline?限制
-
簡單講,就是我們之前在配置通知(Notification)的點按行為時,可能會通過PendingIntent來啟動一個Service或BrocastReceiver。而以Android?12為目標平臺的App,如果嘗試在Service或BrocastReceiver中內調用?startActivity(),系統會阻止該Activity啟動,并在?Logcat?中顯示以下消息:
-
適配:排查哪個Service或BrocastReceiver有此行為
- 可在Terminal終端執行以下adb命令,該命令會在你點按通知后,識別哪個Service或BrocastReceiver調用了startActivity(),并輸出相關信息到Logcat,可以通過關鍵字“NotifInteractionLog”進行過濾:adb?shell?dumpsys?activity?service?\?com.android.systemui/.dump.SystemUIAuxiliaryDumpService
-
考慮在配置通知(Notification)的點按行為時選擇直接啟動Activity
-
Android?13(API?32)
Android13官方文檔
-
細分媒體權限:將?READ_EXTERNAL_STORAGE?細分為IAMGES、VIDEO、AUDIO權限(若設置?targetSdk>=33?則此項必需適配!)
-
WebView調整:廢棄setAppCacheEnabled與setForceDark方法;(若設置?targetSdk>=33?則此項必需適配!)
-
靜態廣播注冊:注冊靜態廣播時,需設置對其他應用的可見性(若設置?targetSdk>=33?則此項必需適配!)
-
通知權限:新增運行時通知權限:POST_NOTIFICATIONS(若設置?targetSdk>=33?則此項必需適配!)
-
Wi-Fi?:新增?NEARBY_WIFI_DEVICES?運行時權限(若設置?targetSdk>=33?則此項必需適配!)
-
身體傳感器后臺權限:新增?BODY_SENSORS_BACKGROUND?運行時權限(若設置?targetSdk>=33?則此項必需適配!)
-
剪切板內容隱藏:新增內容隱藏API(根據業務需求,選擇性適配!)
-
非?SDK?接口的限制(若設置?targetSdk>=33?則此項必需適配!)
Android?14(API?33)
Android?14?功能和變更列表,官方介紹