Android系統開發(3)——Makefile的編寫,androidmakefile
Makefile是什嗎?
makefile的作用:
1、工程檔案組織,編譯成複雜的程式
2、安裝及卸載我們的程式
Makefile使用樣本
在/home/username/makefile目錄下有如下三個檔案:
main.c
#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]){ int x, y; sscanf(argv[1], "%u", &x); sccanf(argv[2], "%u", &y); printf("func1:%u\n", func1(x, y)); printf("func2:%u\n", func2(x, y)); return 0;}func1.c
#include <stdio.h>int func1(int x, int y){ return x + y;}func2.c
#include <stdio.h>int func2(int x, int y){ return x + y;}下面我們開始編譯上面的檔案:
寫好的Makefile檔案如下:
obj=main.c func1.c func2.chello2:$(obj) gcc $^ -o $@.PHONY:cleanclean: rm hello2install: cp hello2 /usr/local
運行make
Makefile的編寫規則
Makefile由若干條上面的規則構成,每個規則如下:
taget目標:prequisites(依賴)
command(命令)
注意:第二行必須有一個Tab縮排
例如上面兩行表示要產生目標檔案hello,在產生hello的同時需要依賴main.o func1.o func2.o這三個檔案,並且執行gcc main.o func1.o func2.o -o hello命令來產生。
#建立第一個Makefile檔案hello:main.c func1.c func2.c gcc main.c func1.c func2.c -o hello
我們來修改一下上面的Makefile
#建立第二個Makefile檔案hello:main.o func1.o func2.o gcc main.o func1.o func2.o -o hellomain.o:main.c gcc -c main.cfunc1.o:func1.c gcc -c func1.cfunc2.o:func2.c gcc -c func2.c
發現不僅產生了hello而且多了幾個func1.c func1.o func2.c func2.o main.c main.o檔案,下面我們修改一下Makefile檔案,添加一個偽目標
hello:main.o func1.o func2.o gcc main.o func1.o func2.o -o hellomain.o:main.c gcc -c main.cfunc1.o:func1.c gcc -c func1.cfunc2.o:func2.c gcc -c func2.cclean: rm func1.o func2.o main.o
clean就是一個偽目標,不會產生新的檔案,下面我們來執行一下make clean來看一下效果
執行make clean後func1.o func2.o main.o全部刪除了(可以想到卸載程式的原理),下面我們就來添加一個install和uninstall偽目標
在我們執行make install的時候會將我們用到的執行檔案和庫檔案拷貝到指定目錄,在執行uninstall的時候會刪除安裝時的拷貝檔案。
下面我們來使用變數MObj代替main.o func1.o func2.o
MObj = main.o func1.o func2.ohello:$(MObj) gcc $(MObj) -o hellomain.o:main.c gcc -c main.cfunc1.o:func1.c gcc -c func1.cfunc2.o:func2.c gcc -c func2.cclean: rm $(MObj) install: cp hello /usr/local/hellouninstall: rm /usr/local/hello
如果這樣寫MObj := main.o func1.o func2.o 表示不遞迴變數。也可以使用系統的預定義變數,常見的預定義變數如下:
AR_____庫檔案維護程式的名稱,預設值為ar
AS_____組譯工具的名稱,預設值為as
CC_____C編譯器的名稱,預設值為cc
CXX____C++編譯器的名稱,預設值為g++
ARFLAGS_____庫檔案維護程式選項,無預設值
ASFLAGS_____組譯工具選項,無預設值
CFLAGS______C編譯器選項,無預設值
CXXFLAGS____C++編譯器選項,無預設值
下面我們使用預定義變數來改寫一下我們上面的Makefile檔案
這樣做的好處就是在我們換編譯器的時候非常方便。
下面我們來看看makefile中的自動變數及環境變數:
$*_______不包含副檔名的目標檔案名稱
$<_______第一個依賴檔案名稱
$?_______所有時間戳記比目標檔案晚的依賴檔案
$@______目標檔案完整名稱
$^_______所有不重複的依賴檔案
這個時候我們應該清楚了剛開始寫的那個Makefile檔案的內容了
上面還對偽目標進行了聲明(.PHONY)這樣做的目的是為了避免和其他檔案同名衝突。
java編程:對於android安卓編程的一個比較深的問題:進吧
簡單介紹一下怎麼在android上開發基本的C程式。
如果做過ARM的C應用程式開發的話會發現,ARM一般情況下提供了十分完備的編譯器,而android沒有而已(android提供了完善的Java層開發工具,C的卻不是那麼完善)。
1 編寫hello.c
這個太簡單了,不是嗎?
#include <stdio.h>
int main(void)
{
printf("hello world!\n");
return 0;
}
4.2 編寫Android的編譯器設定檔make_android
在Android SDK中,並沒有提供Android系統的C編譯器。就算是在NDK中,也只是提供了ndk-build工具,用來編譯native static/dynamic library。只有仔細翻閱NDK的手冊(它的手冊位於NDK根目錄的doc/OVERVIEW.html,比較簡略),才會發現有一個STANDALONE-TOOLCHAIN的頁面,會提到單獨編譯C Level應用程式的方法。我這裡提供一段簡單的makefile,命名檔案為make_android,用來配置CC宏:
# make_android: this is a sub makefile for android native compile
# you have to set ANDROID_VER and ANDROID_ROOT to your flavor to work
### these two things have to be set first!!!
ANDROID_VER=android-8
ANDROID_ROOT=/home/xzpeter/android PLATFORM_DIR=${ANDROID_ROOT}/prebuilt/ndk/android-ndk-r4/platforms
SYSROOT=${PLATFORM_DIR}/${ANDROID_VER}/arch-arm EABI_GCC=${ANDROID_ROOT}/prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/arm-linux-androideabi-gcc
CC=${EABI_GCC} --sysroot=${SYSROOT}
這裡,ANDROID_ROOT和ANDROID_VER是需要針對自己的android source目錄位址和android API level修改一下的。這裡的android source是我用repo sync從github上mirror下來的android原始碼。
4.3 編寫Makefile
利用上面的make_android,寫Makefile:
# to make x86 version of code, run: "make X86=1"
ifdef X86
CC=gcc
CLFAGS=-g
else
include make_android
endif
default: hello
hello: hello.o
clean: rm hello *.o
4 編譯
可以用make X86=1先在本地編譯一下,並運行./hell......餘下全文>>
安卓程式是用什語言編寫的?
一、應用程式
Android 會同一系列核心應用程式套件組合一起發布,該應用程式套件組合包括 email用戶端,SMS 短訊息程式,日曆,地圖,瀏覽器,連絡人管理程式等。所有的應用程式都是使用JAVA 語言編寫的。
二、應用程式架構
開發人員也可以完全訪問核心應用程式所使用的API架構。該應用程式的架構設計簡化了組件的重用;任何一個應用程式都發行就緒它的功能塊並且任何其它的應用程式都可以使用其所發布的功能塊(不過得遵循架構的安全性限制)。同樣,該應用程式重用機制也使使用者可以方便的替換程式組件。
隱藏在每個應用後面的是一系列的服務和系統, 其中包括;
豐富而又可擴充的視圖(Views),可以用來構建應用程式, 它包括列表(lists),網格(grids),文字框(text boxes),按鈕(buttons), 甚至可嵌入的網頁瀏覽器。
內容提供器(Content Providers)使得應用程式可以訪問另一個應用程式的資料(如連絡人資料庫), 或者共用它們自己的資料
資源管理員(Resource Manager)提供 非代碼資源的訪問,如本地字串,圖形,和布局檔案( layout files )。
通知管理器 (Notification Manager) 使得應用程式可以在狀態列中顯示自訂的提示資訊。
Active Manager( Activity Manager) 用來管理應用程式生命週期並提供常用的導航回退功能。
三、程式庫
Android 包含一些C/C++庫,這些庫能被 Android 系統中不同的組件使用。它們通過 Android 應用程式架構為開發人員提供服務。以下是一些核心庫:
系統 C 庫 - 一個從 BSD 繼承來的標準 C 系統函數庫( libc ), 它是專門為基於 embedded linux 的裝置定製的。
媒體庫 - 基於 PacketVideo OpenCORE;該庫支援多種常用的音頻、視頻格式回放和錄製,同時支援靜態影像檔。編碼格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
Surface Manager - 對顯示子系統的管理,並且為多個應用程式提 供了2D 和 3D 圖層的無縫融合。
LibWebCore - 一個最新的網頁瀏覽器引擎用,支援Android 瀏覽器和一個可嵌入的web 視圖。
SGL - 底層的 2D 圖形引擎
3D libraries - 基於 OpenGL ES 1.0 APIs 實現;該庫可以使用硬體 3D加速(如果可用)或者使用高度最佳化的3D 軟加速。
FreeType -位元影像(bitmap)和向量(vector)字型顯示。
SQLite - 一個對於所有應用程式可用,功能強勁的輕型關係型資料庫引擎。
四、Android 運行庫
Android 包括了一個核心庫,該核心庫提供了JAVA 程式設計語言核心庫的大多數功能。
每一個 Android 應用程式都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬 機執行個體。Dalvik 被設計成一......餘下全文>>