Android SDK各個版本API的特性及相容性(Dalvik/ART)

desaco發表於2016-03-09

Android最新support包v4,v7,v13,v14,v17等 - http://download.csdn.net/download/u012808234/9502763

Android API Level與sdk版本對照表- http://blog.csdn.net/shuaishenkkk/article/details/18400711

Android系統版本與API等級對應關係表- http://www.bubuko.com/infodetail-1928589.html

Android各版本 釋出時間 及對應API(2018.8.31截至Android最新版本 P)- https://blog.csdn.net/weixin_41101173/article/details/79620490

android關於使用哪個版本開發的討論-- http://blog.csdn.net/pkxiuluo01/article/details/9022703

> Android SDK各個版本API的特性,屬性;sdk的官網
Android1.1主要特性: 
   鬧鐘;API 示例;瀏覽器;計算器;攝像頭;聯絡人;開發工具包;撥號應用;電子郵件 ;地圖 (包含街景) ;資訊服務;音樂;圖片;設定  

 

Android 1.5 API變更概要: 

 1、UI framework
  · Framework for easier background/UI thread interaction
  · 新SlidingDrawer 元件
  · 新HorizontalScrollview 元件
 2、AppWidget framework
  · 一些關於建立桌面AppWidget 的API.
  · 提供根據自定義的內容建立LiveFolders的API
 3、Media framework
  · 原聲錄音和回放 APIs
  · 互動式的MIDI 回放引擎
  · 開發者使用的視訊錄影API (3GP format).
  · 視訊相片分享 Intents
  · 媒體搜尋Intent
 4、Input Method framework
  · 輸入法服務framework
  · 文字預測引擎
  · 提供具有下載能力的IME給使用者
 5、Application-defined hardware requirements
  應用可定義硬體需求,應用程式可以定義說明此程式需要什麼硬體需求.比如是否需要物理鍵盤或者軌跡球.
 6、Speech recognition framework
  · 支援語音識別庫.
 7、Miscellaneous API additions
  · LocationManager -應用可以接收到位置改變的資訊.
  · WebView - 觸控start/end/move/cancel DOM 事件的支援
  · 重建Sensor Manager APIs
  · GLSurfaceView - 建立OpenGL 應用更加方便的framework .
  · 軟體升級安裝成功的Broadcast Intent - 更加平和優秀的軟體升級體驗

Android 1.6 API變更概要:
 1、UI framework
  · 新的類 android.view.animation 控制動畫行為:
  o AnticipateInterpolator
  o AnticipateOvershootInterpolator
  o BounceInterpolator
  o OvershootInterpolator
 2、· 新的XML 屬性android:onClick ,從一個layout檔案描述一個view的 View.OnClickListener.
  · 對不同解析度的螢幕的新的支援. 對於Bitmap和Canvas會執行有針對性的縮放行為.該框架會根據螢幕解析度和其他內容自動縮放bitmap等.
  要在你的應用中使用Android 1.6包含的API的話你必須要設定 "4"屬性在manifest的 元素中
 3、Search framework
  · 應用程式現在可以公開的有關內容,作為建議放入快速搜尋框,新的裝置範圍內的搜尋功能,是可從主螢幕搜尋。為了支援這一點,搜尋框架增加了新的屬性,可搜尋的後設資料檔案。有關完整的資訊,請參閱SearchManager文件。
 4、Accessibility framework
  · New android.accessibility package that includes classes for capturing accessibility events and forwarding them to an AccessibilityService handler.
  · New AccessibilityService package that lets your application track user events and provide visual, audible, or haptic feedback to the user.
 5、Gesture Input
  · 新的gesture API :建立,識別,讀取,儲存手勢.
 6、Text-to-speech
  · 新的android.speech.tts 包提供了TTS文字朗讀功能,從一個文字生成一個聲音檔案的回放.
 7、Graphics
  ·android.graphics 中的類,現在支援為不同的螢幕尺寸進行縮放.
 8、Telephony
  · 新的SmsManager 傳送和接受簡訊.
 9、Utilities
  · 新的DisplayMetrics 欄位決定當前裝置螢幕的密度.
 10、Android Manifest elements
  o 新的 元素
  o 新的 標籤
  o glEsVersion: 指定最小openGL ES的版本
  ·
  11、元素的新的屬性:
  o 目標SDK版本: 應用程式能夠指定目標版本. 它能夠執行在舊版本(低至minSdkVersion), 他是按照應用程式的指定版本開發的. Specifying this version allows the platform to disable compatibility code that is not required or enable newer features that are not available to older applications.
  o maxSdkVersion: 指定設計這個程式執行的最高版本 重要: 當使用 這些屬性前請認真閱讀文件.
 12、New Permissions
  · CHANGE_WIFI_MULTICAST_STATE: 允許應用進入Wi-Fi 多點傳送模式.
  · GLOBAL_SEARCH: 允許全域性搜尋系統,以便精確確定 content provider.
  · INSTALL_LOCATION_PROVIDER: 允許應用在Location Manager.安裝一個location provider.
  · READ_HISTORY_BOOKMARKS: 允許應用讀取(並不能寫) 使用者的瀏覽記錄和書籤
  · WRITE_HISTORY_BOOKMARKS: 允許應用寫入 (並不能讀) 使用者的瀏覽記錄和書籤
  · WRITE_EXTERNAL_STORAGE: 允許程式寫入外部儲存器.應用程式使用API級別3下將預設授予此許可權 (這對使用者可見的); 應用程式使用API level4 或者更高的,必須要明確的宣告此許可權.

Android 2.0 API變更概要:
 1、Bluetooth
  · 開啟關閉藍芽
  · 裝置和服務發現
  · 使用 RFCOMM連線一個可插拔的裝置收發資料
  · 公佈RFCOMM 服務和監聽接收 RFCOMM 連線
 2、Sync adapters
  · 新的APIs, 同步橋接器連線任何backend
 3、Account Manager
  · 集中的帳戶管理器 API ,安全的儲存和使用可信的tokens/passwords
 4、Contacts
  · 新的通訊APIs 允許獲取多個賬戶的資料.
  · 新的快速通訊framework APIs 允許開發者在他們的應用中建立通訊標記, 一鍵點選標記開啟一個新的視窗展示一個如何聯絡當前人的列表.
 5、WebView
  · 不贊成使用的類: UrlInterceptHandler, Plugin, PluginData, PluginList, UrlInterceptRegistry.
 6、Camera
  · 顏色模式, 場景模式 閃光模式, 焦點模式, 白平衡 旋轉和其他設定的新的特徵.
  · 當縮放級別改變的時候,會回撥新的縮放回撥介面.
 7、Media
  · MediaScanner現在為所有圖片生成縮微圖when they are inserted into MediaStore.
  · 新的縮微圖 API : 檢索需要的圖片和視訊的縮微圖.
 8、Other Framework
  · android.R.style 中新的系統主題,能夠更加簡單的顯示當前acitivities的系統桌布或者保持之前的activity在後臺.新的桌布管理器API 取代並且增加了wallpaper APIs ,我們可以允許我們的應用要求設定系統桌布.
  · 新的Service APIs幫助應用準確的處理Service 生命週期 ,在指定的低記憶體狀態下service將會被關閉.
  o Service.setForeground() 不推薦使用,並且現在這個方法並沒有實際執行. .他被一個新的API所取代, startForeground(), that helps (and requires) associating an ongoing notification with the foreground state.
  · MotionEvent 如果裝置允許的話,MotionEvent 會返回多點觸控資訊.最多可同時獲取3點
  · KeyEvent 現在有了新的按鍵傳送 APIs,去幫助實現 action-on-up 和長按鍵行為, 一個新的機制取消按鍵 (虛擬按鍵).
  · WindowManager.LayoutParams 現在有了新的常量允許視窗能夠在被鎖或者其他的狀況中喚醒螢幕,這個允許程式能夠讓例如鬧鐘等的應用實現喚醒裝置.
    ·New Intent APIs 廣播裝置的對接狀態,當這個裝置放在桌面或者停車場,允許程式啟動特殊的activity.
 9、Key events executed on key-up
  Android 2.0能夠使用虛擬按鍵HOME, MENU, BACK和SEARCH,而非物理按鍵,為了讓使用者在他們的裝置中獲得最好的使用者體驗,android平臺現在把這些按鍵執行加入到了key-up,做了 key-down/key-up 配對,而非只有key-down.,這有助於防止意外按鈕事件,並讓使用者按下按鈕區域,然後拖動而不生成一個事件出來。
  這種改變只會影響你的應用程式一點,如果它是攔截按鈕事件,最好用key-down,而不是key-up.。特例,如果您的應用程式攔截BACK 鍵,你應該確保你的應用妥善處理按鍵事件。

Android 2.0.1 API變更概要:
  · 新的快速聯絡人標記風格(quickContactBadgeStyle)* 屬性,讓應用的QuickContactBadge 元件接收必要的風格.
  · 當在manifest裡面宣佈了filter,取消了支援 ACTION_CONFIGURATION_CHANGED 廣播 ,如果想要去接收這個廣播, 這個應用必須註冊 registerReceiver(BroadcastReceiver, IntentFilter).
  效能上的改變:
    1、Bluetooth
  改變了 ACTION_REQUEST_ENABLE 和ACTION_REQUEST_DISCOVERABLE的返回值
  · ACTION_REQUEST_ENABLE 如果藍芽是成功開啟的,現在返回RESULT_OK .如果使用者拒絕開啟藍芽的請求,則會返回RESULT_CANCELED .
  · ACTION_REQUEST_DISCOVERABLE 如果使用者拒絕啟動藍芽或者藍芽的可發現功能,則返回 RESULT_CANCELED .
  2、通訊
  The ACTION_INSERT Intent returns RESULT_CANCELED in cases where the contact was not persisted (例如剪下儲存到一個空的操作裡面).
  修復錯誤:
  3、資源
  現在framework可以正選擇應用資源的根據API等級劃分的資料夾(drawable-v4是API level4版本用的資源).現在的版本這個功能不能正常工作的問題已經修復.
  4、Contacts
  The ACTION_INSERT Intent now returns the appropriate kind of URI when the request is made using the (now deprecated) Contacts APIs.
  5、Other Framework fixes
  · getCallingPackage() 現在正確的報告包名, 而不是程式名.

Android 2.1 API變更概要:
 1、?Live Wallpapers 動態桌面
?   以下增加的API可以提供你開發動態的桌面:
  · 新android.service.wallpaper 包.
  · 新WallpaperInfo 類.
  · 升級的WallpaperManager.
  附加說明, 如果你的應用相提供Live Wallpapers的功能, 你必須記得增加一個 元素到你的應用manifest裡面. 宣佈這個屬性android:name="android.software.live_wallpaper". 舉例:
 2、電話
  · 新的SignalStrength 類提供當前網路訊號的一些資訊這些資訊可以從onSignalStrengthsChanged(SignalStrength) 回撥.
  · 新的onDataConnectionStateChanged(int, int) 回撥.
 3、Views
  · 新的View 方法isOpaque() 和onDrawScrollBars(Canvas).
  · 新的RemoteViews 方法addView(int, RemoteViews) 和removeAllViews(int).
  · 新的ViewGroup 方法isChildrenDrawingOrderEnabled() 和setChildrenDrawingOrderEnabled(boolean).
 4、WebKit
  · 新的WebStorage 方法操作網頁資料快取.
  · 新的GeolocationPermissions 方法獲取 Geolocation permissions 的出處, 把他們設定到 WebView上.
  · 新的WebSettings 方法管理軟體快取, 網頁快取 和螢幕的縮放.
  · 新的WebChromeClient 方法處理視訊, 歷史記錄, 自定義view, 軟體快取限制還有其他??

Android 2.2 API變更概要:
 1、對Microsoft Exchange更好的支援。
    Android的幾個新特性使之更適於Exchange企業環境。其中一些新特性列舉如下:基於使用者名稱/密碼的         Exchange帳號自動檢測支援Exchange日曆的同步
  改進的安全性,管理員可以跨越裝置強制應用安全策略
  恢復出場設定——管理員可以將裝置重置為出場設定,這樣就能在裝置被偷或丟失後擦除上面的敏感資料了
  全域性的地址列表查詢——可以根據伺服器端返回的列表幫助使用者自動填充收件人的郵件地址
  裝置管理API。Android 2.2改進並新增了大量的裝置管理API,開發者可以將其用在應用當中:
  應用資料備份API——可以將應用資料備份到雲中。如果使用者切換到另一個Android裝置,他就可以從之前的裝置中恢復資料。
 2、Cloud-to-Device訊息API。雲中的使用者/系統可以憑藉這種增強在裝置上觸發動作。該特性可以將移動警告發給手機並且支援雙向的推同步服務。
    可以直接在外部的記憶體裝置(SD卡)上安裝應用,還可以將應用從內部遷移到SD卡上,反之亦然。
 3、網路共享。Android 2.2可以通過一臺Android電話提供的熱點將多個服務連線到Internet上。
  效能。藉助於新式的Dalvik JIT編譯器,對於CPU密集型應用來說,Android 2.2的速度要比Android 2.1快2~5倍。根據Linpack基準測試結果,安裝了Froyo的Nexus
  One電話可以達到37.5 MFlops,而同樣的電話如果使用Android 2.1的話才有6.5 MFlops。
  更快的瀏覽速度。由於瀏覽器現在使用了Chrome V8引擎,JavaScript程式碼的處理速度要比Android 2.1快2~3倍。
  從瀏覽器中訪問裝置API。現在可以直接從瀏覽器中訪問大量的裝置API,如加速器、相機、聲音識別、翻譯等,這樣Web應用就能以前所未有的方式與裝置互動了。比如說,使用者可以在拍完照後將其上傳到網上,而這一切都是在瀏覽器內完成的。
 4、支援Flash 10.1。Froyo支援最新的Flash 10.1
  Beta版。最近,JIT編譯器的引入極大地改進了效能,這對Flash應用的執行起到了巨大的幫助作用,因為大家都知道,Flash應用是一種CPU密集型應用。
  Android商店。Android 2.2開發者和商店使用者會從如下新特性中受益無窮:
  可以在Android商店搜尋應用,包括應用資料
  更新——點選一次按鈕後會自動更新所有應用
 5、崩潰與凍結報告。Android2.2整合了崩潰/凍結報告特性,這樣在崩潰時使用者就可以將完整的細節資訊報告給應用釋出者了
  從PC上瀏覽商店並將應用直接下載到裝置上。使用者可以通過PC選擇商店的應用,之後應用就可以發到到載入的裝置上。要想使用這個特性,使用者需要登入並且裝置需要在Android商店註冊-
 6、音樂管理。使用者可以將Windows Media或Mac iTunes上的所有非DRM音樂轉換到Android裝置上播放。

Android 2.3 API變更概要: 
Android 2.3薑餅釋出,代號Gingerbread,包含哪些新特性和改進呢? 
   1. 新增android.net.sip包,名為SipManager類,可以輕鬆開發基於Sip的Voip應用。同時使用時必須至少包含這兩個許可權 <uses-permission android:name="android.permission.INTERNET"> and <uses-permission android:name="android.permission.USE_SIP">,如果需要在Market上過濾僅顯示支援VoIP API的機型,可以在釋出時androidmanifest.xml中加入 <uses-feature android:name="android.software.sip" android:required="true"> 和 <uses-feature android:name="android.software.sip.voip"> 這兩個標誌。 
  2. Near Field Communications (NFC) 近距離通訊的支援,NFC可以在不接觸的情況下實現資料交換通訊,可以很好的代替RFID SIM卡實現手機支付等擴充套件功能,當然Android123提示這需要硬體的支援 
,新增包在 android.nfc包含NfcAdapter,NdefMessage,NdefRecord等類,類似藍芽的處理方式,使用該API需要宣告許可權<uses-permission android:name="android.permission.NFC"> ,同時在Market上過濾支援NFC的裝置需要加入<uses-feature android:name="android.hardware.nfc" android:required="true">這句。 
  3. 新增陀螺儀和其他的感測器支援 
  Android 2.3加入了一些新的感應器,比如gyroscope陀螺儀, rotation vector旋轉向量, linear acceleration線性加速器 gravity和barometer氣壓計的支援。如果過濾這些功能,釋出時加入類似<uses-feature android:name="android.hardware.sensor.gyroscope" android:required="true">到androidmanifest.xml中。 
  4. 多攝像頭支援 
新增 Camera.CameraInfo 可以管理攝像頭前置或後置 
新增 getNumberOfCameras(), getCameraInfo() 和 getNumberOfCameras() 獲取攝像頭數量。   
新增 get() 方法,可以獲取攝像頭配置資訊 CamcorderProfile 
新增 getJpegEncodingQualityParameter() 獲取jpeg編碼質量引數可以在 CameraPreview.java 檔案從ApiDemos示例程式中檢視。 
5. 新增拍照API 
  比如獲取焦距getFocusDistances()獲取預覽FPS getPreviewFpsRange(), 獲取焦距範圍 getSupportedPreviewFpsRange() 和設定教育 setPreviewFpsRange() 
6. 混響音效 
本次Android 2.3框架中加入了對混響音效的支援,比如低音,耳機和虛擬化等效果. 
新增 android.media.audiofx 包 
新增 AudioEffect 類提供音效控制 
新增音訊會話ID,設定 AudioTrack 和 MediaPlayer. 
新 AudioTrack 新增 attachAuxEffect()、getAudioSessionId()和 setAuxEffectSendLevel()。 
新 attachAuxEffect() ,getAudioSessionId(), setAudioSessionId(int), 和 setAuxEffectSendLevel() . 
相關音效在 AudioFxDemo.java 的 ApiDemos 示例。 
6. 照片EXIF資訊改進 
新增經緯度標籤在JPG格式的EXIF中,同時可以使用 getAltitude() 方法獲取經緯度的EXIF資訊 
新增setOrientationHint() 可以讓程式獲取視訊錄製的方向. 
7. 下載管理 
在Android 2.3中新增的下載管理支援長時間執行的Http下載服務支援。可以保證在手機重啟後仍然重試下載等操作,整個過程在後臺執行。 
通過 DownloadManager 類使用getSystemService(DOWNLOAD_SERVICE) 來例項化,通過 ACTION_NOTIFICATION_CLICKED 這個Intent來處理。 

8. 限制模式 
  可以幫助開發者監控他的應用的效能,處理執行緒阻塞,避免ANR的發生。 
StrictMode.ThreadPolicy 和 StrictMode.VmPolicy 獲取VM相關資訊. 
使用限制模式優化的Android應用程式可以檢視android.os.StrictMode包的具體介紹。 

Android 3.0 API變更概要: 
Android 3.0 SDK中新增了哪些API呢? 我們總結下平板系統honeycomb中的新特性, 首先需要澄清的是經過Android123發現設定模擬器的解析度到普通WVGA這樣的解析度時平板的特性自動消失和Android 2.3沒有什麼太大區別,按照這樣來看未來Android 3.0除了相容平板外還繼續可以被手機所支援,據稱3.0的程式碼針對A9雙核CPU進行了進一步的改進。 
  一、Fragments 碎片容器 
  有關Android Fragments的內容,Android開發網在前幾天已經用幾篇文章詳細講解了下,大家可以從Fragment對比Activity - Android碎片介紹 一文開始瞭解。 
  二、Action Bar 活動欄 
  活動欄Action Bar可以替換傳統的標題欄在Activity視窗中,包括程式圖示和一些新介面在activity的選項選單中,另外Action Bar允許你 
  Include select menu items directly in the Action Bar—as "action items"—for quick access to global user actions. 
  In your XML declaration for the menu item, include the attribute, android:showAsAction with a value of "ifRoom". When there's enough room in the Action Bar, the menu item appears directly in the bar. Otherwise, the item is placed in the overflow menu, revealed by the icon on the right side of the Action Bar. 
  Add interactive widgets to the Action Bar—as "action views"—such as a search box. 
  In the XML for the menu item that should behave as an action view, include the android:actionViewLayout attribute with a layout resource for the action view or android:actionViewClass with the class name of the widget. Like action items, an action view appears only when there's room for it in the Action Bar. If there's not enough room, it is placed in the overflow menu and behaves like a regular menu item (for example, an item can provide a SearchView as an action view, but when in the overflow menu, selecting the item activates the search dialog). 
  Add an action to the application logo when tapped and replace it with a custom logo 
  The application logo is automatically assigned the android.R.id.home ID, 
which the system deliveres to your activity's onOptionsItemSelected() callback when tapped. Simply respond to this ID in your callback method to perform an action such as go to your application's "home" activity. 
  To replace the icon with a logo, 
  Add breadcrumbs for navigating backward through fragments 
  Add built in tabs and a drop-down list for navigation 
  Customize the Action Bar themes and custom backgrounds 
  有關ActionBar的文章,可以參考 Action Bar使用方法 - Android活動欄 系列文章 
  三、System clipboard系統剪下板 
  Android 3.0中的剪下板進行了增強,本次可以支援除了純文字外更多的內容,如,URL和Intent,對於剪下板類ClipboardManager仍然通過 getSystemService(CLIPBOARD_SERVICE)來例項化,新增的ClipData類用於管理具體的複製物件,可以在SDK的 android.content.ClipData.Item中找到。具體的使用Android123將在今後的文章中寫道。 
  四、拖拽 
  開始拖拽內容在你的Activity中可以使用startDrag()方法在一個View中,這裡View.DragShadowBuilder提供了拖拽時的陰影,對於拖拽的過程處理可以通過OnDragListener通過View的setOnDragListener()來設定,在拖拽的時候系統會自動呼叫onDrag()方法。 
  五、增強的appWidgets 
  Android 3.0的appWidget開始支援更豐富的控制元件,比如GridView, ListView, StackView, ViewFlipper和AdapterViewFlipper.而以前必須通過RemoteView顯示一個文字或圖片,本次全新的 RemoteViewsService增強了桌面小外掛的功能。 
  六、增強的狀態提示欄 
  新增的Notification API可以豐富你的狀態列,新的Notification.Builder類可以幫助你輕鬆實現,支援大圖示提示資訊通過setLargeIcon方法,通常顯示一些社交類的軟體,比如聯絡人照片,或相簿縮圖,設定自定義狀態列,可以使用setTicker()方法。 
  七、內容載入器 
  新框架API提供了一個非同步載入內容的淚,合併和UI元件和fragment來動態載入資料從工作者現成,使用CursorLoader子類來獲取ContentResolver中的資料. 
  八、A2DP藍芽和耳機控制API 
  Android honeycomb中沒有忘記再次增強藍芽,你可以通過初始化BluetoothProfile通過呼叫getProfileProxy()在處理 A2DP或耳機HEADSET設定,BluetoothProfile.ServiceListener可以獲取客戶端連線或斷開的回撥。 
  九、動畫框架 
  3.0中Android再次增強動畫播放類,ObjectAnimator和LayoutTransition需要大家瞭解一些。 
  十、擴充套件UI框架 
  新增以下UI控制元件 
  AdapterViewAnimator 
  AdapterViewFlipper 
  CalendarView 
  ListPopupWindow 
  NumberPicker 
  PopupMenu 
  SearchView 
  StackView 
  十一、圖形相關 
  1. 2D圖形硬體加速Hardware accelerated 2D graphics , 在androidmanifest.xml的元素中新增android:hardwareAccelerated="true" 即可。他可以優化程式執行更平滑高效,在滾動和動畫方面。 
  2.設定渲染模式,比如 LAYER_TYPE_HARDWARE 硬體加速和 LAYER_TYPE_SOFTWARE 使用 setLayerType() 方法. 

 

 

  3.渲染指令碼對於3D圖形方面大家可以看看Renderscript類。

 

 

Android3.1

Honeycomb

(蜂巢)

2011年5月11日在Google I/O開發者大會宣佈釋出,版本主要更新如下:

Honeycomb 蜂巢(改進3.0BUG)

經過優化的Gmail電子郵箱;

全面支援GoogleMaps

將Android手機系統跟平板系統再次合併從而方便開發者。

工作管理員可滾動,支援USB 輸入裝置(鍵盤、滑鼠等)。

支援 Google TV.可以支援XBOX 360無線手柄

widget支援的變化,能更加容易的定製螢幕widget外掛。

Android3.2

Honeycomb

(蜂巢)

2011年7月13日釋出,版本更新如下:

支援7英寸裝置

引入了應用顯示縮放功能

Android4.0

Ice Cream Sandwich

(冰激凌三明治)

2011年10月19日 在香港釋出,

4.0(Ice Cream Sandwich 冰激凌三明治)版本主要更新如下:

1、藍色主題

2、接近於桌面版的Chrome Lite瀏覽器,有離線閱讀,同步Chrome書籤,新的標籤樣式等。

3、截圖功能

4、更強大的圖片編輯功能

5、自帶照片應用堪比Instagram,可以加濾鏡、加相框,進行360度全景拍攝,照片還能根據地點來排序

6、Gmail加入手勢、離線搜尋功能,UI更強大。

8、新增流量管理工具,可具體檢視每個應用產生的流量。

9、正在執行的程式可以像電腦一樣的互相切換

10、人臉識別功能

11、系統優化、速度更快

12、支援虛擬按鍵,手機可以不再擁有任何按鍵

13、專為3D優化的驅動

14、平板電腦和智慧手機通用

Android 4.1/4.2

Jelly Bean

(果凍豆)

繼“冰激凌三明治”之後的下一版Android系統,於2012年6月28日釋出。

Android4.1果凍豆:

1、新增了基於時間和位置的語音搜尋:Google Now。

2、增加離線語音輸入,即不需要聯網也能夠語音輸入。

3、增強通知中心。

4、Google Play增加內容訂閱購買功能。

5、新的安卓彩蛋。

Android 4.2:

1、完整的Chrome瀏覽器。

2、全新的手機風景模式。

3、全新的檔案管理器。

4、Android Key Lime Pie精簡版。

5、具有開關切換的使用者介面。

6、全新的電源管理系統。

7、全新的鎖屏介面。

8、全新的時鐘介面。

Android5.0

“棒棒糖”(Lollipop)

 

Android 4.3的基礎上已經包含在果凍豆-垂直同步定時三重緩衝, 減少觸控延遲CPU輸入提振,和 硬體加速2D渲染的效能改進-增加了新的優化,讓Android甚至更快。

優化的位置和感測器功能.

新媒體功能


模組化DRM框架

為了滿足下一代媒體服務的需求,安卓4.3採用模組化DRM框架,使媒體應用程式開發人員更容易地整合到自己的流媒體協議,如MPEG DASH(通過HTTP的動態自適應流,ISO / IEC 23009的DRM -1)。

通過新的API和增強現有API的組合,媒體DRM框架提供了一個整合的服務許可管理和配置,訪問低階別的編解碼器,解碼加密的媒體資料。一個新的MediaExtractor API可以讓你得到的PSSH為DASH媒體的後設資料。使用媒體DRM框架的應用程式管理許可證伺服器,網路通訊,從內容庫中的加密資料流處理。

VP8編碼器

的Android 4.3引入了內建的支援VP8編碼,從框架和本地的API訪問。對於使用本地API的應用程式,該平臺包括的OpenMAX 1.1.2擴充套件頭,支援VP8型材和水平。支援包括VP8編碼的目標位元率,控制率,幀速率,令牌分割槽,錯誤恢復,重建和環路濾波器的設定。該平臺API介紹VP8編碼器支援各種格式,所以你可以利用的最佳格式內容。

VP8編碼是可在所有相容的裝置執行Android 4.3的軟體。為了獲得最高的效能,該平臺還支援硬體加速的VP8編碼功能的裝置。

從表面的視訊編碼

在Android 4.3開始,你可以使用一個表面作為視訊編碼器的輸入。例如,你現在可以直接從OpenGL ES的表面流的編碼器,而非緩衝區之間複製。

媒體MUXER

應用程式可以使用新的的媒體MUXER API基本的音訊和視訊流結合成一個單一的輸出檔案。目前,應用程式可以複用的MPEG-4音訊流和一個單一的MPEG-4視訊流成一個單一的MPEG-4輸出中的檔案。新的API是在Android 4.2中引入的的媒體解復API對應。

在遠端控制客戶端的播放進度和洗滌

由於Android 4.0,媒體播放器以及類似的應用已經能夠提供播放控制,如遠端控制客戶端裝置鎖屏,通知和遠端裝置通過藍芽連線。這些應用程式可以在Android 4.3開始,現在還公開播放進度和速度,通過遠端控制客戶端,並接收命令跳轉到一個特定的播放位置

 

對於圖形效能提升,現在的硬體加速2D渲染 優化流繪圖命令,把它變成一個更高效的GPU格式重新整理和合並繪製操作。對於多執行緒處理,渲染也可以使用跨多個CPU核心的多執行緒執行某些任務。

也提高了Android 4.3的形狀和文字的渲染。圓和圓角矩形的形狀,如正在呈現較高質量的更有效的方式。文字優化,包括增加效能,當使用多種字型或複雜的字形集(CJK),較高的呈現品質縮放文字,和更快的渲染陰影。

改進視窗緩衝區分配結果為您的應用程式在一個更快的影象緩衝區分配,減少所花費的時間,當你建立一個視窗開始渲染。

對於最高圖形效能,Android 4.3的推出的OpenGL ES 3.0的支援, 並對其進行訪問的應用程式通過框架和原生API。在支援的裝置上,硬體加速2D渲染引擎優勢的OpenGL ES 3.0,,優化紋理管理和提高梯度渲染保真度

 

企業和安全


Wi-Fi配置為WPA2-企業網路

 

應用程式現在可以配置無線網路的憑據,他們需要連線到WPA2企業接入點。開發人員可以使用新的API,配置的可擴充套件身份驗證協議(EAP)在企業中使用的身份驗證方法和封裝的EAP(二期)憑證。有權訪問和更改Wi-Fi的應用程式可以為各種EAP和第2階段的驗證方法配置身份驗證憑據。

Android的沙箱與SELinux增強

現在Android使用SELinux的,強制訪問控制(MAC)系統在Linux核心中增加UID基於應用程式沙箱。這保護的作業系統對潛在的安全漏洞。

鑰匙扣增強

現在的鑰匙扣API提供了一種方法,使應用程式,以確認系統全鍵繫結的裝置的硬體信任根。這提供了一個地方建立或儲存的私鑰 不能被出口的裝置,即使是在一個根或核心妥協的事件。

Android的金鑰庫提供

的Android 4.3引入了一個keystore提供商的API,允許應用程式建立獨家使用金鑰。使用API,應用程式可以建立或儲存的私鑰無法看到或使用其他應用程式,並可以新增到無需任何使用者互動的keystore。

金鑰庫的供應商提供的鑰匙扣API相同的安全性優點,提供全系統的憑據,如繫結憑據裝置。不能匯出私鑰金鑰庫關閉裝置。

限制Android應用程式的setuid

 

Android 4.4 ,

許可權

啟動快捷鍵

在API 19中 已經新增了INSTALL_SHORTCUTUNINSTALL_SHORTCUT許可權進公佈的SDK 。公開這些許可權是必要的,它使得應用在裝置的載入介面直接新增或刪除快捷圖示。

這些許可權實際上並不是新功能。它們在Android 1.x 的時候就已經被定義好了,在那個時候這些許可權是被定義在初始化應用裡面而不是公開在SDK, 所以使用了新許可權的應用可以獲得許可權所設定的能力,同時也能執行在老版本的安卓裝置上。

外部儲存

外部儲存的規則改變了。回到4.1,讀取外部儲存許可權被引入作為寫外部儲存許可權的一個補充,而在那個時候並不是必須的。現在,這個許可權在4.4中被加強了,但是以一種不同尋常的方式。從訪問控制角度來看,外部儲存被分成兩個主要部分:1、App所在的目錄;2、其他地方。

讀取或者寫入資料到你的App所在的位置,不需要任何許可權。這基本可以適用任何通過Context裡面的方法可以訪問的目錄,比如getExternalFilesDir()getExternalCacheDir()。如果只使用這些目錄,你甚至可以刪除你的應用程式中WRITE_EXTERNAL_STORAGE許可權。

為了讀取外部儲存上其他資料,應用必須獲得READ_EXTERNAL_STAROAGE
WRITE_EXTERNAL_STORAGE許可權(兩者都需要被授權讀許可權)。這些可以通過Environment獲得的目錄,比如Environment裡面的getExternalStoragePublicDirectory()getExternalStorageDirectory()函式。

 

點陣圖重用

 

為了更進一步幫助應用程式減少記憶體佔用,android 4.4 建立了重用點陣圖分配的API。簡單來說點陣圖分配使得開發者很快達到堆限制。從Android 3.0 開始,使用BitmapFactory解碼資料時候就可以重用點陣圖例項(使用 BitmapFactory.Options 中的inBitmap ),但是約束相當的大。圖片必須恰好是同樣的尺寸和配置,並且只允許JPEG/PNG解碼。

在Android 4.4中,我們現在有Bitmap.reconfigure()去修改和使得現有的例項去適應新的尺寸和畫素配置。BitmapFactory 已經被更新,之前在沒有這些約束的條件下通過重配置可以重用inBitmap

但是約束還是存在的。當點陣圖被建立,它有尺寸大小和配置,其中配置定義了分配的總位元組數。對於例項來說這種初始分配大小是不能被改變的。所以當我們多次重配置點陣圖時,每次改變都不可以讓需要的位元組數超過初始分配大小。

舉個例子,可以安全的重配置一個ARGB_8888 200*200例項為ARGB_8888 100*100,或者300*300 RGB_565, 為所有的這些與初始分配相適應。如果試圖重配置到ARGB_8888 300*300,這樣會丟擲異常。另外一點也很重要,當點陣圖被連線到檢視的時候,不能重配置。應該在這個元素被分離或者移出螢幕。

換句話說,如果你的應用程式可確定一個合適大小的單個例項,即使它可能比需要在任何給定時間的畫素較大,仍然可以減少記憶體使用。單個360KB點陣圖重用為300×300和200×200的影象(顯然不能同時顯示),是比兩個單獨的例項需要520KB(360KB+160KB)更好。

更智慧的集合類

為了加入SparseArraySparseIntArray及其他同族行列,Android 4.4引入了一個新的記憶體高效的集合ArrayMapSparseArray是通過減少必要的分配從而使用原語作為鍵來提高效能,ArrayMap允許使用物件全鍵值對映,但遠遠比java.util.HashMap中容量大小更具侵略性,物件分配隨著命中率和容量增加而減少。ArrayMap大小隨著個體的刪除減少從而保持低記憶體,一些人們不能從java.util中的期望。除了作為android.util在API級別19的一部分;ArrayMap也在支援庫的v19,所以你可以盡情使用,即使你不一定針對4.4。

Immersive模式

Android 4.4引入了一組新的佈局標誌可用於標記系統UI的可見性。從4.0開始,應用有隱藏狀態列和軟導航按鈕功能,並暫時使用View.SYSTEM_UI_FLAG_FULLSCREENView.SYSTEM_UI_FLAG_HIDE_NAVIGATION標誌為“精益回”體驗,視訊內容會佔用整個顯示螢幕。然而,這種模式不是互動式的,而只要使用者點選螢幕上任意位置UI控制元件立刻返回(你的應用程式沒有收到的一個事件)。

為了增強這一點,在Android的4.4新增了View.SYSTEM_UI_FLAG_IMMERSIVEView.SYSTEM_UI_FLAG_IMMERSIVE_STICKY。在與所提及的場景中使用這些標誌,可以在同一個系統中隱藏使用者介面,當與使用者的全屏應用程式內容進行互動時候還是保持這種方式。對於讓使用者無需導航控制元件,谷歌仍持謹慎態度。但是一個系統級的邊緣輕掃手勢允許他們在任何時候返回,使用者第一次體驗這種模式下,系統將疊加出現,迫使確認使用者瞭解如何讓UI控制元件回來。

更靈活的方法

與系統管理的計時器相關的週期性行為在預設情況下會變得更靈活,比如計時器中的AlarmManagerSyncAdapter。這樣做的目的是,允許系統儘可能批量處理事件並且減少裝置上的喚醒事件以節約電量。

之前的精確方法AlarmManger.set()AlarmManger.setRepeating(),現在的行為更接近於AlarmManger.setInexactRepeating()並且從屬於事件批處理。

從4.4開始,沒有任何方法可以建立一個重複的精確鬧鐘。如果你需要鬧鐘精確並且可重複,必須呼叫新的setExact()方法並且在每個觸發事件中設定新的鬧鐘。

WebView

在4.4中,WebView也有一些新的改變,現在是完全建立在谷歌的Chromium原始碼上。帶來的效能改進和來自HTML5和CSS3新功能,但它也意味著有一些行為上的差異需要開發者適應。

capturePicture()被正式棄用,這是為了支援一個獲得WebView內容快照更標準的方法。比如手動觸發的onDraw()可以繪製成點陣圖支援Canvas。

此外,evaluateJavascript()提供了執行JavaScript的新方法,這新方法支援回撥。然而具有同樣功能的loadURL()方法並沒有不被鼓勵使用或在文件中被棄用。

谷歌提供了一個很好的文件,包含所有可能會遇到遷移到新的WebView的問題細節。

App Ops迴歸

在4.3初現的App Ops功能現在還沒完全準備好。但是有一些已經還是在4.4 SDK中暴露了出來。

現在已經有AppOpsManager, 這是一個系統服務用於執行應用程式可以沿著它當前的靜態許可權執行的操作。雖然還不清楚這個API最終將發揮什麼作用,但是我們可以看到AppOpsManger所負責的一些操作型別。每個操作由一個OPSTR_常量定義,並且在Android4.4中,他們都被用作處理使用者位置。

不管我們喜歡還是不喜歡,動態許可權執行的模型將會來臨。在隨後SDK的發展需要密切關注這些元素。

新執行時

自從誕生以來,Android一直依賴虛擬機器執行時,即是我們稱之為Dalvik,它被用來執行許多應用程式被編譯後生成的Java位元組碼。Dalvik是從自下而上構建的,提供給安卓Java執行時,使得安卓適合於作業系統需要的程式隔離和安全模式。

然而在Android的4.4中,我們可以看到Dalvik的生命週期是有限的,並且將很快由一個完全新的實現被稱為Android的執行時(ART)的替換。它還鮮為人知,超過我們收到的介紹範疇。主要的區別似乎是ART將在安裝時把Dex位元組碼編譯成本地指令,而不是Dalvik通過使用實時(JIT)編譯模型在執行時處理這些。與一些報導相反,似乎沒有被任何證據表明這種變化是在全是根據有關Java語言的許可或所有權問題。

ART編譯器似乎支援兩種模式:快速模式和便攜模式。快速模式是類似於JIT(在執行時編譯的程式碼),而便攜模式似乎使用LLVM關聯預編譯。這LLVM的連線可能最終解釋的幾個版本以前的AOSP的GDK專案神祕現象。

在Nexus 5的裝置上,ART被啟用從而可以被用來代替Dalvik,這樣就允許開發者來測試應用程式和提供有關可能突然出現的新的執行時環境中的任何問題的反饋。所有的開發人員都至少嘗試開發啟用了ART的應用程式並且報告任何有趣的發現給Google。

對於 Android 5.0,預設執行時現在是 ART。Android 5.0,預設執行時現在是 ART。
主要包括下面的一些新功能:
預先 (AOT) 編譯
經過改進的垃圾回收 (GC)
經過改進的除錯支援
大多數 Android 應用應該不用做出任何更改即可直接在 ART 下執行。不過,Dalvik 上執行的部分技術在 ART 上無法執行。要了解最重要的問題,請參閱在 Android 執行時  (ART) 上驗證應用行為。請特別注意以下情況:
您的應用使用 Java 原生介面 (JNI) 執行 C/C++ 程式碼。
您使用的開發工具可生成非標準程式碼(例如某些混淆程式碼)。
您使用的技術與垃圾回收壓縮不相容。(雖然 ART 當前沒有實施垃圾回收壓縮,但在 Android 開放原始碼專案中,垃圾回收壓縮正處於開發階段)。
如果您的應用實施通知…
請確保您的通知能夠反映出 Android 5.0 的這些變化。要詳細瞭解如何設計適用於 Android 5.0 及更高版本的通知,請參閱通知設計指南。
Material Design 設計樣式
通知是在白色(或顏色非常淺的)背景上繪製的深色文字,以便與新的 Material Design 設計小部件協調一致。請確保所有通知在新的配色方案下都能夠正常顯示。如果通知無法正常顯示,請予以修復:
使用 setColor() 在圖示圖片後面的圓圈中設定一種強調色彩。
更新或移除有顏色的資源。系統會忽略操作圖示和主通知圖示中的所有非 Alpha 通道。您應當假定這些圖示僅包含 Alpha 通道。系統會用白色來繪製通知圖示,而用深灰色來繪製操作圖示。
聲音和振動
如果您當前在使用 Ringtone、MediaPlayer 或 Vibrator 類為通知新增聲音和振動,請移除該程式碼,這樣系統才能以優先模式正常呈現通知。若要新增聲音和振動,請改用 Notification.Builder 方法。
將裝置設定為 RINGER_MODE_SILENT 會導致它進入新的優先模式。如果將裝置設定為 RINGER_MODE_NORMAL 或RINGER_MODE_VIBRATE,則會使其退出優先模式。
以前,Android 將 STREAM_MUSIC 用作主音量流,以此來控制平板電腦裝置的音量。在  Android 5.0 中,手機和平板電腦裝置的主音量流現已統一,均由 STREAM_RING 或 STREAM_NOTIFICATION 控制。
通知在鎖定螢幕上的公開程度
在 Android 5.0 中,通知現在預設顯示在使用者的鎖定螢幕上。使用者可以選擇不公開敏感資訊,這樣的話系統會自動修改通知顯示文字。要自定義這種經過修改的通知,請使用 setPublicVersion()。
如果通知不包含個人資訊,或者您希望在通知中顯示媒體播放控制元件,請呼叫 setVisibility() 方法,並將通知的公開程度的級別設定為 VISIBILITY_PUBLIC。垃圾回收 (GC)
經過改進的除錯支援
大多數 Android 應用應該不用做出任何更改即可直接在 ART 下執行。不過,Dalvik 上執行的部分技術在 ART 上無法執行。要了解最重要的問題,請參閱在 Android 執行時  (ART) 上驗證應用行為。請特別注意以下情況:
您的應用使用 Java 原生介面 (JNI) 執行 C/C++ 程式碼。
您使用的開發工具可生成非標準程式碼(例如某些混淆程式碼)。
您使用的技術與垃圾回收壓縮不相容。(雖然 ART 當前沒有實施垃圾回收壓縮,但在 Android 開放原始碼專案中,垃圾回收壓縮正處於開發階段)。
如果您的應用實施通知…
請確保您的通知能夠反映出 Android 5.0 的這些變化。要詳細瞭解如何設計適用於 Android 5.0 及更高版本的通知,請參閱通知設計指南。
Material Design 設計樣式
通知是在白色(或顏色非常淺的)背景上繪製的深色文字,以便與新的 Material Design 設計小部件協調一致。請確保所有通知在新的配色方案下都能夠正常顯示。如果通知無法正常顯示,請予以修復:
使用 setColor() 在圖示圖片後面的圓圈中設定一種強調色彩。
更新或移除有顏色的資源。系統會忽略操作圖示和主通知圖示中的所有非 Alpha 通道。您應當假定這些圖示僅包含 Alpha 通道。系統會用白色來繪製通知圖示,而用深灰色來繪製操作圖示。
聲音和振動
如果您當前在使用 Ringtone、MediaPlayer 或 Vibrator 類為通知新增聲音和振動,請移除該程式碼,這樣系統才能以優先模式正常呈現通知。若要新增聲音和振動,請改用 Notification.Builder 方法。
將裝置設定為 RINGER_MODE_SILENT 會導致它進入新的優先模式。如果將裝置設定為 RINGER_MODE_NORMAL 或RINGER_MODE_VIBRATE,則會使其退出優先模式。
以前,Android 將 STREAM_MUSIC 用作主音量流,以此來控制平板電腦裝置的音量。在  Android 5.0 中,手機和平板電腦裝置的主音量流現已統一,均由 STREAM_RING 或 STREAM_NOTIFICATION 控制。
通知在鎖定螢幕上的公開程度
在 Android 5.0 中,通知現在預設顯示在使用者的鎖定螢幕上。使用者可以選擇不公開敏感資訊,這樣的話系統會自動修改通知顯示文字。要自定義這種經過修改的通知,請使用 setPublicVersion()。
如果通知不包含個人資訊,或者您希望在通知中顯示媒體播放控制元件,請呼叫 setVisibility() 方法,並將通知的公開程度的級別設定為 VISIBILITY_PUBLIC。

安卓6.0的新特性,例如指紋檢測與識別,節電模式等。與此同時,Android 6.0也加入了更多的許可權控制,確保使用者隱私資料的安全。

 

如果你現在正在使用Android Studio,那麼直接在SDK管理器中下載即可,之後你就可以將正在進行的開發專案從“compileSdkVersion”升級到API 23,從而測試應用在安卓6.0下的表現。
  最後,谷歌也宣佈從今天起,Google Play應用商店將正式接受基於API 23所開發的應用上架,屆時,安卓6.0使用者們也將真正感受到新系統的魅力。

 

 

為了應用APP有更好的相容性,我們們可以利用高版本的SDK開發應用,並在程式執行時(Runtime)對應用所執行的平臺判斷,舊平臺使用舊的API,而新平臺可使用新的API,這樣可以較好的提高軟體相容性。

 

此標籤包含如下3個屬性:

android:minSdkVersion —— 此屬性決定你的應用能相容的最低的系統版本,一盤情況是必須設定此屬性。

android:targetSdkVersion —— 此屬性說明你當前的應用是針對某一個系統版本開發設計的,也就是說在這個系統版本上執行是沒有任何問題的。對於手機或其他終端裝置會根據此屬性值,決定是否顯示一些特性和效果。當然對於開發者最直接的影響就是,你所用到的API都是基於此版本上的,高於此targetSdkVersion的API在使用的時候會有警告或者錯誤提示。

android:maxSdkVersion ——  此屬性是決定你的應用能支援的版本最高是多少,超過此版本的系統將不能使用你的應用。

Android provides a unique code for each platform version in the Build constants class. Use these codes within your app to build conditions that ensure the code thatdepends on higher API levels is executed only when those APIs are available on the system.

private void setUpActionBar() {
    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

         ActionBar actionBar = getActionBar();
         actionBar.setDisplayHomeAsUpEnabled(true);
    }
} void setUpActionBar() {
    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

         ActionBar actionBar = getActionBar();
         actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

 

Note: When parsing XML resources, Android ignores XML attributes that aren’t supported by the current device. So you can safely use XML attributes thatare only supported by newer versions without worrying about older versions breaking when theyencounter that code. For example, if you set the targetSdkVersion="11", your app includes the ActionBar by defaulton Android 3.0 and higher. To then add menu items to the action bar, you need to set android:showAsAction="ifRoom" in your menu resource XML. It's safe to do this in a cross-version XML file, because the older versions of Android simply ignore the showAsAction attribute (that is, you do not need a separate version in res/menu-v11/).

 

在使用高於minSdkVersion API level的方法需要:

  1. @TargeApi($API_LEVEL) 使可以編譯通過, 不建議使用@SuppressLint("NewApi");
  2. 執行時判斷API level; 僅在足夠高,有此方法的API level系統中,呼叫此方法;
  3. 保證功能完整性,保證低API版本通過其他方法提供功能實現。

問題背景

鑑於ANDROID SDK 更新較快,很多新的特性和API在低版本中的可能沒有。所以開發過程中儘量要保持對新功能介面的相容。

一般開發過程中APP都會有一個最低版本的配置,例如如果要相容到android 2.2系統,則可以設定minSdkVersion=8,這就表明能向下相容到android 2.2版本,即APP能在android2.2版本上的手機也能正常執行,即使可能某些新特性的功能支援失效,但至少保證不會出現崩潰的問題,而避免此問題的方式就要求開發者在程式碼中做好相容和適配。

相容原則

一般選擇APP的最低支援版本原則是儘量向下保持相容,但也不是說越向下越好,主要的考慮因素有以下幾點:

1.      各個低版本手機的市場佔有率,比如2013年android 2.2的手機還佔用一定的市場份額,但到現在為止基本上該份額可以忽略不計了(目前android 最高的版本已達到android 5.1了)

2.      APP的針對使用者群體,比如是高階的使用者群體,屌絲使用者群體,還是中低端使用者群體,根據不同的使用者群體可以綜合出來決定對最低版本的支援。

基於SDK高低開發優缺點

基於低版本的SDK開發

優點就是你可以支援的手機使用者會更多,基本上各個版本的使用者都可以用你的應用。

但缺點也是非常明顯,特別是對開發者來說,需要做好每一個新特性功能的適配和開發,隨著版本越來越高,這對開發者後期的維護會越來越困難,越來越多。

基於高版本的SDK開發

如果你用最新的版本的SDK, 優點就是你可以使用最新的功能的api,而且編譯也不會出現任何問題。

但是缺點就是你需要時刻對你呼叫的api保持向下相容性,因為很有可能你現有呼叫的某個api在低版本中根本就不存在。這時候你需要考慮低版本系統的使用者的執行問題了。

實戰分析

如某個工程配置中的最低版本是android2.2,也就是正常來說開發過程中需要基於android SDK為8來做工程開發。但如果你沒有基於adroid  2.2 SDK版本開發,而是支援了一個更高的版本,比如android 4.0 SDK開發,那麼很多高版本的功能特性(2.3—4.0)在4.0以下的手機中執行就可以存在問題,一般的結果就是直接crash。

下面是基於android2.2 SDK 開發環境編譯的最新的工程,其中就有一些直接編譯執行不過的錯誤。下面可以看幾個例項:

SampleActivity.java有一處這樣寫的:

      if (savedInstanceState !=null) {

         mOrderId =savedInstanceState.getString(EXTRA_ORDER_ID);

         mPaySuccess =savedInstanceState.getString(EXTRA_PAY_SUCCESS,"");

      }

程式碼中使用Bundle物件在新版本中才提供的方法而沒有加相容處理,如下官方文件中解釋,該方法在android 3.1後才有。

public String getString (String key, String defaultValue) Added in API level 12

如果在低於android 3.0下機器執行和編譯該程式碼,如果不做任何處理,會直接編譯通不過。

 

解決方法:

1.       用android提供的註解 @TargetApi(11)+ 版本號控制做相容

如果是基於高版本的SDK開發,則新的api肯定會有該方法,如果想讓編譯的版本在低版本中也能執行,則需要考慮到版本相容的問題,可以用如下的方式:

/***

     * 該api版本相容獲取指定引數

     *

     * @param savedInstanceState

     * @return

     */

   @TargetApi(12)

   privateString getPaySucess(Bundle savedInstanceState) {

        if (Build.VERSION.SDK_INT >= 12) {

            mPaySuccess = savedInstanceState.getString(EXTRA_PAY_SUCCESS,"");

        } else {

            mPaySuccess = savedInstanceState.getString(EXTRA_PAY_SUCCESS);

            if (mPaySuccess ==null){

                mPaySuccess = "";

            }

        }

        returnmPaySuccess;

}

 

2.       用反射的方式呼叫高版本中的新功能介面進行呼叫。

如果是基於低版本SDK開發,那麼新版本中的新介面肯定會編譯不過,這時候可以考慮反射的方式先去查詢是否存在這個方法,如果有就代表使用者的手機支援該呼叫方法,如果沒有則採用低版本的處理方式。

 

   /***

     * 通過放射的方式來獲取Bundle中的

     * getString(String key,String value)方法

     *

     * @return

     */

   privateStringgetPaySucessInvoke(Bundle savedInstanceState) {

 

        try {

            Class<?> c = Class.forName("android.os.bundle");

            Method mGetString2Params =c.getDeclaredMethod("getString", String.class,String.class);

 

            if (mGetString2Params !=null) {

                mPaySuccess = (String)mGetString2Params.invoke(null,EXTRA_PAY_SUCCESS,"");

            } else {

                mPaySuccess = savedInstanceState.getString(EXTRA_PAY_SUCCESS);

                if (mPaySuccess ==null){

                    mPaySuccess ="";

                }

            }

        } catch (Exception e) {

            // TODO: handle exception

        }

 

        returnmPaySuccess;

    }

 

3.       分離程式碼,分別在不同的SDK上編譯執行,最後ClassLoader動態載入高版本中的相關類介面

此方法應用場景如2,可以將高版本的api介面封裝後在高版本的SDK中編譯執行jar包,供舊版本的工程中動態載入。

SDK相關對應表

Platform Version

API Level

VERSION_CODE

Notes

Android 5.1

22

LOLLIPOP_MR1

Platform Highlights

Android 5.0

21

LOLLIPOP

Android 4.4W

20

KITKAT_WATCH

KitKat for Wearables Only

Android 4.4

19

KITKAT

Platform Highlights

Android 4.3

18

JELLY_BEAN_MR2

Platform Highlights

Android 4.2, 4.2.2

17

JELLY_BEAN_MR1

Platform Highlights

Android 4.1, 4.1.1

16

JELLY_BEAN

Platform Highlights

Android 4.0.3, 4.0.4

15

ICE_CREAM_SANDWICH_MR1

Platform Highlights

Android 4.0, 4.0.1, 4.0.2

14

ICE_CREAM_SANDWICH

Android 3.2

13

HONEYCOMB_MR2

Android 3.1.x

12

HONEYCOMB_MR1

Platform Highlights

Android 3.0.x

11

HONEYCOMB

Platform Highlights

Android 2.3.4
Android 2.3.3

10

GINGERBREAD_MR1

Platform Highlights

Android 2.3.2
Android 2.3.1
Android 2.3

9

GINGERBREAD

Android 2.2.x

8

FROYO

Platform Highlights

Android 2.1.x

7

ECLAIR_MR1

Platform Highlights

Android 2.0.1

6

ECLAIR_0_1

Android 2.0

5

ECLAIR

Android 1.6

4

DONUT

Platform Highlights

Android 1.5

3

CUPCAKE

Platform Highlights

Android 1.1

2

BASE_1_1

Android 1.0

1

BASE

相關文章