Android和IOS的區別和聯絡
開發語言不同
1、IOS使用的是ObjectC和Swift
2、Android使用的是Java和KotLin
框架結構
- Android系統的底層建立在Linux系統之上
Android系統的底層建立在Linux系統之上,由上到下依次是
應用程式、應用程式框架、核心類庫,Linux核心,其中第三層還包括Android執行時的環境。如下圖:
1、應用程式層
Android 連同一個核心應用程式包一起釋出,該應用程式包包括E-mail客戶端、SMS短訊息程式、日曆、地圖、瀏覽器、聯絡人管理程式等。所有的應用程式都是用Java編寫的。
2、應用程式層
提供了一大堆的服務和管理器
3、Android函式庫
常用的比如媒體庫,資料庫,OpenGl3D,WebKit等,dalvik虛擬機器也在這裡,3D檢視加速等等
4、Linux核心
Android的核心繫統服務依賴於Linux核心,如安全性、記憶體管理、程序管理、網路協議棧和驅動模型。Linux核心也同時作為硬體和軟體棧之間的硬體抽象層
- iOS是基於UNIX系統的
iOS基於UNIX系統,iOS的系統架構分為四層,由上到下一次為:可觸控層(Cocoa Touch layer)、媒體層(Media layer)、核心服務層(Core Services layer)、核心作業系統層(Core OS layer),如下圖:
1、觸控層:為應用程式開發提供了各種常用的框架並且大部分框架與介面有關,本質上來說它負責使用者在iOS裝置上的觸控互動操作。如NotificationCenter的本地通知和遠端推送服務,iAd廣告框架,GameKit遊戲工具框架,訊息UI框架,圖片UI框架,地圖框架,連線手錶框架,自動適配等等
2、媒體層:提供應用中視聽方面的技術,如圖形影象相關的CoreGraphics,CoreImage,GLKit,OpenGL ES,CoreText,ImageIO等等。聲音技術相關的CoreAudio,OpenAL,AVFoundation,視訊相關的CoreMedia,Media Player框架,音視訊傳輸的AirPlay框架等等。
3、核心服務層:提供給應用所需要的基礎的系統服務。如Accounts賬戶框架,廣告框架,資料儲存框架,網路連線框架,地理位置框架,運動框架等等。這些服務中的最核心的是CoreFoundation和Foundation框架,定義了所有應用使用的資料型別。CoreFoundation是基於C的一組介面,Foundation是對CoreFoundation的OC封裝。
4、核心作業系統層包括:包含大多數低級別接近硬體的功能,它所包含的框架常常被其它框架所使用。Accelerate框架包含數字訊號,線性代數,影象處理的介面。針對所有的iOS裝置硬體之間的差異做優化,保證寫一次程式碼在所有iOS裝置上高效執行。CoreBluetooth框架利用藍芽和外設互動,包括掃描連線藍芽裝置,儲存連線狀態,斷開連線,獲取外設的資料或者給外設傳輸資料等等。Security框架提供管理證書,公鑰和私鑰信任策略,keychain,hash認證數字簽名等等與安全相關的解決方案。
兩者執行機制不同:
- IOS採用的是沙盒執行機制
1、沙盒機制
出於安全考慮,iPhone對於安裝在上面的應用程式有所限制,這個限制就是應用程式只能在為該改程式建立的檔案系統中讀取檔案,不可以去其它地方訪問,此區域被稱之為沙盒,所以所有的非程式碼檔案都要儲存在此,例如影象,圖示,聲音,映像,屬性列表,文字檔案等。總體來說沙盒就是一種獨立、安全、封閉的空間。
2、沙盒機制的特點
每個應用程式都有自己的儲存空間。每個應用程式都不可以翻過自己的圍牆去訪問別的儲存空間的內容(已經越獄的除外)。在訪問別人沙盒內的資料時需要訪問許可權。沙盒(sandbox)的核心內容是:sandbox對應用程式執行各種操作的許可權限制
3、應用程式的沙盒目錄
應用程式沙盒目錄下有三個資料夾Documents、Library(下面有Caches和Preferences目錄)、tmp。
Documents:儲存應用執行時生成的需要持久化的資料iTunes會自動備份該目錄。蘋果建議將在應用程式中瀏覽到的檔案資料儲存在該目錄下。
Library/Caches:一般儲存的是快取檔案,例如圖片視訊等,此目錄下的檔案不會再應用程式退出時刪除,在手機備份的時候,iTunes不會備份該目錄。
Library/Preferences:儲存應用程式的所有偏好設定iOS的Settings(設定),我們不應該直接在這裡建立檔案,而是需要通過NSUserDefault這個類來訪問應用程式的偏好設定。iTunes會自動備份該檔案目錄下的內容。
tmp:臨時檔案目錄,在程式重新執行的時候,和開機的時候,會清空tmp資料夾。
- 安卓採用的是虛擬機器執行機制
1、什麼是Dalvik虛擬機器
Dalvik是Google公司自己設計用於Android平臺的Java虛擬機器,它是Android平臺的重要組成部分,支援dex格式(Dalvik Executable)的Java應用程式的執行。dex格式是專門為Dalvik設計的一種壓縮格式,適合記憶體和處理器速度有限的系統。Google對其進行了特定的優化,使得Dalvik具有高效、簡潔、節省資源的特點。從Android系統架構圖知,Dalvik虛擬機器執行在Android的執行時庫層。
2、Dalvik虛擬機器的功能
Dalvik作為面向Linux、為嵌入式作業系統設計的虛擬機器,主要負責完成物件生命週期管理、堆疊管理、執行緒管理、安全和異常管理,以及垃圾回收等。Dalvik充分利用Linux程序管理的特定,對其進行了面向物件的設計,使得可以同時執行多個程序,而傳統的Java程式通常只能執行一個程序,這也是為什麼Android不採用JVM的原因。Dalvik為了達到優化的目的,底層的操作大多和系統核心相關,或者直接呼叫核心介面。
3、Dalvik虛擬機器具有以下特點
· 使用dex格式的位元組碼,不相容Java位元組碼格式
· 程式碼密度小,執行效率高,節省資源
· 有記憶體限制,Google原版的系統,預設支援的最大隻為16MB
繪製頁面的方式不同
- 佈局檔案不同:
1、IOS早期開發的時候根本沒有類似StoryBoard,Xlib這些的可以直接拖拽控制元件的佈局檔案,所有的頁面,以及頁面的所有控制元件都需要開發者在程式碼中動態的建立,而且早期的IOS機型和螢幕型別非常少,根本不需要考慮適配的問題,後面隨著機型的增加才開始出現了適配的問題
2、Android參考了Java語言寫PC電腦介面程式的思想,提供了基礎的佈局檔案,可以建立對應的字尾為.xml的佈局檔案,然後在佈局檔案中設定調整空間
- 控制元件位置的設定和調整
1、IOS AutoLayout
Java寫PC端程式就考慮了頁面的相容性,有五大布局來設定調整控制元件的相對位置。Android裡面也有一些基本的區域性檔案來設定和調整控制元件的位置
2、控制元件長度的設定,pd和pt
IOS開發中使用的長度和寬度基本是以pt為字尾的數字
Android開發中的長度和寬度基本是dp為字尾的數字,也可以以px(畫素密度單位)作為字尾,
畫素密度,不同的手機,畫素密度是不一樣的,如果以px為字尾,不同的手機,顯示出來的長度是不一致的,而Android和IOS手機會根據自身不同的畫素密度來對dp和pt進行一定的換算,來轉換成比較合適的px。
- 兩者開啟新頁面的方式不同
1、IOS採用先new物件,然後通過導航控制器,採用壓棧的方式把下個頁面物件壓入棧中,下一個頁面就會顯現出現在頁面上;或者通過把new出來的物件賦值給當前Window的RootView物件來開啟新的頁面。
2、Android則是把新頁面對應的Activity的完整類名告訴系統的Activity管理者,通過呼叫Android的Activity管理者把物件new出來,需要傳遞引數的話,就需要傳遞類似鍵值對的方式,把資料儲存到Intent裡面,然後在新的頁面顯示到介面之前,再獲取到Intent,然後根據相應的Key來獲取key對應的鍵值對
兩者後臺策略不同
- iOS採用“偽後臺”的形式
1、當一個iOS應用被送到後臺,應用程式只有很短暫的時間(秒級別的)來處理東西,然後所有執行緒都被掛起了。這個時候APP依然駐留在記憶體中,這種狀態下,不呼叫蘋果已開放的幾種後臺方法,程式便不會執行;如果在這個時候,使程式繼續執行,則為後臺狀態;如果當前記憶體將要不夠用時,系統會自動把之前掛起狀態下的APP請出記憶體。所以我們看到,有些時候開啟APP時,還是上次退出時的那個頁面那些資料,有時則是重新從閃屏進入。
2、iOS系統後臺機制大概可以分為5種狀態
· Not Running:APP沒有啟動,也沒有後臺執行;
· Active:使用者正在使用APP,比如說我們聊微信看網頁的時候,APP就處於Active狀態;
· Inactive:這是一個過渡的狀態,APP雖然打開了,但是使用者沒有跟APP有任何互動操作;
· Background:APP在後臺執行,微信會在沒有開啟的時候接收訊息;
· Suspended:APP雖然在後臺執行,但是處於休眠狀態,只佔用一點記憶體。
- 安卓採用的是虛擬機器執行機制,安卓中任何程式都能在後臺執行,直到沒有記憶體才會關閉
1、android後臺執行機制
android上的應用是帶有獨立虛擬機器的,也就是每開一個應用就會開啟一個獨立的虛擬機器,每個app都有自己的程序,每個程序都有自己的記憶體空間,這樣設計的原因是可以避免虛擬機器崩潰導致整個系統崩潰,但代價就是需要更多記憶體。以上這些設計確保了android的穩定性,正常情況下最多單個程式崩潰,但整個系統不會崩潰。
2、安卓的程序從高到底分為5種
· 前臺程序:正在與使用者互動的程序,通俗來講就是你當前使用app的程序;
· 可見程序:可以被使用者看到,但是沒有和使用者互動,例如一個activity以對話方塊的形式覆蓋在當前activity上面,當前activity可以被使用者看到,但是不和使用者互動;
· 服務程序:這個相信大家都熟悉,也就是我們常說的service,能夠執行在後臺,常見的有音樂類的app;
· 後臺程序:注意,這個後臺程序不要和服務程序搞混了,它的意思是說當前app在後臺執行,例如我啟動了app,然後點選home返回到桌面,那麼這個app就會被切回到後臺程序;
· 空程序:空程序指的是在這些程序內部,沒有任何東西在執行。保留這種程序的的唯一目的是用作快取,以縮短該應用下次在其中執行元件所需的啟動時間。
推送機制
- iOS在軟體關閉的情況下,依然可以接收推送資訊
手機訊息當然都是通過伺服器推送到我們手機上的,對於iOS的使用者來說,蘋果有APNs伺服器來負責訊息的推送。當你第一次使用APP時,會詢問是否接收通知,如果你選擇了是,那麼伺服器就會記錄你的ID,當有訊息通知的時候,這些資料是先推送到蘋果的伺服器中,然後通過蘋果的APN伺服器推送到使用者手機上的。 這樣的設計讓軟體徹底關閉的時候還可以接收到訊息通知,一方面釋放記憶體,一方面也不會耽誤接收訊息。
- Android在軟體關閉的情況下,無法接收推送資訊
在Android手機來說,谷歌也有類似的GCM伺服器來推送訊息,不過因為國內的手機都沒有谷歌服務無法收到谷歌GCM伺服器推送的訊息。安卓的推送都是通服務來實現的,就算應用沒有啟動但是服務還在一樣可以收到推送。所以只能是安卓自己啟動Services來實現推送,當應用殺死後Services如果被殺死就無法收到推送。
開源性
-
IOS和Mac都是閉原始碼的,蘋果公司的從一開始的宗旨就是為了讓軟體和硬體完美的結合到一塊,自己打造一套只屬於自己的完整產業鏈,自己可以控制整個生態鏈
-
Android是開源的,谷歌公司目的是打造一款廉潔以及通用型非常好的系統,,這個理念和微軟的Window系統(Windows系統是閉源的)基本一致,但是Android因為是開源的,所以各大廠商都能夠進行特殊定製,此擁有廣泛的使用者基數群體,但是也因為這個原因導致Android碎片化非常嚴重。
效能
1、硬體本身
IOS:目的就是讓軟體和硬體完美的結合到一塊,該作業系統只能在極少數機器上面才能執行
Android:和Window一樣,目的是打造一款通用性非常好的系統,在任何機器上面都可以執行,
2、系統本身
IOS:直接執行程式的二進位制程式碼
Android:生成class檔案,需要虛擬機器來進行解釋
3、語言本身
OC:基於物件,完全相容C語言的語法,可以直接操作記憶體
Java:面向物件,效能比C語言和OC低
4、頁面控制元件的計算方式
IOS:提前計算好,然後根據計算的結果來佈局檔案
Android:需要不斷的測量,重複計算
5、系統本身對應用程式的控制:後臺策略,推送策略,懶載入策略,沙盒策略
IOS對程式一直都是非常嚴格的態度,嚴格管控著程式的各個方面的許可權,早期的Android對程式的管控相對寬鬆,但是隨著Android系統版本的升級,管控也逐漸嚴格,總的來說,效能方面IOS完勝Adroid,價格方面Android完勝IOS
安全性
目前針對移動應用市場上安卓APP被破解、反編譯、盜版叢生的現象,很多APP開發人員已經意識到保護APP的重要性。而對於移動應用APP加密保護的問題,如何對DEX檔案加密尤為重要。那麼接下來,我們就先介紹一下什麼是App加殼和加殼的原理,利與弊等。
1、什麼是加殼?
加殼是在二進位制的程式中植入一段程式碼,在執行的時候優先取得程式的控制權,做一些額外的工作。大多數病毒就是基於此原理。是應用加固的一種手法對原始二進位制原文進行加密/隱藏/混淆。
2、加殼作用
加殼的程式可以有效阻止對程式的反彙編分析,以達到它不可告人的目的。這種技術也常用來保護軟體版權,防止被軟體破解,但是加殼可能會影響軟體的相容性,而且由於在程式外面又添加了其他初始化程式,軟體開啟的速度也會降低。
五、兩者相互學習
1、Toast
2、啟動頁(Android是不需要啟動頁面的,會出現白屏或者黑屏),頁面的返回鍵
3、切換開關
4、對話方塊,進度條,
5、佈局檔案和自適應佈局控制元件,相容性
6、應用商店
7、重新整理控制元件