谷歌推出了Soong构建系统,取代了旧的makefile系统.知道它是如何工作的吗?请告诉我有关Android.bp的信息
AOSP 的所有 git 项目都由 repo 工具克隆,该工具读取此 xml:https : //android.googlesource.com/platform/manifest/+/refs/heads/master/default.xml。
AOSP 指南说为了构建,我们应该source build/envsetup.sh
在 repo 克隆所有存储库的文件夹上运行。因此,让我们看看platform/build
清单存储库中的 default.xml。我们得到
<project path="build/make" name="platform/build" groups="pdk" >
<copyfile src="core/root.mk" dest="Makefile" />
<linkfile src="CleanSpec.mk" dest="build/CleanSpec.mk" />
<linkfile src="buildspec.mk.default" dest="build/buildspec.mk.default" />
<linkfile src="core" dest="build/core" />
<linkfile src="envsetup.sh" dest="build/envsetup.sh" />
<linkfile src="target" dest="build/target" />
<linkfile src="tools" dest="build/tools" />
</project>
Run Code Online (Sandbox Code Playgroud)
我们确认envsetup.sh 所在的位置。,它在platform/build
。它定义了m
根据 AOSP 指南构建整个 AOSP 项目的函数:
function _trigger_build()
(
local -r bc="$1"; shift
if T="$(gettop)"; then
_wrap_build "$T/build/soong/soong_ui.bash" …
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建 AOSP 拉丁语 IME(源代码:https : //android.googlesource.com/platform/packages/inputmethods/LatinIME/+/master)而无需下载整个 AOSP 源代码。理想情况下,我想将该项目构建为 Gradle 项目,以便我可以轻松地将其与我现有的 Android 应用程序集成。
我已经取得了一些进展
1] 在 Android Studio 中创建一个空白项目
2]复制粘贴“java”和“java-overridable”文件夹并将“res”文件夹的内容复制粘贴到我的项目中
但是,在项目编译时,由于以下错误,打开时键盘崩溃:
无法加载本机库 jni_latinime
这个错误是有道理的,因为我没有构建和包含 C++ 本机库(在这里找到:https : //android.googlesource.com/platform/packages/inputmethods/LatinIME/+/master/native/jni/)键盘才能发挥作用。
如何构建在上述链接中找到的本机库并将其包含在我的 Gradle 项目中?有没有办法在不下载整个 AOSP 源代码的情况下编译这些 C++ 文件?
该项目带有一个“Android.bp”文件,它似乎指定了如何编译 C++ 文件。不幸的是,我不知道如何使用 Soong 构建系统。https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/master/native/jni/Android.bp
我正在尝试使用soong构建系统使用AOSP源代码为我的本机组件生成代码覆盖率报告.
我扩展了aosp vhal,但单元测试用例与下面的链接相同. http://androidxref.com/8.1.0_r33/xref/hardware/interfaces/automotive/vehicle/2.0/default/tests/
尝试将以下内容添加到Android.bp中的cc_test,cc_binary
native_coverage : true,
cflags: [
"-g",
"-O0",
"-fprofile-arcs",
"-ftest-coverage",
],
ldflags : [
"-fprofile-arcs",
"-ftest-coverage",
],
Run Code Online (Sandbox Code Playgroud)
本地二进制单元测试覆盖是在out/target/product中生成的,但我找不到gcno中间体.
在命令下运行会为每个测试文件提供*.gcda文件.
adb shell \
GCOV_PREFIX=/data/local/tmp \
GCOV_PREFIX_STRIP=`echo $ANDROID_BUILD_TOP | grep -o / | wc -l` \
/data/local/tmp/unit-tests-coverage
Run Code Online (Sandbox Code Playgroud)
我试过下面的链接,但不知道如何继续:(
http://logan.tw/posts/2015/04/28/check-code-coverage-with-clang-and-lcov/ https://android.googlesource.com/platform/bionic.git/+/master- soong https://android.googlesource.com/platform/build/soong/+/581341d%5E%21/ https://android.googlesource.com/platform/external/e2fsprogs/+/fedfb27%5E%21/ https : //android.googlesource.com/platform/development/+/master/scripts/acov#23 http://androidxref.com/9.0.0_r3/xref/bionic/README.md#293
我不确定谷歌的vts框架是否可用于生成本机代码覆盖. https://codelabs.developers.google.com/codelabs/android-vts-8/#6
生成" gcnodir "但不确定如何使用它./coverage/data/nativetest64/vehicle-unit-tests-coverage/unit-tests-coverage.gcnodir
我正在使用 androidmk 工具将 Android.mk 文件转换为 Android.bp,在许多地方我们都有 Android.mk chaning,因此它会生成 srcs:[] 的相对路径,但它不适用于 Android.bp 构建。抛出错误:路径在目录之外:../../XX.cpp
srcs:[ "example1.cpp" "../../example2.cpp" --- 该文件的错误 ]
路径在目录之外:“../../example2.cpp”
我有一个与How to add external header files during bazel/tensorflow build类似的问题。但我希望有更好的解决方案。
我有一个模块需要其他位置的一些外部 .h 头文件。假设我尝试包含“vendor/external/include/thirdpary.h”,在 Android.bp 中,我添加了一些类似的行:
include_dirs: [
"vendor/external/include",
]
Run Code Online (Sandbox Code Playgroud)
但是当我将它包含在我的 CPP 文件中时,编译器抱怨这个文件不存在:
#include "thirdpary.h"
Run Code Online (Sandbox Code Playgroud) 我有一个 Android.mk,它构建了一些库:
ifeq ($(CONDITION),something)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
BDROID_DIR := $(TOP_DIR)system/bt
LOCAL_CFLAGS += \
-Wall \
-Werror
LOCAL_SRC_FILES := ...
LOCAL_HEADER_LIBRARIES := libutils_headers
LOCAL_C_INCLUDES += ...
LOCAL_SHARED_LIBRARIES := \
libcutils \
liblog
LOCAL_MODULE := libowner-vendor
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_OWNER := owner
LOCAL_PROPRIETARY_MODULE := true
include $(BUILD_SHARED_LIBRARY)
include $(call first-makefiles-under,$(LOCAL_PATH))
endif
Run Code Online (Sandbox Code Playgroud)
我想向其中添加一个测试模块,最好是 cc_test,因为我希望能够使用 atest 实用程序调用它。
显然,像这样简单地将其添加到“shared_libs”部分是行不通的:
Android.bp:
cc_test = {
proprietary: true,
name: "libowner-vendor-test",
cflags: [
"-Werror",
"-Wall",
],
srcs: [...],
shared_libs: [
...,
"libowner-vendor",
],
host_supported: false,
} …
Run Code Online (Sandbox Code Playgroud) 我正在尝试根据环境变量集在 Android.bp 中添加/删除模块。例如,如果我将 BUILD_SOURCE 设置为 1,则 Android.bp 中的 cc_prebuilt_binary 会被删除,而会添加一些 cc_binary。
我已经看过指南并看到了下面的句子, https://android.googlesource.com/platform/build/soong/#how-do-i-write-conditionals
Soong 故意不支持 Android.bp 文件中的条件。相反,需要条件的构建规则的复杂性在 Go 中处理
但我找不到控制整个模块而不是模块中的属性的方法。
有谁知道该怎么做或者指南在哪里?
提前致谢 :)
最初,该依赖项包含在 Android 9 的 Android.mk 文件中。该模块可以编译并运行,不会出现任何构建错误。
迁移到 Android 11 时,必须将依赖项“libvlc”添加到 Android.bp static_libs 中。
android_app {
compile_multilib: "both",
static_libs: [
" libvlc",
...
],
}
cc_prebuilt_library_shared {
name: "libvlc",
srcs: ["libs/libvlc.so"],
vendor: true,
}
Run Code Online (Sandbox Code Playgroud)
这会引发错误:
dependency "libvlc" of "MyModule" missing variant:
os:android, arch:common
available variants:
os:android, image:vendor.30, arch:arm64_armv8-a_cortex-a53, sdk:, link:shared, version:
os:android, image:vendor.30, arch:arm64_armv8-a_cortex-a53, sdk:, link:static, version:
os:android, image:vendor.30, arch:arm_armv7-a-neon_cortex-a9, sdk:, link:shared, version:
os:android, image:vendor.30, arch:arm_armv7-a-neon_cortex-a9, sdk:, link:static, version:
14:54:21 soong bootstrap failed with: exit status 1
#### failed to build …
Run Code Online (Sandbox Code Playgroud) 我试图找到一种在 .bp 文件中写入条件的方法。
我在这里找到了一个文档:https : //android.googlesource.com/platform/build/soong/+/HEAD/README.md
它有一个“我如何编写条件?” 部分,它指向 art.go:https ://android.googlesource.com/platform/art/+/master/build/art.go
这几乎不是上述问题的答案。它需要比简单的链接更多的说明。
我的 Android.bp 中有 cc_binary 用于我开发的模块 (HAL)。
cc_binary {
name: "name",
init_rc: ["script.rc"],
vintf_fragments: ["fragments.xml"],
relative_install_path: "path",
srcs: ["src1.cpp", "src2.cpp", ...],
shared_libs: ["sh_lib1", "sh_lib2", ...],
tstic_libs: ["lib1", "lib2", ...],
}
Run Code Online (Sandbox Code Playgroud)
我想添加一个条件 cflag (-DCONDITIONAL),如果环境变量 SOME_ENV_VAR 等于“some_value”,它将被设置为 1。
我在 AOSP 中发现了很多类似 *.go 文件的示例,但结果证明它们对我没有用,因为我不能简单地将那里描述的实践应用到我的案例中。我也没有找到任何关于 *.go 文件的文档,其中描述了如何使用它们做事。我什至找不到“最简单的用法示例”之类的东西。
有谁知道我在这里尝试做的事情有可能吗?
我想构建 aosp 本机测试并在模拟器上调试它。是否可以使用调试符号构建可执行文件?我尝试将-g和-ggdb添加到 Android .bp:
cflags: [
"-Werror",
"-Wall",
"-g",
],
Run Code Online (Sandbox Code Playgroud)
但这没有帮助,我仍然被剥夺了可执行文件。
android-soong ×11
android ×10
android-11 ×1
debugging ×1
gcov ×1
gdb ×1
go ×1
hal ×1
libvlc ×1