`

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编译环境的搭建主要包括了更新系统,安装编译所需的库,安装JDK,以及配置环境变量这四个关键步骤。这个环境使得开发者能够在Ubuntu环境下编译针对MediaTek处理器的Android系统,为定制和优化...

    MTK Android编译环境搭建

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

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

    整体来说,这份文档是高通提供给开发者的一份详尽的指导手册,旨在帮助开发者在高通平台上顺利搭建Android编译环境,完成系统编译和固件刷写等操作。开发者通过遵循文档中的指导,可以更加高效地进行开发工作,并且...

    Android编译环境搭建.pdf

    根据上述文件内容,Android编译环境的搭建涉及到Linux系统的操作,特别是基于Ubuntu的操作系统。以下是在搭建Android编译环境过程中所需要掌握的知识点: 1. 系统环境配置: - 在Linux Ubuntu系统中,系统配置文件...

    android 源码编译环境搭建

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

    Ubuntu 10.04下Android编译环境搭建

    在Ubuntu 10.04环境下,为了搭建Android的编译环境,我们需要完成一系列的步骤。这个过程主要包括安装Java Development Kit (JDK),配置相关的环境变量,安装必要的编译工具和依赖包,以及解决特定的系统问题。以下...

    android编译.doc

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

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

    除了Android编译环境的配置外,文档还简述了在Ubuntu系统下使用Samba服务实现局域网内文件共享的方法,便于跨平台文件访问与协作。 #### 安装Samba服务器 通过`sudo apt-get install samba`命令安装Samba服务器,...

    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:该文件主要用于定义编译规则和变量,例如 ...

    ubuntu下android ndk编译环境搭建详细描述

    在Ubuntu系统上搭建Android NDK编译环境是Android原生代码开发的重要步骤,适用于那些需要进行C/C++底层开发或优化的应用程序。Android NDK(Native Development Kit)是一套工具,允许开发者使用C/C++编写部分应用...

    MTK Android编译环境配置

    MTK Android编译环境配置知识点: 1. 编译环境的硬件要求:编译MTK Android系统需要较高的硬件配置,包括大于2G的内存(推荐8G以获得更好的编译效率),以及32位或64位的CPU。此外,网络连接也是必要的,以便在安装...

    MTk android 编译环境大家

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

    freetype android 编译so库

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

Global site tag (gtag.js) - Google Analytics