gradle配置項 1. compileSdkVersion 用哪個 Android SDK 版本編譯你的應用。因此我們強烈推薦總是使用最新的 SDK 進行編譯。在現有代碼上使用新的編譯檢查可以獲得很多好處,避免新棄用的 API ,並且為使用新的 API 做好準備。 2. minSdkVersion ...
gradle配置項
- compileSdkVersion
用哪個 Android SDK 版本編譯你的應用。因此我們強烈推薦總是使用最新的 SDK 進行編譯。在現有代碼上使用新的編譯檢查可以獲得很多好處,避免新棄用的 API ,並且為使用新的 API 做好準備。 - minSdkVersion
是應用可以運行的最低要求,也是各大Android應用商店用來判斷用戶設備是否可以安裝某個應用的標誌之一 - targetSdkVersion
targetSdkVersion 是 Android 提供向前相容的主要依據
targetSdkVersion | < | 平臺的API級別 | 向前相容舉個慄子:targetSdkVersion==23(6.0),當前設備Android版本7.0,運行程式時用6.0那一套介面。介面:API介面 |
---|---|---|---|
targetSdkVersion | = | 平臺的API級別 | 不啟用相容性 |
targetSdkVersion | > | 平臺的API級別 | 舉個慄子:targetSdkVersion==23(6.0),當前設備Android版本是 5.0 ,運行程式 用的是5.0那套介面。設備根本到不了6.0 |
是不是意味著targetSdkVersion越低越好?
- 使用低版本API的其中一個不足,顯示的效果比較OUT,提供的可用的介面或類比較少
- 高版本API會針對低版本存在的問題進行改進和完善,擯棄一下不用的類或介面,新增一些方法或屬性,如果你使用的方法是在某個API被另一個方法代替的話,你可能就得在代碼中區分APP是運行在哪個版本的Android系統
- 應用平臺對targetSdkVersion有要求
minSdkVersion <= targetSdkVersion <= compileSdkVersion
andorid 5.0 新特性
- Material Design
- 支持64位ART虛擬機。
- Overview 多任務視窗。
- RecyclerView
- 卡片CardView
- Palette是一個可以從圖片(Bitmap)中提取顏色的幫助類,可以使UI更加美觀,根據圖片動態的顯示相應的顏色
android 5.0適配
- 啟動服務,不支持隱式調用的問題
解決方案- 使用action調用,必須指定包名啟動(判斷當前當前系統版本)
- ComponentName 傳入包名和類名,必須是完整類名路徑。
- android5.0 getRunningTasks 和getRunningAppProcesses(僅返回當前應用包名)失效
解決方案- 第一種辦法,用 UsageStatsManager,需要許可權,且只針對系統應用有效,而且要打開設置頁面。
- 第二種,不需要許可權,外國的一個開源項目:https://github.com/jaredrummler/AndroidProcesses(Android7.0後不生效)
- backgroundTint屬性只能在5.0以上的api中調用
解決方案- 我們可以新建一個values-v21文件夾,這個裡面聲明的屬性會在api21以上的機器上優先於values文件夾中執行
- Android API 21(5.0)引入了一個Drawable的子類VectorDrawable
解決方案(https://www.jianshu.com/p/0972a0d290e9)minSdkVersion<21:如果想要渲染矢量圖的話必須在app模塊的build.gralde文件里添加一行代碼:
defaultConfig { vectorDrawables.useSupportLibrary = true }
- 在Application或者Activity上加上AppCompateDelegate開啟CompatVectorFromResources支持
Button,TextView,應用矢量圖,保險的是先把矢量圖轉為selector,然後selector代替矢量圖使用
Android5.0上 WebView中Http和Https混合問題
解決方案if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); }
WebView cookie 存儲問題
public static void syncCookie(String url, String key) { CookieManager cookieManager = CookieManager.getInstance(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { cookieManager.removeSessionCookies(null); cookieManager.flush(); } else { cookieManager.removeSessionCookie(); CookieSyncManager.getInstance().sync(); } cookieManager.setAcceptCookie(true); cookieManager.setCookie(url, key); }
JobScheduler和JobService是安卓在api 21中增加的介面(保活),功能更強的鬧鐘
Android 6.0 適配及新特性
- 運行時許可權,請務必在運行時檢查和請求許可權
- Normal Premission:普通許可權
Dangerous Permission/Group: 危險許可權/組
android.permission.READ_CALENDAR允許程式讀取用戶日曆數據
android.permission.WRITE_CALENDAR允許一個程式寫入但不讀取用戶日曆數據
android.permission.CAMERA,允許訪問攝像頭進行拍照
android.permission.READ_CONTACTS允許程式讀取用戶聯繫人數據
android.permission.WRITE_CONTACTS允許程式寫入但不讀取用戶聯繫人數據
android.permission.GET_ACCOUNTS訪問一個帳戶列表在Accounts Service中
android.permission.ACCESS_FINE_LOCATION允許一個程式訪問精良位置(如GPS)
android.permission.ACCESS_COARSE_LOCATION允許一個程式訪問CellID或WiFi熱點來獲取粗略的位置
android.permission.RECORD_AUDIO允許程式錄製音頻
android.permission.CALL_PHONE允許一個程式初始化一個電話撥號不需通過撥號用戶界面需要用戶確認
android.permission.READ_PHONE_STATE 訪問電話狀態
android.permission.READ_CALL_LOG 查看電話日誌
android.permission.WRITE_CALL_LOG寫入電話日誌
android.permission.ADD_VOICEMAIL 允許應用程式添加系統中的語音郵件
android.permission.USE_SIP 允許程式使用SIP視頻服務
android.permission.PROCESS_OUTGOING_CALLS 允許應用程式監視、修改、忽略撥出的電話
android.permission.BODY_SENSORS 允許該應用存取監測您身體狀況的感測器所收集的數據,例如您的心率
android.permission.SEND_SMS允許程式發送SMS簡訊
android.permission.RECEIVE_SMS允許程式監控一個將收到簡訊息,記錄或處理
android.permission.READ_SMS允許程式讀取簡訊息
android.permission.RECEIVE_WAP_PUSH允許程式監控將收到WAP PUSH信息
android.permission.RECEIVE_MMS允許一個程式監控將收到MMS彩信,記錄或處理
android.permission.WRITE_EXTERNAL_STORAGE 允許程式寫入外部存儲,如SD卡上寫文件
android.permission.READ_EXTERNAL_STORAGE 訪問您設備上的照片、媒體內容和文件
取消支持 Apache HTTP
解決方案:
android {
useLibrary 'org.apache.http.legacy'
}BoringSSL
請勿鏈接到並非 NDK API 組成部分的加密庫,如 libcrypto.so 和 libssl.so- 硬體標識符訪問權
- WifiInfo.getMacAddress() 方法和 BluetoothAdapter.getAddress() 方法現在會返回常量值 02:00:00:00:00:00。
- 現在想訪問硬體標識,如:WiFi和藍牙,必須要有 ACCESS_FINE_LOCATION或者ACCESS_COARSE_LOCATION許可權
WifiManager.getScanResults()
BluetoothDevice.ACTION_FOUND
BluetoothLeScanner.startScan()
- AudioManager類 不再支持直接設置音量或將特定音頻流靜音
- setStreamSolo() 方法已棄用,您應該改為調用 requestAudioFocus() 方法。
- setStreamMute() 方法也已棄用,請改為調用 adjustStreamVolume() 方法並傳入方向值 ADJUST_MUTE 或 ADJUST_UNMUTE
- 相機服務變更
- 相機服務中共用資源的訪問模式已從之前的“先到先得”訪問模式更改為高優先順序進程優先的訪問模式
- dlopen failed: "has text relocations"
- 解決方案一:將targetSdkVersion 修改為<23
- 解決方案二: https://wiki.gentoo.org/wiki/Hardened/Textrels_Guide 通過scanelf / objdump定位存在TEXTREL問題的文件, 以及關鍵代碼在文件中的偏移量, 然後根據偏移量對應的特征 (函數名 / hard code的絕對地址等), 定位到代碼所在.
- 在mk腳本中, 對LOCAL_CFLAGS, 增加-fPIC參數
- 電源管理
在原有的電源管理的基礎上加入了兩種新的狀態:- App Standby—應用待機狀態
- Doze 系統休眠狀態
- 規範化App Link (應用程式鏈接)
指紋識別(統一API)