- Android核心原理與系統級應用高效開發
- 韓超等
- 2298字
- 2018-12-30 05:22:10
1.2 Android的開發環境
↘ 1.2.1 開發環境
Android的Linux開發環境一般使用Ubuntu主機。在基于Ubuntu的主機環境中,開發Android主機環境包括以下需求:git工具、repo工具、Java的JDK、主機編譯工具等幾個方面。編譯過程中的主要目標機的編譯工具則在Android的源代碼包中自帶。
Java 6開發包(SUN標準的JDK 6)的安裝方式如下所示:
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" $ sudo apt-get update $ sudo apt-get install sun-java6-jdk
Java 5開發包(SUN標準的JDK 5)的安裝方式如下所示:
$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy main multiverse" $ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy-updates main multiverse" $ sudo apt-get update $ sudo apt-get install sun-java5-jdk
在Android 1.6至Android 2.2發布版本中,Android系統要求使用Java 5來編譯系統;Android 2.3.x之后要求使用Java 6進行編譯。
配置Java運行環境和javac編譯器的方法如下所示:
$ update-alternatives --config java $ update-alternatives --config javac
● 提示:不同版本的JDK可以共存,可以通過update-alternatives進行配置選擇。
Android系統在編譯的過程中需要編譯主機的工具,因此需要使用主機的GCC工具鏈。而對于編譯目標機文件,Android在prebuilt目錄中集成了GCC交叉編譯工具鏈。
新版本Android源代碼編譯應當使用64位的主機環境,配置方式如下所示:
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \ x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \ libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \ libxml2-utils
而32位的主機開發環境,配置方式如下所示:
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev \ libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown \ libxml2-utils
repo是調用git封裝的工具,安裝repo的準備工作如下所示:
$ mkdir ~/bin $ PATH=~/bin:$PATH
repo工具同樣可以在Android的網站上獲得,方法如下所示:
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo $ chmod a+x ~/bin/repo
repo是一個由Google提供的工具,本質上是一個腳本,它可能隨時更新,因此應當從Google的相應地址獲得最新的repo,復制到本地之后更改權限來使用。
↘ 1.2.2 源代碼獲取
獲取Android完全的源代碼方法包括初始化代碼倉庫和獲取代碼兩個步驟,每個步驟可以增加不同的參數。
對于Android的代碼倉庫,初始化代碼倉庫的一般方法如下所示:
$ repo init -u https://android.googlesource.com/platform/manifest
此時得到的是代碼倉庫中Master分支(主分支)的最新版本。
● 提示:Google更新了源代碼倉庫的uri,不再使用從前的android.git.kernel.org。
在經過repo init之后,可以使用repo獲取Android的全部代碼,方法如下所示:
$ repo sync
在repo init時,使用-b選項可指定初始化版本的方法如下所示:
$ repo init -u https://android.googlesource.com/platform/manifest -b android-2.2_r1 $ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
使用repo sync時,也可以同步一個單個工程的內容,需要使用工程的名稱作為repo sync的參數,工程的名稱可以從manifest.xml獲得。使用方法如下。
$ repo sync {project_name}
↘ 1.2.3 編譯Android源代碼
編譯Android系統的方法比較簡單:在Android源代碼的根目錄中有一個Makefile,直接執行make即可,此時表示進行默認產品的全系統構建。可以增加-j N等參數指定并行編譯的線程,加快編譯的速度。
Android系統編譯過程的片斷如下所示:
$ make # ……編譯過程 Combining NOTICE files: out/target/product/generic/obj/NOTICE.html Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_ unopt_intermediates/system.img Install system fs image: out/target/product/generic/system.img Installed file list: out/target/product/generic/installed-files.txt
在一般情況下,根據編譯過程的輸出信息,system.img和installed-files.txt生成后,表示整個系統已經成功編譯完成。
↘ 1.2.4 仿真器運行
使用Android Emulator可以模擬Android整個系統的運行,在運行過程中,可以指定內核、主文件系統、用戶文件系統等。
Android是基于Linux的系統,具有自己的Linux內核映像文件。默認情況下,使用的源代碼包中提供的二進制內核路徑如下所示:prebuilt/android-arm/kernel/。
kernel-qemu文件為ARMv5體系結構的Linux內核。預編譯的內核還有kernel-qemu-armv7文件,它是ARMv7的體系結構。
模擬器運行之前需要配置ANDROID_PRODUCT_OUT環境變量:
$declare -x ANDROID_PRODUCT_OUT ="{Android根目錄}/out/target/product/generic"
ANDROID_PRODUCT_OUT宏表示的是產品的目錄,模擬器運行時,需要從這個目錄中找到幾個映像文件。
運行模擬器時,同時得到一個shell終端的方式如下所示:
$ ./out/host/linux-x86/bin/emulator -shell
在仿真器環境中使用SD卡的方式如下所示:
$ ./out/host/linux-x86/bin/emulator –shell –sdcard <image_file>
在仿真器環境中指定不同分辨率的方法如下所示:
$ ./out/host/linux-x86/bin/emulator –shell –skin 800x480
↘ 1.2.5 使用工具
在Linux主機環境中,如果對Android的源代碼進行了完整的編譯,各種Linux的主機中工具生成在{源代碼根目錄}/out/host/linux-x86/bin/目錄中。可以使用這個目錄中的各種工具。
adb全稱Android Debug Bridge(Android調試橋)。使用adb工具可以直接操作管理Android模擬器或者真實的Android設備。adb工具中幾個通用的基本命令如下所示:
$ adb devices # 查看當前連接的設備(仿真器和真實設備) $ adb connect <ip>:5555 # 連接到某個網絡端口 $ adb start-server # 啟動adb服務器進程 $ adb kill-server # 終止adb服務器進程
adb得到目標信息的幾個命令如下所示:
$ adb get-product # 得到設備的id $ adb get-serialno # 得到設備的序列號 $ adb get-state # 得到設備的狀態
使用adb連接目標系統終端的方式如下所示:
$ adb shell
在shell后面可以直接附加目標機的命令行程序,表示直接執行一個命令。
使用adb抓取目標系統的log的方法如下所示:
$ adb logcat
使用adb安裝應用程序的方法如下所示:
$ adb install XXX.apk $ adb uninstall {應用程序的包名}
如果需要更新已經安裝的包,也就是重新安裝包,需要增加-r參數。使用-s則表示安裝到SD卡,不使用表示安裝到內部存儲器。
使用adb在主機和目標機之間傳送文件的方法如下所示:
$ adb push {host_path} {target_path} $ adb pull {target_path} {host_path}
push表示從主機向目標機傳送文件,pull表示從目標機向主機傳送文件,二者的參數都是源對象在前,目的對象在后。
當已經有多個設備連接到主機時,可以使用-s參數進行選擇,方法如下所示:
$ adb -s <設備> <命令>
其中,<設備>為adb devices列出的內容,<命令>為任意可執行的命令。除此之外,-d表示只通過USB連接,-e表示只連接仿真器。
fastboot則是一個具有特殊功能的協議,它是一個連接重新燒寫系統的工具。fastboot通常需要Android設備方面的BootLoader中具有fastboot協議的支持。
fastboot幾個控制命令如下所示:
$ fastboot devices # 查看當前連接的設備 $ fastboot reboot # 正常重新啟動系統 $ fastboot reboot-bootloader # 重新啟動系統到BootLoader階段
fastboot幾個和燒寫有關的命令如下所示:
$ fastboot flashall # 燒寫所有的分區 $ fastboot flash <partition> [ <filename> ] # 指定燒寫一個分區 $ fastboot erase <partition> # 擦除一個分區
fastboot也可以通過-s參數指定操作某個連接的設備。
mksdcard命令幫助創建磁盤映像(disk image),可以在模擬器環境下使用磁盤映像來模擬外部存儲卡(如SD卡)。例如,創建一個256MB映像文件的方法如下所示:
$ mksdcard 256M mmc_disk
mksdcard創建的是fat32格式的磁盤映像,這個磁盤映像可以作為啟動仿真器時的-sdcard后面指定的參數。
aapt為Android資產打包工具(Android Asset Packaging Tool),用于查看和生成zip格式的包;aidl工具則用于自動將Android中特定的aidl接口描述文件生成Java代碼;zipalign用于優化Android中應用程序包。它們都是在編譯的過程中被編譯系統自動調用的。
性能跟蹤工具(Traceview),Dalvik調試監視器服務(Dalvik Debug Monitor Service)和層級觀察器(Hierarchy Viewer)提供了圖形化的界面,是較為復雜的工具。