安卓版本適配信息匯總,最后更新于2019年10月23日步鉴,持續(xù)收集中
-
1:安卓4.4 API-19
-
1.1:
READ_EXTERNAL_STORAGE
讀取外置存儲權(quán)限強制檢查,此權(quán)限在低于4.4的版本默認獲取。如果應(yīng)用只在內(nèi)部存儲數(shù)據(jù)或者如下特定目錄讀取/寫入文件授账,則不需要WRITE_EXTERNAL_STORAGE
或者READ_EXTERNAL_STORAGE
權(quán)限。如果app沒有在別的地方讀寫存儲但是minSdkVersion低于19惨驶,則可以在uses-permission標簽內(nèi)加入android:maxSdkVersion
適配:<uses-permission ... android:maxSdkVersion="18"/>
白热。支持的文件位置如下:Context API 文件指向位置 備注 getExternalFilesDir(String)
SD卡/Android/data/包名/String/ 非內(nèi)置存儲 getExternalCacheDir()
SD卡/Android/data/包名/cache/ 非內(nèi)置存儲 getExternalMediaDirs()
SD卡/Android/media/包名/ 非內(nèi)置存儲 getDataDir()
data/data/包名/ app內(nèi)置存儲根目錄 getDir(自定義dir,mode)
data/data/包名/自定義dir/ 內(nèi)置存儲(api24開始mode縮小限定范圍) getFilesDir()
data/data/包名/files/ 內(nèi)置存儲 getCacheDir()
data/data/包名/cache/ 內(nèi)置存儲 getPreferencesDir()
data/data/包名/shared_prefs/ 內(nèi)置存儲 getNoBackupFilesDir()
data/data/包名/no_backup/ 內(nèi)置存儲(api21) getCodeCacheDir()
data/data/包名/code_cache/ 內(nèi)置存儲(api21) getDatabasesDir()
data/data/包名/databases/ 內(nèi)置存儲(api27) 1.2:應(yīng)用支持全屏模式,也就是常說的 沉浸式
1.3:虛擬按鍵可隱藏,既然沉浸式底部導航欄跟著支持了粗卜,那就順路把相關(guān)控制API也暴露給開發(fā)者
1.4:為了加強
WebView
的功能屋确,Google引入了Chromium
內(nèi)核。但仍然還是存在 編輯的bug
-
-
2:安卓5.0 API-21
2.1:ART androidRunTime取代 Dalvik 成為平臺默認設(shè)置,ART采用預(yù)先編譯技術(shù),改進了垃圾回收機制與調(diào)試支持
2.2:
Material Design
設(shè)計規(guī)范攻臀,編譯版本提升至至少21時才能方便使用Appcompat-V7
RecyclerView-V7
CardView-V7
等框架焕数,在UI上突出的變化還有SharedElementAnimation
elevation
等。2.3:提升用戶隱私的安全性刨啸,棄用
activityManager.getRecentTask()
方法堡赔。對于向后兼容性,此方法仍會返回它的一小部分數(shù)據(jù)设联,包括應(yīng)用自己的任務(wù)和可能的一些其他非敏感任務(wù)(如首頁)善已。如果你的應(yīng)用使用此方法檢索它自己的任務(wù),則改用getAppTasks
檢索信息-
2.4:禁用隱式意圖啟動服務(wù)仑荐,運行時會直接拋出
IllegalArgumentException
異常Intent intent = new Intent();過時禁用 intent.setAction("com.example.myapplication"); startService(intent); 只能使用顯式意圖 Intent intent = new Intent("com.example.myapplication");
2.5:
Notification
模塊不支持設(shè)置了rgb通道的smallIcon
雕拼,此bug 在后續(xù)版本已經(jīng)修復(fù),但是為了系統(tǒng)兼容性粘招,建議開發(fā)者在安卓5.0及以上設(shè)備上更換smallIcon以達到版本一致性2.6:WebView默認會阻止混合內(nèi)容(https當中不能加載http資源),要允許請調(diào)用
WebSettings#setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW)
啥寇。
默認阻止第三方 Cookie,要允許請調(diào)用CookieManager#setAcceptThirdPartyCookies(webView,true)
洒扎。2.7:現(xiàn)在可以智能地選擇要繪制的 HTML 文檔部分辑甜。這個新的默認行為有助于減少內(nèi)存占用和提升性能。如果您要一次渲染整個文檔袍冷,可通過調(diào)用
enableSlowWholeDocumentDraw()
停用此優(yōu)化磷醋。2.8:自定義權(quán)限必須保證唯一,使用不同秘鑰簽名的應(yīng)用不能使用相同的自定義權(quán)限胡诗。如果用戶設(shè)備上存在一個應(yīng)用使用了相同的自定義權(quán)限邓线,那么新的應(yīng)用將無法安裝
2.9:移除了對鎖定屏幕小部件的支持
2.10:新增
Intent.resolveActivity(*)
對發(fā)起的意圖進行設(shè)備匹配
-
3:安卓6.0 API-23
-
3.1:移除了
Apache
的http
支持包,如有需要手動引入。android { useLibrary 'org.apache.http.legacy' }
3.2:廢棄:
FloatMath
煌恢,Notification.setLastEventInfo()
3.3:移除了對設(shè)備本地硬件標識符的編程訪問權(quán)骇陈。
WifiInfo.getMacAddress()
方法和BluetoothAdapter.getAddress()
方法現(xiàn)在會返回常量值02:00:00:00:00:00
。如果需要通過藍牙和wifi掃描訪問外部設(shè)備的硬件標識符瑰抵,應(yīng)用必須擁有ACCESS_FINE_LOCATION
或ACCESS_COARSE_LOCATION
權(quán)限你雌。3.4:音頻管理器變更:不再支持通過
AudioManager
類直接設(shè)置音量或?qū)⑻囟ㄒ纛l流靜音。setStreamSolo()方法棄用二汛,改為requestAudioFocus()
方法婿崭。setStreamMute() 方法棄用,改為adjustStreamVolume()
并傳入方向值ADJUST_MUTE/ ADJUST_UNMUTE
肴颊。3.5:APK 驗證更為嚴格氓栈。如果在清單中聲明的文件在 APK 中并不存在,該 APK 將被視為已損壞婿着。移除任何內(nèi)容后必須重新簽署 APK颤绕。
-
3.6:運行時權(quán)限管理幸海,谷歌借鑒了蘋果 和國內(nèi)廠商的優(yōu)化經(jīng)驗,對應(yīng)用的權(quán)限不再一刀切奥务,而是把相關(guān)權(quán)限分成了三組
- 特殊權(quán)限 每次冷啟動APP都會重置狀態(tài)物独,不建議應(yīng)用申請
權(quán)限名稱 權(quán)限說明 SYSTEM_ALERT_WINDOW
設(shè)置懸浮窗,TYPE_SYSTEM_ALERT已失效 WRITE_SETTINGS
修改系統(tǒng)設(shè)置 - 敏感權(quán)限 運行時申請,如果沒有適配會直接拋出異常氯葬,許可狀態(tài)會保存
權(quán)限組 權(quán)限名稱 介紹 CALENDAR android.permission.READ_CALENDAR
讀取系統(tǒng)日歷 android.permission.WRITE_CALENDAR
寫入系統(tǒng)日歷 CAMERA android.permission.CAMERA
相機權(quán)限 CONTACTS android.permission.READ_CONTACTS
讀取聯(lián)系人 android.permission.WRITE_CONTACTS
寫入聯(lián)系人 android.permission.GET_ACCOUNTS
讀取賬號 LOCATION android.permission.ACCESS_FINE_LOCATION
獲取精準位置 android.permission.ACCESS_COARSE_LOCATION
獲取大概位置 MICROPHONE android.permission.RECORD_AUDIO
錄音 PHONE android.permission.READ_PHONE_STATE
獲取手機信息 android.permission.CALL_PHONE
打電話,不建議使用 android.permission.READ_CALL_LOG
讀取通話記錄 android.permission.WRITE_CALL_LOG
寫入通話記錄 android.permission.PROCESS_OUTGOING_CALLS
監(jiān)聽挡篓、控制、取消呼出電話的權(quán)限 android.permission.USE_SIP
使用sip(會話發(fā)起協(xié)議)網(wǎng)絡(luò)電話 android.permission.ADD_VOICEMAIL
添加系統(tǒng)中的語音郵件 SENSORS android.permission.BODY_SENSOR
使用生命體征相關(guān)傳感器 SMS android.permission.SEND_SMS
發(fā)送短信 android.permission.RECEIVE_SMS
接收短信 android.permission.READ_SMS
讀取短信 android.permission.RECEIVE_WAP_PUSH
接收WapPush信息 android.permission.RECEIVE_MMS
接收彩信 android.permission.READ_CELL_BROADCASTS
不存在的權(quán)限 STORAGE android.permission.READ_EXTERNAL_STORAGE
讀取存儲 android.permission.WRITE_EXTERNAL_STORAGE
寫入存儲 運行時權(quán)限共9組帚称,同一組下如果有一個權(quán)限被允許官研,其它權(quán)限會自動被允許。
開發(fā)時應(yīng)減少申請權(quán)限的次數(shù)闯睹,以避免交互被打斷戏羽。對于敏感權(quán)限可用intent來代替,讓其它應(yīng)用去處理
-
-
4:安卓7.0 API-24
4.1:應(yīng)用分屏楼吃,支持java8始花。通過
Context.getDir(name,mode)
獲取存儲文件夾時不能再使用MODE_WORLD_READABLE
和MODE_WORLD_WRITEABLE
,與此相似的還有SharedPreference和DataBase孩锡。否則會拋出SecurityException
4.2:
Notification.Builder
通知消息可以通過setShowWhen()
設(shè)置定時顯示4.3:刪除了三個常用隱式廣播 :
CONNECTIVITY_ACTION
酷宵,ACTION_NEW_PICTURE
,ACTION_NEW_VIDEO
躬窜。因為這些廣播可能會一次喚醒多個應(yīng)用的后臺進程浇垦,消耗內(nèi)存和電池4.4:優(yōu)化了
SurfaceView
,使其在視頻播放和3D方面表現(xiàn)更優(yōu)于TextureView
荣挨。4.5:APK signature scheme v2,android 7.0 新引入應(yīng)用簽名方案男韧,它能提供更快的應(yīng)用安裝時間和更多針對未授權(quán) APK 文件更改的保護。
-
4.6:
StrictMode API
政策禁止在您的應(yīng)用外部公開file:// URI
默垄。如果啟動一個包含文件 URI 的intent
會拋出FileUriExposedException
異常此虑。受此影響的有拍照圖片選擇,下載apk安裝等功能。要在應(yīng)用間共享文件厕倍,您應(yīng)發(fā)送一項content:// URI
寡壮,并授予 URI 臨時訪問權(quán)限贩疙。步驟如下:- 4.6.1:在AndroidManifest.xml中添加<provider>標簽
<provider tools:replace="android:authorities"(如果使用的依賴module也存在provider則添加此tools) android:name="android.support.v4.content.FileProvider" android:authorities="替換為你的包名.fileProvider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_provider_paths" /> </provider>
- 4.6.2:在res/xml文件夾里面創(chuàng)建xml文件file_provider_paths.xml讹弯,文件名要和上方的
android:resource
對應(yīng)值保持一致各個元素的定義可參考android.support.v4.content.FileProvider <?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <root-path name="root_path_name" path="test"/>"/" <files-path path="file_path_name" name="images"/>Context.getFilesDir() 示例位置 <cache-path name="cache_path_name" path="images" />Context.getCacheDir() <external-path name="external_path_name" path=" ." />Environment.getExternalStorageDirectory() <external-files-path name="external_file_path_name" path="images" />Context#getExternalFilesDir(String) <external-cache-path name="external_cache_path_name" path="images" /> <external-path name="external_path_name_01" path="Android/data/com.papa.auction/"/> <external-path name="external_path_name_02" path="."/> </paths>
- 4.6.3:修改拍照intent示例:
Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 判斷設(shè)備是否有應(yīng)用可以處理打開相機intent if(intent.resolveActivity(context.getPackageManager()) != null){ Uri cameraUri; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); cameraUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileProvider", file); }else { cameraUri = Uri.fromFile(file); } intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri); context.startActivityForResult(intent,requestCode); }
- 4.6.4:修改安裝APK intent示例:
Intent installIntent = new Intent(Intent.ACTION_VIEW)); installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 根據(jù)啟動位置決定是否添加 Uri apkFileUri; if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) { installIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); apkFileUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileProvider", apkFile); } else { apkFileUri = Uri.fromFile(apkFile); } installIntent.setDataAndType(apkFileUri, "application/vnd.android.package-archive"); context.startActivity(installIntent);
- 4.6.1:在AndroidManifest.xml中添加<provider>標簽
-
4.7:加密庫 Crypto廢棄 將密碼作為隨機數(shù)生成器的種子換算出密鑰 key這種做法已經(jīng)被認定為是不安全的。相關(guān)的 Crypto provider 和 SHA1PRNG 算法同時廢棄掉了这溅,并計劃在后續(xù)的 SDK 中完全移除相關(guān)的庫,如下是官方給出的解決方案:
給出字符串的密碼 String password = "password"; 密鑰的比特位數(shù)组民,注意這里是比特位數(shù) AES 支持 128、192 和 256 比特長度的密鑰 int keyLength = 256; 鹽值的字節(jié)數(shù)組長度悲靴,注意這里是字節(jié)數(shù)組的長度 其長度值需要和最終輸出的密鑰字節(jié)數(shù)組長度一致 由于這里密鑰的長度是 256 比特臭胜,則最終密鑰將以 256/8 = 32 位長度的字節(jié)數(shù)組存在 所以鹽值的字節(jié)數(shù)組長度也應(yīng)該是 32 int saltLength = 32; byte[] salt; 先獲取一個隨機的鹽值 你需要將此次生成的鹽值保存到磁盤上下次再從字符串換算密鑰時傳入 如果鹽值不一致將導致?lián)Q算的密鑰值不同 保存密鑰的邏輯官方并沒寫,需要自行實現(xiàn) SecureRandom random = new SecureRandom(); byte[] salt = new byte[saltLength]; random.nextBytes(salt); 將密碼明文、鹽值等使用新的方法換算密鑰 int iterationCount = 1000; KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt,iterationCount, keyLength); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 到這里你就能拿到一個安全的密鑰了 byte[] keyBytes = keyFactory.generateSecret(keySpec).getEncoded(); SecretKey key = new SecretKeySpec(keyBytes, "AES");
-
5:安卓8.0 API-26 (8.1 API-27)
- 5.1:roundedIcon 自適應(yīng)圖標耸三,在manifest文件中額外提供圓形應(yīng)用icon
<application android:name=".App" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" ......
- 5.2:PHONE權(quán)限組新增兩個運行時權(quán)限
-
ANSWER_PHONE_CALLS
:允許接聽呼入電話乱陡。在應(yīng)用中使用acceptRingingCall()
函數(shù)處理呼入電話。 -
READ_PHONE_NUMBERS
:允許應(yīng)用讀取設(shè)備中存儲的電話號碼仪壮。
-
- 5.3:安卓8.0中憨颠,Notification的通知渠道。用戶可以根據(jù)渠道來屏蔽一些不想要的通知
void setNotifyChannel(NotificationManager manager, NotificationCompat.Builder builder, String channeId, String channelName) { if (TextUtils.isEmpty(channeId)||TextUtils.isEmpty(channelName)){ L.e("NotifyCompat: ".concat("安卓8.0的通知兼容庫中 channeId 與 channelName 不能為empty")); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { //第三個參數(shù)設(shè)置通知的優(yōu)先級別 NotificationChannel channel = new NotificationChannel(channeId, channelName, NotificationManager.IMPORTANCE_DEFAULT); channel.canBypassDnd();//是否可以繞過請勿打擾模式 channel.canShowBadge();//是否可以顯示icon角標 channel.enableLights(true);//是否顯示通知閃燈 channel.enableVibration(true);//收到小時時震動提示 channel.setBypassDnd(true);//設(shè)置繞過免打擾 channel.setLockscreenVisibility(NotificationCompat.VISIBILITY_SECRET); channel.setLightColor(Color.RED);//設(shè)置閃光燈顏色 channel.getAudioAttributes();//獲取設(shè)置鈴聲設(shè)置 channel.setVibrationPattern(new long[]{100, 200, 100});//設(shè)置震動模式 channel.shouldShowLights();//是否會閃光 if (manager != null) { manager.createNotificationChannel(channel); //manager 與channel關(guān)聯(lián) } if (builder != null) { builder.setChannelId(channeId);//Notification 與channel關(guān)聯(lián) } } }
- 5.4:新增特殊權(quán)限:
android.permission.REQUEST_INSTALL_PACKAGES
當需要安裝未知來源應(yīng)用時使用积锅,示例如下private void installAPK(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { boolean hasInstallPermission = getPackageManager().canRequestPackageInstalls(); if (hasInstallPermission) { 安裝應(yīng)用 } else { 提示用戶跳轉(zhuǎn)至“安裝未知應(yīng)用”權(quán)限界面爽彤,引導用戶開啟權(quán)限 Uri selfPackageUri = Uri.parse("package:" + this.getPackageName()); Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, selfPackageUri); startActivityForResult(intent, REQUEST_CODE_UNKNOWN_APP); } }else { 安裝應(yīng)用 } }
- 5.6:SharedPreferences不能使用
MODE_WORLD_READABLE
,請修改為MODE_PRIVATE
- 5.6:新的廣播接收器限制導致靜態(tài)廣播無法正常接收,應(yīng)使用動態(tài)廣播代替靜態(tài)廣播
- 5.7:
List.sort()
的實現(xiàn)不能調(diào)用Collections.sort()
缚陷,因為這會導致堆棧因無限遞歸而溢出 - 5.8:申請了
SYSTEM_ALERT_WINDOW
權(quán)限的應(yīng)用需要在其他應(yīng)用和系統(tǒng)窗口上方顯示提醒窗口時只能使用TYPE_APPLICATION_OVERLAY
類型适篙,之前的TYPE_PHONE
TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_SYSTEM_OVERLAY
TYPE_SYSTEM_ERROR
不再生效。 - 5.9:在 Android 8.0 之前箫爷,如果應(yīng)用在運行時請求權(quán)限并且被授予該權(quán)限嚷节,系統(tǒng)會將同一權(quán)限組且在Manifest中注冊的其他權(quán)限也一起授予應(yīng)用。此行為在8.0被糾正:系統(tǒng)只會授予應(yīng)用明確請求的權(quán)限蝶缀。然而丹喻,一旦用戶為應(yīng)用授予某個權(quán)限,則所有后續(xù)對該權(quán)限組中權(quán)限的請求都將被自動批準翁都。
- 5.10:
Only fullscreen opaque activities can request orientation
碍论,在Android 8.0上非全屏透明頁面不允許設(shè)置方向(8.1以上谷歌就修復(fù)去掉了這個限制)解決方案1:在manifest中去掉此Activity的
screenOrientation
屬性
解決方案2:在此Activity的style里設(shè)置<item name="android:windowIsTranslucent">false</item>
解決方案3:使用Dialog/DialogFragment/Popwindow
代替此Activity。
更多細節(jié)參閱:
https://developer.android.com/about/versions/oreo/android-8.0-changes#all-apps
https://developer.android.com/about/versions/oreo/android-8.1 - 5.1:roundedIcon 自適應(yīng)圖標耸三,在manifest文件中額外提供圓形應(yīng)用icon
-
6:安卓9.0 API-28
-
6.1:限制明文流量的網(wǎng)絡(luò)請求柄慰,非加密的流量請求會被系統(tǒng)禁止掉
解決方案:在xml目錄新建文件network_security_config.xml
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
在manifest清單文件application節(jié)點配置
android:networkSecurityConfig="@xml/network_security_config"
6.2:使用apacheHttp支持包時出現(xiàn)classNotFound 錯誤鳍悠,從 Android 9 開始,Apache HTTP的支持內(nèi)容庫已從 bootclasspath 中移除坐搔,且默認情況下應(yīng)用無法使用它藏研。請在Manifest文件的application節(jié)點中加入如下設(shè)置:
<uses-library android:name="org.apache.http.legacy" android:required="false" />
-
6.3:
java.lang.IllegalArgumentException: Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed
安卓9.0對canvas#clipPath()中的Region.Op做了限制只能使用INTERSECT或者DIFFERENCE。if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { canvas.clipPath(mPath); } else { canvas.clipPath(mPath, Region.Op.REPLACE); }
6.4:棄用 Bouncy Castle 加密概行。Android 9 棄用了幾個來自 Bouncy Castle 提供程序中的加密技術(shù)蠢挡,代之以由 Conscrypt 提供程序提供的加密技術(shù)。調(diào)用請求 Bouncy Castle 提供程序的 getInstance() 時凳忙,會生成 NoSuchAlgorithmException 錯誤业踏。要解決這些錯誤,請不要在 getInstance() 中指定提供程序(也就是請求默認實現(xiàn))涧卵。
6.5:前臺服務(wù)權(quán)限勤家。要使用前臺服務(wù)的應(yīng)用必須注冊普通權(quán)限 FOREGROUND_SERVICE。在未獲得此權(quán)限的情況下啟動前臺服務(wù)將會引發(fā) SecurityException柳恐。
6.6:移除對 Build.serial 的直接訪問伐脖。使用Build.getSerial() 函數(shù)來替代 Build.serial獲取標識符热幔。應(yīng)用必須請求READ_PHONE_STATE 權(quán)限。
6.7:Detected problems with API 彈窗的解決:https://blog.csdn.net/codekxx/article/details/86507470#comments
更多細節(jié)參閱:https://developer.android.com/about/versions/pie
-
-
7:安卓10.0 API-29
- 7.1:TelephonyManager#getDeviceId(),需要申請READ_PRIVILEGED_PHONE_STATE權(quán)限讼庇,此權(quán)限只開發(fā)給系統(tǒng)app绎巨,按照谷歌的建議如果不是做framework層app開發(fā)就不要使用此api,普通app此處需要大量適配蠕啄,因為三方支付類統(tǒng)計類支持包都會調(diào)用此api认烁,如果不能全部更新就不要把target提升到29,否則會直接拋出SecurityException:
getDeviceId: The user 10104 does not meet the requirements to access device identifiers at android.os.Parcel.createException(Parcel.java:2071) at android.os.Parcel.readException(Parcel.java:2039) at android.os.Parcel.readException(Parcel.java:1987) at com.android.internal.telephony.ITelephony$Stub$Proxy.getDeviceId(ITelephony.java:10389)
在安卓9.0時此方法已經(jīng)提示deprecated介汹,建議開發(fā)者用getImei()返回GSM網(wǎng)絡(luò)的IMEI却嗡,或者getMeid()返回CDMA網(wǎng)絡(luò)的MEID。
- 7.1:TelephonyManager#getDeviceId(),需要申請READ_PRIVILEGED_PHONE_STATE權(quán)限讼庇,此權(quán)限只開發(fā)給系統(tǒng)app绎巨,按照谷歌的建議如果不是做framework層app開發(fā)就不要使用此api,普通app此處需要大量適配蠕啄,因為三方支付類統(tǒng)計類支持包都會調(diào)用此api认烁,如果不能全部更新就不要把target提升到29,否則會直接拋出SecurityException: