`

Android编译环境(转)

阅读更多
Android编译环境本身比较复杂,且不像普通的编译环境:只有顶层目录下才有Makefile文件,而其他的每个component都使用统一标准的Android.mk. Android.mk文件本身是比较简单的,不过它并不是我们熟悉的Makefile,而是经过了Android自身编译系统的很多处理,因此要真正理清楚其中的联系还比较复杂,不过这种方式的好处在于,编写一个新的Android.mk来给Android增加一个新的Component会比较简单。

编译Java程序可以直接采用Eclipse的集成环境来完成,这里就不重复了。我们主要针对C/C++来说明,下面通过一个小例子来说明,如何在Android 中增加一个C程序的Hello World:

1. 在$(YOUR_ANDROID)/ development 目录下创建hello目录,其中$(YOUR_ANDROID)指Android源代码所在的目录。
- # mkdir $(YOUR_ANDROID)/development/hello

2. 在$(YOUR_ANDROID)/external/hello/目录编写hello.c文件,hello.c的内容当然就是经典的HelloWorld程序:



#include <stdio.h>

int main()
{
    printf("Hello World!\n");

return 0;
}




3. 在$(YOUR_ANDROID)/external/hello/目录编写Android.mk文件。这是Android Makefile的标准命名,不要更改。Android.mk文件的格式和内容可以参考其他已有的Android.mk文件的写法,针对helloworld程序的Android.mk文件内容如下:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

 

LOCAL_SRC_FILES:= \

    hello.c

 

LOCAL_MODULE := helloworld

include $(BUILD_EXECUTABLE)


注意上面LOCAL_SRC_FILES用来指定源文件;,LOCAL_MODULE指定要编译的模块的名字,下一步骤编译时就要用到;include $(BUILD_EXECUTABLE)表示要编译成一个可执行文件,如果想编译成动态库则可用BUILD_SHARED_LIBRARY,这些可以在$(YOUR_ANDROID)/build/core/config.mk查到。

4. 回到Android源代码顶层目录进行编译:



# cd $(YOUR_ANDROID) && make helloworld

注意make helloworld中的目标名helloworld就是上面Android.mk文件中由LOCAL_MODULE指定的模块名。编译结果如下:



target thumb C: helloworld <= development/hello/hello.c

target Executable: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld)

target Non-prelinked: helloworld (out/target/product/generic/symbols/system/bin/helloworld)

target Strip: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/helloworld)

Install: out/target/product/generic/system/bin/helloworld



5.如上面的编译结果所示,编译后的可执行文件存放在out/target/product/generic/system/bin/helloworld,通过”adb push”将它传送到模拟器上,再通过”adb shell”登录到模拟器终端,就可以执行了

手工编译C模块

我们来试试如何直接运用gcc命令行来编译,从而了解Android编译环境的细节。

Android编译环境提供了”showcommands”选项来显示编译命令行,我们可以通过打开这个选项来查看一些编译时的细节。当然,在这之前要把上一篇中的helloworld模块clean:


# make clean-helloworld
上面的“make clean-$(LOCAL_MODULE)”是Android编译环境提供的make clean的方式。

接下来使用showcommands选项重新编译helloworld:


# make helloworld showcommands
build/core/product_config.mk:229: WARNING: adding test OTA key
target thumb C: helloworld <= development/hello/hello.c
prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc  -I system/core/include   -I hardware/libhardware/include   -I hardware/ril/include   -I dalvik/libnativehelper/include   -I frameworks/base/include   -I external/skia/include   -I out/target/product/generic/obj/include   -I bionic/libc/arch-arm/include   -I bionic/libc/include   -I bionic/libstdc++/include   -I bionic/libc/kernel/common   -I bionic/libc/kernel/arch-arm   -I bionic/libm/include   -I bionic/libm/include/arch/arm   -I bionic/libthread_db/include   -I development/hello   -I out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates  -c  -fno-exceptions -Wno-multichar -march=armv5te -mtune=xscale -msoft-float -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -include system/core/include/arch/linux-arm/AndroidConfig.h -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -DSK_RELEASE -DNDEBUG -O2 -g -Wstrict-aliasing=2 -finline-functions -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers -DNDEBUG -UDEBUG -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64      -MD -o out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/hello.o development/hello/hello.c
target Executable: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld)
prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-g++ -nostdlib -Bdynamic -Wl,-T,build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -o out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld -Lout/target/product/generic/obj/lib -Wl,-rpath-link=out/target/product/generic/obj/lib -lc -lstdc++ -lm  out/target/product/generic/obj/lib/crtbegin_dynamic.o         out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/hello.o       -Wl,--no-undefined prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a out/target/product/generic/obj/lib/crtend_android.o
target Non-prelinked: helloworld (out/target/product/generic/symbols/system/bin/helloworld)
out/host/linux-x86/bin/acp -fpt out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld out/target/product/generic/symbols/system/bin/helloworld
target Strip: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/helloworld)
out/host/linux-x86/bin/soslim --strip --shady --quiet out/target/product/generic/symbols/system/bin/helloworld --outfile out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/helloworld
Install: out/target/product/generic/system/bin/helloworld
out/host/linux-x86/bin/acp -fpt out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/helloworld out/target/product/generic/system/bin/helloworld
分享到:
评论

相关推荐

    虚拟机ubuntu android编译环境搭建过程

    虚拟机 Ubuntu Android 编译环境搭建过程 一、 Linux 下 JDK 的安装 在虚拟机 Ubuntu 下搭建 Android 编译环境,首先需要安装 JDK。输入命令:sudo apt-get install sun-java6-jdk。如果不能下载安装 JDK6,可以...

    MTK Android编译环境搭建

    MTK Android编译环境搭建,按照文档说明可以快速上手 验证有效!

    MTK android 编译环境搭建

    MTK android ubuntu 编译环境搭建, 四个步骤,超级简单,适用于6575,6577,6572,6589等

    Ubuntu 10.04下Android编译环境搭建

    Ubuntu 10.04下Android编译环境搭建

    android 源码编译环境搭建

    android 源码编译环境搭建,LINUX环境。

    ubuntu下android编译环境搭建

    ubuntu下android编译环境搭建大的洼地阿文阿文给挖个阿虎文化和人生萨尔阿文人a

    高通搭建android编译环境的方法

    高通平台搭建android环境的指导文档,包括BSP编译以及AP的完整编译方法

    android编译.doc

    Android 编译环境搭建 Android 编译环境搭建是 Android 应用开发的必要步骤,本文将指导读者从零开始搭建 Android 编译环境,并详细介绍编译 Android 的步骤。 一、安装必要的软件环境 在 Ubuntu 9.10 平台上,...

    MTK Android编译环境配置

    Android 编译环境 配置步骤, MTK 6577 等平台

    android编译环境搭建

    Ubuntu 环境安装 VirtualBox + XP环境搭建 Liunx 常用命令介绍 ...Android编译环境搭建 Android源码的获取和编译 MTK 6573(Android)编译命令介绍 android源码中APP模块分析 如何在android源码中内置一个模块

    Android Android系统开发编译环境配置

    Android Android系统开发编译环境配置

    Android交叉编译环境&Iperf3;.0源码编译

    本文将详细阐述如何在Linux环境下搭建Android交叉编译环境,并针对iperf3.0源码进行编译,以生成适用于Android系统的可执行文件。 首先,交叉编译是指在一个平台上构建另一个平台上的软件。对于Android,我们通常在...

    android编译系统分析(很详细)

    1、build/envsetup.sh:该脚本文件主要定义了一些函数,例如 help()、get_abs_build_var()、get_build_var() 等,这些函数主要用于设置编译环境和变量。 2、Android.mk:该文件主要用于定义编译规则和变量,例如 ...

    高通Android 编译环境搭建方法 英文版

    从高通网站上下载的高通Android编译环境搭建方法希望对大家有所帮助

    Android编译过程详解

    Android 的编译过程可以分为三个阶段:环境变量设置、平台编译选项选择和编译执行。 第一阶段:环境变量设置 在开始编译之前,需要设置环境变量,用于加载编译所需的命令和变量。 envsetup.sh 文件是 Android ...

    android源码编译环境搭建方法说明

    这里详细介绍的了,android源码编译环境搭建方法

    freetype android 编译so库

    本篇将详细介绍如何在Android环境中编译Freetype库,生成适用于64位架构的SO(共享对象)库。 首先,理解Freetype库:Freetype是一个免费的、高质量的类型渲染引擎,它能够读取并渲染各种字体格式,如TrueType、...

    Android编译环境和模拟器环境搭建和介绍

    Android编译环境和模拟器环境搭建和介绍

    MTk android 编译环境大家

    MTK Android 编译环境搭建指南 MTK Android 平台开发环境搭建方法是指在 Ubuntu 操作系统上安装和配置必要的工具和软件,以便成功编译和构建 MTK Android 平台。下面将详细介绍 MTK Android 编译环境搭建步骤。 ...

    Android编译环境的配置.pdf

    Android 编译环境的配置 Android 编译环境的配置是指在 Ubuntu 10.04 操作系统中安装和配置 Android 编译环境的过程。下面将详细介绍该过程中的每一个步骤。 一、软件的安装 在 Ubuntu 10.04 操作系统中,需要...

Global site tag (gtag.js) - Google Analytics