【发布时间】: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