android构建系统如何工作?

时间:2015-07-15 07:10:09

标签: android build kernel gnu-make

我喜欢高度了解android构建系统的工作原理。那是什么时候它补充了GNU make和Linux构建系统以及它何时以及如何区别?我的意思是,有时我们使用make文件为最终图像添加功能,有时我们使用Andoroid.mk?然后有时我们同时使用两者。有没有人很好地掌握这些组件如何协同工作?

例如,我只使用make文件将一个简单的程序添加为模块。另一方面,查看/ external目录中的某些模块有Android.mk文件,有些还有make文件。然后是仿生目录。有人可以详细说明吗?

@ arkascha-我很欣赏这一点,但我认为还有一点。在我看来,GNU make可以通过Android文件夹控制Linux内核目录和Android.mk;这听起来直观不是吗?我正在寻找一个评论,可以进一步详细说明需要更新哪些文件以添加功能。即。看着我的构建环境我有:

0628Samsung                 build.sh       Documentation  include          Makefile           packages         sound
abi                         config-backup  drivers        init             Makefile.bak       pdk              system
AndroidKernel.mk            COPYING        drivres        ipc              Makefile-original  Platform.tar.gz  tools
arch                        CREDITS        dtbTool        Kbuild           mkbootimg          prebuilts        usr
art                         crypto         external       Kconfig          mm                 README           vendor
bin                         cts            files          kernel           modules.order      REPORTING-BUGS   virt
bionic                      dalvik         firmware       Kernel.tar.gz    ndk                samples
block                       developers     frameworks     lib              net                scripts
bootable                    development    fs             libcore          note3              sdk
build                       device         github-repo    libnativehelper  out                security
build_msm8974pro_kernel.sh  docs           hardware       MAINTAINERS      output            

我问这个问题,因为似乎没有清楚地了解AOSP环境。例如,this链接有一个部分,称为将新程序添加到Android源代码树的步骤。在其中,他们建议更新core / main.mk文件。但我的环境并没有他们提到的那些线条。有时候一个人真的没有选择使用一个,make文件与android.mk,或另一个。至少那是我的经历。也许我错过了什么,但我做的是将示例程序添加到外部目录。我能够使用我用于创建图像和闪存手机的相同工具链进行编译。但是可执行文件没有在我的手机上运行,​​这让我相信也许我需要发出其他开关并设置各种环境变量。所以我一直在尝试使用包含的程序构建映像,但构建环境没有进入该目录。在浏览了其他目录之后,我意识到他们中的大多数都有一个Android.mk文件,所以我添加了一个,现在它正在匆匆忙忙。我会告诉你结果如何。这就是我提出这个问题的原因。也许我没有找到正确的地方,没有关于如何为最终图像添加功能的明确稳定内容以及每个文件夹中存在的内容之间的区别。有一个高级别的描述,但这里没有讨论如何将模块添加到this / external,/ bionic,......这就是最终结果。

@Dan Albert-谢谢。我试图将/ external目录中的内容映射到我的设备上,以便将代码放入图像中。我没有太多运气。我按照一组程序来获取一个简单的内核模块。但我只是使用了一个简单的make文件,如下所示:

lib_src := src 
lib_headers := headers 
.PHONY: all $(lib_src) $(lib_headers)
$(lib_src) :
    $(MAKE) --directory=$@
    $(lib_*): $(MAKE) --directory=$@

obj-$(CONFIG_TOS)   += examples.o

所以当你说Android只使用Android.mk时,我想知道。原因是,在这里我只使用了一个make文件,我能够在我的图像中看到生成的代码。此外,我将与您分享另一个例子。在Android Studio项目中,为了获得一些本机项目,您必须创建一个make文件以及一个Android.mk。所以....?必须有更多;没有?每个文件在构建系统中都有一些独特的功能;你不同意吗? 请注意,我只是在努力将我的代码放入最终图像。

我相信我听说/ external目录中的内容只是进入最终图像的/ system文件夹。但我不能证实这一点。这是我的外部目录中的内容:

aac              droiddriver              hyphenation     libpng            nist-sip       sonivox
android-clat     dropbear                 icu4c           libppp            noto-fonts     speex
android-mock     e2fsprogs                iproute2        libselinux        oauth          sqlite
ant-glob         easymock                 ipsec-tools     libsepol          objenesis      srec
antlr            ebtables                 iptables        libusb            okhttp         srtp
apache-harmony   eclipse-basebuilder      iputils         libusb-compat     opencv         stlport
apache-http      eclipse-windowbuilder    jack            libvorbis         openfst        strace
apache-qp        eigen                    javasqlite      libvpx            openssh        stressapptest
apache-xml       elfutils                 javassist       libxml2           openssl        svox
arduino          embunit                  jdiff           libxslt           open-vcdiff    tagsoup
bison            emma                     jhead           libyuv            oprofile       tcpdump
blktrace         esd                      jmdns           linux-tools-perf  pixman         temp
bluetooth        expat                    jmonkeyengine   littlemock        ppp            timezonepicker-support
bouncycastle     eyes-free                jpeg            llvm              proguard       tinyalsa
brctl            fdlibm                   jsilver         lzma              protobuf       tinycompress
bsdiff           flac                     jsr305          marisa-trie       qemu           tinyxml
bzip2            freetype                 junit           markdown          qemu-pc-bios   tinyxml2
ceres-solver     fsck_msdos               kernel-headers  mdnsresponder     regex-re2      tremolo
checkpolicy      ganymed-ssh2             libcap-ng       mesa3d            replicaisland  v8
chromium         gcc-demangle             libffi          mksh              robolectric    valgrind
chromium-libpac  genext2fs                libgsm          mockito           safe-iop       webkit
chromium_org     giflib                   liblzf          mockwebserver     scrypt         webp
chromium-trace   google-diff-match-patch  libmtp          mp4parser         sepolicy       webrtc
clang            grub                     libnfc-nci      mtpd              sfntly         wpa_supplicant_8
compiler-rt      gtest                    libnfc-nxp      naver-fonts       shahin         xmlwriter
dexmaker         guava                    libnl-headers   netcat            sil-fonts      xmp_toolkit
dhcpcd           hamcrest                 libogg          netperf           skia           yaffs2
dnsmasq          harfbuzz                 libpcap         neven             smack          zlib
doclava          harfbuzz_ng              libphonenumber  nist-pkits        smali          zxing

这基本上就是我在external / shahin目录中的内容:

sansari@ubuntu:~/WORKING_DIRECTORY/external/shahin$ more Android.mk 
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= hello_world.S       
LOCAL_MODULE := shahin 
include $(BUILD_EXECUTABLE)
sansari@ubuntu:~/WORKING_DIRECTORY/external/shahin$ more hello_world.S 
.syntax unified  

.global main  
main:  
    push    {ip, lr}  

    ldr     r0, =message  
    bl      printf  

    mov     r0, #0    @ Return 0.  

    pop     {ip, pc}  

message:  
    .asciz "Hello, world.\n" 

简单的汇编代码和Android.mk文件。但是当我从项目的根目录发出make时,我不确定它是否会添加到最终图像中。我没有看到此目录中创建的任何目标文件。我错了吗?我的问题是如何将其纳入最终图像?

1 个答案:

答案 0 :(得分:0)

Android平台构建系统仅使用Android.mk。 external/目录中有正常的makefile,因为这些项目在Android之外构建时使用make,我们只是镜像它们的源代码。不过,我们只使用Android.mk为Android构建它。

Bionic与Android中的其他项目没有什么不同,它只是有一些更复杂的Android.mk结构来处理CPU特定来源的复杂性以及构建低级系统库所带来的各种问题。

Android.mk仍然只是制作。每个include $(BUILD_*)都会在build/core中处理,最终会被重写为正常的制作规则。