摘要
本文主要介紹如何在Intel Atom架構下開發和最佳化Android應用程式,如何開發和移植Android NDK應用程式,以及如何透過程式碼階段和編譯階段來最佳化NDK應用程式。
目錄
1. Android* 應用程式的分類
2. Android* 本機開發套件(NDK)介紹
3. 為Intel架構開發和移植NDK應用程式
4. 本機程式碼(Native Code)開發注意點
5. 通用效能最佳化
6. 總結
Android* 應用程序的分類 :
Android應用程式大致可以分為兩類:
一類是Dalvik應用程式,這類應用程式只包含 Java程式碼和必要的xml,png等檔案,呼叫Android官方SDK的API,最後透過編譯成為APK檔案。
另一類應用是NDK應用程式,這類應用不僅包含Java程式碼和必要的xml,png等檔案,還包含本機程式碼(.h, .c, .cc, )甚至還包括組合語言程式碼。所有本機程式碼通過Makefile編譯為動態函式庫(so文件),Java端通過JNI機制去呼叫動態函式庫。
其原理如下圖所示:
Android* 本機開發套件介紹
NDK的全名為本機開發套件(Native Development Kit),一般來說會在以下兩個場合中使用到:
1. 構建高效能需求的部分。如音視訊的編解碼,圖形圖像的處理,會使用C或者組合語言程式碼。因為Java程式碼的執行需要虛擬機去解譯,而本機程式碼則直接編譯成二進位碼,在需要高效能的地方,執行起來更加快速。
2. 重用已有程式碼。對於已有的C,C++函式庫,可以透過NDK的機制來呼叫已有的函式庫。
為Intel Atom 架構開發和最佳化NDK 應用
NDK應用程式的開發可以分為以下五個步驟:
開發相容於Intel架構的NDK應用程式需要在第二步編寫MakeFile的時候添加APP_ABI := x86 選項。
對於已有的NDK應用程式向Intel Atom架構移植需要遵循以下步驟:
1. 如果是Dalvik應用程式,可以直接在Intel架構上運行。只需要為相應的設備調整分辨率即可。
2. 如果是NDK應用程式,如果僅包含C,C++程式碼,使用上面的方法重新編譯本機程式碼,產生給Intel平台的動態函式庫即可。如果本機程式碼中還使用了第三方的動態函式庫,則第三方動態函式庫也需要重編譯一個x86平台的版本。如果包含了組合語言等和硬體相依的程式碼,這部分程式碼需要重新編寫。
本機程式碼開發注意點
強制記憶體對齊
由於平台差異,如果不進行強制記憶體對齊,在其他平台設備中將資料寫入一個檔案,在x86平台下載入會出現大小不一致導致載入錯誤的情況。如下面一個資料結構testStruct:
struct TestStruct
{
int mVar1;
long long mVar2;
int mVar3;
};
在ARM平台和Intel平台編譯後,大小如下圖:ARM平台會自動採用double malign的方式,佔用24個位元組,而x86平台佔用16個位元組。
如果我們編譯時加入強制對齊參數:-malign-double 則佔用相同大小的位元組,不會出現載入錯誤的情況。
將NEON 指令集(ARM*) 移植至SSE 指令集(Intel)
組合語言程式碼部分需要注意平台差異,比如高位元組順序(Big-Endian)和低位組順序(Little-Endian)問題;
對於暫存器的操作,需要注意對應暫存器的大小限制,具體可以查表;
NEON指令集提供了一些本機的C函式庫,這部分程式碼雖然是C寫成的,但是在 Intel® 凌動™平台是不能運行的,需要重新編寫。
通用效能最佳化
在編譯階段可以透過添加合適的Gcc編譯參數來最佳化NDK應用程式。在Atom平台,可以添加
-march=atom
選項來指定平台。也可以添加特定的指令集,如:
-msse4
總結
1. 大多數的Android* 應用程式可以直接在 Intel 平台運行
•² NDK應用需要重編譯本機程式碼
•² 平台(ARM*, IA) 相關的組合語言程式碼需要進行移植
2. 充分使用 Intel 平台特性可以提升應用程式的效能;
3. 添加平台相關的編譯器參數可以讓GCC編譯出的二元碼效能更好。
Comments
Post a Comment