导航:首页 > 源码编译 > aosp编译时系统卡死

aosp编译时系统卡死

发布时间:2023-09-05 23:16:44

android学习之Build环境介绍


这里略过对android在手机上的文件系统框架的阐述(google或者都能帮助你找到对应的信息),主要看google是如何把生成合适的rootfs的工作整合到它的build体系当中,同时,会顺带看一下CyanogenMod中对应各种机型的build机制。
首先,来看一下Android的build系统中,使用到的编译选项和相关工具
具体的目录在:mydroid/build/tools/下
|-- acp
这是一个稍微改良的cp命令,用来应付在windows/MAC/linux下的cp命令的缺陷,其中的README很值得一看!
|-- adbs
这是一个用来查看crash问题的工具,详细请看《Android调试工具之adbs》
|-- Android.mk
|-- apicheck
用来进行发布前的API检查(参见mydroid/build/core/tasks/apicheck.mk),是否新编译的系统中有破坏API兼容性或是非法的API
这里的代码是用java写的用来检查编译时生成的API相关信息的xml文件(mydroid/framework/base/api/中),可以参考里面对于xml文件解析的代码
|-- apriori
实现prelink的工具,简单介绍参见(mydroid/bionic/linker/README.TXT)
|-- atree
为android SDK服务的一个工具,用来按照指定xxx.atree文件中的内容进行一些文件操作
|-- bin2asm
不太明白具体的用处,应该是用来应付mac上编译android一些与gcc相关的问题
|-- buildinfo.sh
生成target中的各种xxx.prop文件,如system.prop, build.prop等
|-- check_builds.sh
包装了diff,用来看2个发布版本之间变化
|-- check_prereq
device上进行ota升级时的工具之一
|-- compare_fileslist.py
与check_builds.sh配合完成版本比较的脚本
|-- droiddoc
Android更具javadoc的一些移植
|-- mp-package-stats
简单的查看一个jar/apk文件内的dex和其它文件的大小信息
|-- event_log_tags.py
处理event-log-tags的内容,关于event-log-tags文件的意义参见《Android学习之event-log-tags是神马》
|-- fileslist.py
简化的列出指定目录下所有文件及大小的脚本 -- 可以放入自己的工具库了使用:)
|-- findleaves.py
在指定目录中(可多个)找指定文件的脚本 -- 可以放入自己的工具库了使用:)
|-- fixlinebreaks.sh
把windows中的换行改为linux下的 -- 可以放入自己的工具库了使用:大散芦)
|-- fs_config
列出指定文件夹滚带及文件的权限
|-- fs_get_stats
得到指定文件夹下文件的简单stats信息
|-- iself
判断文件是否是ELF格式
|-- isprelinked
判断文件是否是prelink过的
|-- java-event-log-tags.py
处理event-log-tags的内容,关于event-log-tags文件的意义参见《Android学习之event-log-tags是神马》
|-- kcm
key character map的工具, 相关资料参照:
|-- lsd
!!!!!! ???
|-- merge-event-log-tags.py
处理event-log-tags的内容,关于event-log-tags文件的意掘野义参见《Android学习之event-log-tags是神马》
|-- mktarball.sh
与fs_get_stats配合而执行的打包工具
|-- print_mole_licenses.sh
显示当前目录下所有mole信息
|-- releasetools
-- check_target_files_signatures
|-- common.py
|-- edify_generator.py
|-- img_from_target_files
|-- ota_from_target_files
`-- sign_target_files_apks
|-- rgb2565
rgb转换工具
|-- signapk
命令行下对jar包签名的工具
|-- soslim
Android定制的编译工具之一,简单介绍参见(mydroid/bionic/linker/README.TXT)
|-- warn.py
解析Android系统编译log的工具
`-- zipalign
zipfile的对齐工具,参见该文件夹下的README.TXT
#p#副标题#e#
在来看看Android编译系统中定义的一些通用XXX.mk文件
mydroid/build/core/
|-- armelflib.x
|-- armelf.x
|-- armelf.xsc
|-- base_rules.mk
|-- binary.mk
|-- build_id.mk
|-- build-system.html
|-- checktree
|-- cleanbuild.mk
|-- cleanspec.mk
|-- clear_vars.mk
|-- combo
|-- config.mk
|-- _headers.mk
|-- definitions.mk
|-- device.mk
|-- dex_preopt.mk
|-- distdir.mk
|-- droiddoc.mk
|-- mpvar.mk
|-- dynamic_binary.mk
|-- envsetup.mk
|-- executable.mk
|-- filter_symbols.sh
|-- find-jdk-tools-jar.sh
|-- help.mk
|-- host_executable.mk
|-- host_java_library.mk
|-- host_native_test.mk
|-- host_prebuilt.mk
|-- host_shared_library.mk
|-- host_static_library.mk
|-- java_library.mk
|-- java.mk
|-- legacy_prebuilts.mk
|-- main.mk
|-- Makefile
|-- multi_prebuilt.mk
|-- native_test.mk
|-- node_fns.mk
|-- notice_files.mk
|-- package.mk
|-- pathmap.mk |-- phony_package.mk
|-- prebuilt.mk
|-- process_wrapper_gdb.cmds
|-- process_wrapper_gdb.sh
|-- process_wrapper.sh
|-- proct_config.mk
|-- proct.mk
|-- proguard.flags
|-- proguard_tests.flags
|-- raw_executable.mk
|-- raw_static_library.mk
|-- root.mk
|-- shared_library.mk
|-- static_java_library.mk
|-- static_library.mk
|-- tasks
|-- user_tags.mk
`-- version_defaults.mk
#p#副标题#e#
这里,目录在mydroid/build/core/tasks/有一些特别的task
|-- apicheck.mk, 判断api是否符合AOSP的规范
|-- cts.mk cts测试, 可以在代码根目录, make cts, 编译结束之后,进入out/host/linux-x86/bin/下,执行cts命令
|-- ide.mk IDE开发环境
|-- proct-graph.mk
`-- sdk-addon.mk
NDK的build环境没有包含在标注难得AOSP的/build/目录下
而是在mydroid/ndk/build下
$ cd ndk/build/tools
$ export ANDROID_NDK_ROOT=aosp-root/ndk
$ ./make-release --help
一些小技巧
如何显示每次编译所包含的所有xxx.mk文件
找到build/core/main.mk
把include $(subdir_makefiles)替换为
[plain] view plain $(foreach subdir_makefile, $(subdir_makefiles),
$(info Including $(subdir_makefile))
$(eval include $(subdir_makefile)))
subdir_makefile :=
如果遇见API相关的PACKAGING/checkapi-current-timestamp] Error 38
需要执行:make update-api
如何在AOSP代码目录之外编译
[plain] view plain # Paths and settings
TARGET_PRODUCT = generic
ANDROID_ROOT = /home/karim/android/aosp-2.3.x
BIONIC_LIBC = $(ANDROID_ROOT)/bionic/libc
PRODUCT_OUT = $(ANDROID_ROOT)/out/target/proct/$(TARGET_PRODUCT)
CROSS_COMPILE =
$(ANDROID_ROOT)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
# Tool names
AS = $(CROSS_COMPILE)as
AR = $(CROSS_COMPILE)ar
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
LD = $(CROSS_COMPILE)ld
NM = $(CROSS_COMPILE)nm
OBJCOPY = $(CROSS_COMPILE)obj
OBJDUMP = $(CROSS_COMPILE)objmp
RANLIB = $(CROSS_COMPILE)ranlib
READELF = $(CROSS_COMPILE)readelf
SIZE = $(CROSS_COMPILE)size
STRINGS = $(CROSS_COMPILE)strings
STRIP = $(CROSS_COMPILE)strip
export AS AR CC CPP LD NM OBJCOPY OBJDUMP RANLIB READELF
SIZE STRINGS STRIP
# Build settings
CFLAGS = -O2 -Wall -fno-short-enums
HEADER_OPS = -I$(BIONIC_LIBC)/arch-arm/include
-I$(BIONIC_LIBC)/kernel/common
-I$(BIONIC_LIBC)/kernel/arch-arm
LDFLAGS = -nostdlib -Wl,-dynamic-linker,/system/bin/linker
$(PRODUCT_OUT)/obj/lib/crtbegin_dynamic.o
$(PRODUCT_OUT)/obj/lib/crtend_android.o
-L$(PRODUCT_OUT)/obj/lib -lc -ldl
# Installation variables
EXEC_NAME = example-app
INSTALL = install
INSTALL_DIR = $(PRODUCT_OUT)/system/bin
# Files needed for the build
OBJS = example-app.o
# Make rules
all: example-app
.c.o:
$(CC) $(CFLAGS) $(HEADER_OPS) -c {1}lt;
example-app: ${OBJS}
$(CC) -o $(EXEC_NAME) ${OBJS} $(LDFLAGS)
install: example-app
test -d $(INSTALL_DIR) || $(INSTALL) -d -m 755 $(INSTALL_DIR)
$(INSTALL) -m 755 $(EXEC_NAME) $(INSTALL_DIR)
clean:
rm -f *.o $(EXEC_NAME) core
distclean:
rm -f *~
rm -f *.o $(EXEC_NAME) core
如何增加一个新的设备
[plain] view plain $ cd ~/android/aosp-2.3.x
$ . build/envsetup.sh
$ mkdir -p device/acme/coyotepad
$ cd device/acme/coyotepad
进入AndroidProcts.mk
PRODUCT_MAKEFILES :=
$(LOCAL_DIR)/full_coyotepad.mk
对于full_coyotepad.mk
$(call inherit-proct, $(SRC_TARGET_DIR)/proct/languages_full.mk)
$(call inherit-proct, $(SRC_TARGET_DIR)/proct/full.mk)
DEVICE_PACKAGE_OVERLAYS :=
PRODUCT_PACKAGES +=
PRODUCT_COPY_FILES +=
PRODUCT_NAME := full_coyotepad
PRODUCT_DEVICE := coyotepad
PRODUCT_MODEL := Full Android on CoyotePad, meep-meep
在BoardConfig.mk中
TARGET_NO_KERNEL := true
TARGET_NO_BOOTLOADER := true
TARGET_CPU_ABI := armeabi
BOARD_USES_GENERIC_AUDIO := true
USE_CAMERA_STUB := true
打开vendorsetup.sh
add_lunch_combo full_coyotepad-eng
#p#副标题#e#

② 自己可以编译安卓源码

用最新的Ubuntu 16.04,请首先确保自己已经安装了Git.没安装的同学可以通过以下命令进行安装:

sudo apt-get install git git config –global user.email “[email protected]” git config –global user.name “test”

其中[email protected]为你自己的邮箱.

简要说明

android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4运行.下文也将按照该流程讲述.

源码下载

由于某墙的原因,这里我们采用国内的镜像源进行下载.
目前,可用的镜像源一般是科大和清华的,具体使用差不多,这里我选择清华大学镜像进行说明.(参考:科大源,清华源)

repo工具下载及安装

通过执行以下命令实现repo工具的下载和安装

mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo

补充说明
这里,我来简单的介绍下repo工具,我们知道AOSP项目由不同的子项目组成,为了方便进行管理,Google采用Git对AOSP项目进行多仓库管理.在聊repo工具之前,我先带你来聊聊多仓库项目:

我们有个非常庞大的项目Pre,该项目由很多个子项目R1,R2,...Rn等组成,为了方便管理和协同开发,我们为每个子项目创立自己的仓库,整个项目的结构如下:


这里写图片描述

执行完该命令后,再使用make命令继续编译.某些情况下,当你执行jack-admin kill-server时可能提示你命令不存在,此时去你去out/host/linux-x86/bin/目录下会发现不存在jack-admin文件.如果我是你,我就会重新repo sync下,然后从头来过.

错误三:使用emulator时,虚拟机停在黑屏界面,点击无任何响应.此时,可能是kerner内核问题,解决方法如下:
执行如下命令:

  • ./out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7

  • 通过使用kernel-qemu-armv7内核 解决模拟器等待黑屏问题.而-partition-size 1024 则是解决警告: system partion siez adjusted to match image file (163 MB >66 MB)

    如果你一开始编译的版本是aosp_arm-eng,使用上述命令仍然不能解决等待黑屏问题时,不妨编译aosp_arm64-eng试试.

    结束吧

    到现在为止,你已经了解了整个android编译的流程.除此之外,我也简单的说明android源码的多仓库管理机制.下面,不妨自己动手尝试一下.

    ③ Android Studio 3.5导入AOSP编译的classes.jar

    一、适用场景

        我们在写应用时可能会需要调用系统隐藏的API,这些API是我们无法直接访问的,报如下错误:

     此时,我们需要将系统AOSP的out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar导入到Android Studio中,使app能够访问这些接口。

    二、实现步骤

    Step1 . 在app目录下建立libs文件夹,并将classes.jar包放入该路径

    Step2 .在app目录上右键【Open Mole Settings】,点击左侧【Dependencies】,选择app,点击【+】选择【2 Jar Dependency】,添加

    选择我们的libs/classes.jar,点击【OK】

    Step3 .在Mole的build.gradle中,dependencies自动增加依赖配置,注释掉下面一行

    implementation fileTree(dir: 'libs', include: ['*.jar'])  

    并将implementation files('libs/classes.jar')改为

    compileOnly files('libs/classes.jar')

    最终如下图所示

    Step4 .修改Project的build.gradle,在allProjects中增加如下语句

        gradle.projectsEvaluated {

            tasks.withType(JavaCompile) {

                options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\classes.jar')

            }

        }

    Step5 .修改jar包优先级,在Moels的app.iml文件中找到我们的classes.jar包所在行,

    <orderEntry type="library" name="Gradle: __local_aars__:/Users/mrwong/AndroidStudioProjects/uart_daemon/app/libs/classes.jar:unspecified@jar" level="project" />

    将其移动到

    <orderEntry type="jdk" jdkName="Android API 29 Platform" jdkType="Android SDK" />

    这一行之上,最终如下图所示:

    至此,app可以优先访问我们自己的jar包 。

    阅读全文

    与aosp编译时系统卡死相关的资料

    热点内容
    ssm身份认证源码 浏览:462
    预排序遍历树算法 浏览:669
    加密装置如何打开ping功能 浏览:478
    python下载372 浏览:901
    u盘子文件夹隐藏 浏览:296
    本地误删svn文件夹 浏览:685
    海康威视python通道名 浏览:241
    如何用app覆盖全部曲库 浏览:602
    变异布林源码 浏览:686
    表格加密设置打印区域 浏览:437
    卡耐基pdf下载 浏览:924
    现在最流行的单片机 浏览:88
    机顶盒刷机源码 浏览:985
    编码pdf下载 浏览:946
    隔壁同学app怎么 浏览:301
    c语言宏命令 浏览:542
    php卡死源码 浏览:576
    time库中的clock函数python 浏览:991
    cad视觉移动命令怎么打开 浏览:821
    安卓java调用python 浏览:398