【问题标题】:How does android build system work?android构建系统如何工作?
【发布时间】:2015-10-04 02:20:17
【问题描述】:

我希望对 android 构建系统的工作方式有深入的了解。那就是它何时补充了 GNU make 和 Linux 构建系统,它何时以及如何不同?我的意思是为什么有时我们使用 make 文件为最终图像添加功能,有时我们使用 Andoroid.mk?然后有时我们同时使用两者。有没有人很好地掌握这些组件如何协同工作?

例如,我只使用了一个 make 文件来添加一个简单的程序作为一个模块。另一方面,查看 /external 目录,有些模块有 Android.mk 文件,有些还有一个 make 文件。然后是仿生目录。谁能详细说明一下?

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

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 file vs. android.mk,或者其他。至少这是我的经验。也许我错过了一些东西,但我所做的是将示例程序添加到外部目录。我能够使用我用来创建图像和刷写手机的相同工具链来编译它。但是可执行文件没有在我的手机上运行,​​这让我相信也许我需要发出其他开关并设置各种环境变量。所以我一直在尝试用包含的程序来构建镜像,但是构建环境并没有进入那个目录。查看其他目录后,我意识到其中大多数都有一个 Android.mk 文件,所以我添加了一个,它现在正在运行。我会让你知道结果如何。这就是我问这个问题的原因。也许我没有找对地方,没有关于如何向最终图像添加功能以及每个文件夹中驻留的内容之间有什么区别的明确稳定内容。有一个高层次的描述,但这里没有讨论如何将模块添加到这个 /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 时,我不确定它是否被添加到最终图像中。我没有看到后来在这个目录中创建的任何目标文件。也许我弄错了?我的问题是如何将其放入最终图像中?

【问题讨论】:

  • 这就像你的工具箱里有 3 把不同的锤子。您可以使用每个钉子将钉子钉入墙上。所以也许工具箱里的一把锤子就足够了。但话又说回来:有时不同类型的锤子是有意义的。一个重的,一个轻的,一个精确的,一个防滑的,......而且:锤子似乎只是在黑暗的,未被观察到的工具箱中得到后代......

标签: android build kernel gnu-make


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-08-12
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    相关资源
    最近更新 更多