Docker环境下编译android源码|编译可运行xposed

前言

因为我的电脑是Ubuntu18的版本,成功编译xposed刷入手机之后无法启动,检查了所有的环境,没有问题,发现可能是Ubuntu系统的兼容库的问题,但是我不可能重新安装系统吧,毕竟有点蠢,所以最好的方式就是在docker的Ubuntu容器中编译,统一环境问题,也可以隔离环境平时
工作开发环境,下面开始操作

安装配置docker

docker加速,采用对国人友好的镜像地址

通过修改daemon配置文件/etc/docker/daemon.json来使用加速器,执行以下命令:

您可以配置 Docker 守护进程默认使用 Docker 官方镜像加速。这样您可以默认通过官方镜像加速拉取镜像,而无需在每次拉取时指定 registry.docker-cn.com

临时生效:您可以在 Docker 守护进程启动时传入 --registry-mirror 参数:$ docker --registry-mirror=https://registry.docker-cn.com daemon

永久性保留更改,您可以修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值。

$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

拉取Ubuntu镜像

由于我们编译的是Android 6.0系统,推荐使用Ubuntu 14.04 x64系统去编译,可以省去很多麻烦(比如:编译器版本、构建套件版本、依赖库版本等不兼容的问题),这也是我们使用docker的原因。

执行以下命令获取镜像:
$ sudo docker pull ubuntu:14.04 # docker默认都是64位系统

查询本地镜像

查询本地已有的镜像(注意 镜像编号-IMAGE ID)

$ sudo docker images

[email protected]:/etc/docker$ sudo docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
ubuntu               14.04               2c5e00d77a67        6 weeks ago         188MB
rethinkdb            latest              cc5badcd88e8        7 weeks ago         184MB
nginx                latest              53f3fd8007f7        7 weeks ago         109MB
openstf/stf          latest              f8f8d84596a0        7 weeks ago         784MB
sorccu/adb           latest              7123ee61b746        15 months ago       30.5MB
openstf/ambassador   latest              b1f0eb8297cf        3 years ago         6.46MB

查看本地的容器

[email protected]:/etc/docker$ sudo docker ps -a

启动镜像

这里使用仓库:标签的方式 sudo docker run -it ubuntu:14.04 /bin/bash 这样就可以得到一个伪终端

# 启动镜像,并获取一个伪终端
# 注意:实际启动的是容器,启动镜像时会自动创建新容器并启动。
$ sudo docker run -it <REPOSITORY:TAG> /bin/bash   # 使用  仓库名+标签 启动
$ sudo docker run -it <IMAGE ID> /bin/bash     # 使用 IMAGE ID 启动
# 退出镜像
>> $ exit   # 或使用快捷键 Ctrl + D

更换系统源

好像这里使用vi会有点问题,所以建议使用重定向的方式写入,参考修改配置docker镜像地址

>> # cp /etc/apt/sources.list /etc/apt/sources.list.bak
>> # echo "新的数据源" > /etc/apt/sources.list  // 使用新的数源替换
>> # apt-get update
>> # exit
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

添加中文语言支持

添加中文语言支持
启动指定容器后进入Ubuntu容器内部执行操作:

>> $ locale       #查询当前语言
>> $ locale -a    #查询支持的语言
# 若不支持UTF-8,则添加UTF-8语言支持
>> $ apt-get install language-pack-zh-hant language-pack-zh-hans # 中文
>> $ language-pack-en # 英文
# 修改 /etc/profile 文件,添加:
export LANG=zh_CN.UTF-8
export LANGUAGE=zh_CN:zh
# 重新加载资源
>> $ source /etc/profile

更正时区时间

启动指定容器后进入Ubuntu容器内部执行操作:

>> $ date  # 查看当前时间
>> $ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
>> $ echo 'Asia/Shanghai' >/etc/timezone

配置编译专用镜像

使用以下命令创建一个容器,并挂载 ~/share 目录到容器中的/home/share 目录:
$ docker run -it -v ~/share:/home/share ubuntu:14.04 /bin/bash

说明:此处挂载一个目录到容器中方便以后操作。

添加64位系统对32位的支持
1> 检查是否已经支持

>> $ dpkg --print-architecture     # 若支持,输出 amd64
>> $ dpkg --print-foreign-architectures    # 若支持,输出 i386

手动开启支持

>> $ sudo dpkg --add-architecture i386
>> $ sudo apt-get update

更新所有的软件(没必要)
>> $ sudo apt-get dist-upgrade

只安装支持库(原来需要安装 ia32-libs,目前被以下三个库取代)

$ sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0

添加编译Android源码需要的依赖
安装编译工具以及构建套件:

$ sudo apt-get install gcc-multilib g++-multilib build-essential

安装必要的工具软件

>> $ sudo apt-get install git-core gnupg bison flex gperf pngcrush bc zip curl lzop
>> $ sudo apt-get install schedtool libxml2 libxml2-utils xsltproc squashfs-tools 

安装其他需要的库

>> $ sudo apt-get install libesd0-dev libsdl1.2-dev libwxgtk2.8-dev libswitch-perl
>> $ sudo apt-get install libssl1.0.0 libssl-dev lib32readline-gplv2-dev libncurses5-dev

附:命令说明:

bc           命令行计算器
lzop             快速压缩工具
flex             词法分析器生成器
curl             基于URL的文件传输工具
gperf            哈希函数生成器
bison            语法分析器生成器
xsltproc         快速XSLT引擎,可以通过XSL文件把XML转为HTML,XHTML,PDF...
schedtool        查询或设置CPU状态
squashfs-tools       linux内核压缩工具,只读式压缩文件系统Image
pngcrush         批量压缩PNG图片
libxml2 libxml2-utils    操作XML文档工具

提交容器保存为镜像

配置好环境之后,保存此容器为一个镜像:

$ sudo docker commit -m "xxx" <CONTAINER ID> <TEPO:TAG>

例如,使用$ docker ps -a指令查询刚才的容器编号为1a61adfb1953,我们保存为一个本地镜像,则可执行:

$ sudo docker commit -m "local_ubuntu14" 7e242d3a00ae local_ubuntu14:ubuntu_v1.0

使用$ docker images可以查看刚生成的镜像:

[email protected]:~/share$ sudo docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
local_ubuntu14       ubuntu_v1.0         97793b37c017        15 seconds ago      796MB
ubuntu               14.04               2c5e00d77a67        6 weeks ago         188MB
rethinkdb            latest              cc5badcd88e8        7 weeks ago         184MB
nginx                latest              53f3fd8007f7        7 weeks ago         109MB
openstf/stf          latest              f8f8d84596a0        7 weeks ago         784MB
sorccu/adb           latest              7123ee61b746        15 months ago       30.5MB
openstf/ambassador   latest              b1f0eb8297cf        3 years ago         6.46MB

根据提交的本地镜像启动容器,将宿主主机的Android的源码目录挂载到镜像的aosp目录
sudo docker run -it -v ~/bin:/home/aosp local_ubuntu14 /bin/bash

编译前环境准备 - 环境列表

主机系统:ubuntu18.0.4LTS
主机 :java version "1.8.0_211"
docker Server Version: 18.09.5
Kernel Version: 4.18.0-25-generic
镜像:ubuntu 14.04
容器内源码版本:android-6.0.1_r11
容器内java版本:java version "1.7.0_201"

编译前须知

  • docker相关的文件都在/var/lib/docker目录下

开始编译Android源码和xposed

  1. 进入容器内部sudo docker exec -it [容器id] /bin/bash

2.. 配置perl环境参考Android源码编译文章配置

  1. 这里我是在Ubuntu里面编译的XposedBridge,容器里面编译xposed(注意修改配置文件和输出目录),这样好处就是可以分离环境,Ubuntu里面配置Java8,容器里面配置Java7,其实主要是懒得再安装配置一遍环境了,反正映射的都是同一个源码目录

    • 宿主主机XposedTools项目下./buile.pl -a java 开始编译XposedBridge
  2. 开始编译Xposed
    • 编译前需要检查XposedBridge放在输出目录的Java文件夹下,xposed项目在$aosp/frameworker/bash/cmds/xposed,xposed_art在$aosp/art下替换原来的源码目录下的art,并且切换到对应的的源码版本分支;
    • 宿主主机XposedTools项目下./buile.pl -t arm64:23 开始编译Xposed,

常见问题解决

USER问题(由于运行的docker没有配置USER环境变量)

including ./tools/external/fat32lib/Android.mk ...
Install: out/host/linux-x86/framework/jack.jar
out/host/linux-x86/bin/jack-admin: line 27: USER: unbound variable
make: *** [out/host/linux-x86/framework/jack.jar] Error 1
make: *** Deleting file `out/host/linux-x86/framework/jack.jar'

#### make failed to build some targets (41 seconds) ####

解决办法 :

  • export USER=$(whoami)
  • 或者ENV USER root //也可以是自己需要的名字

错误日志详细

Last 10 lines from the log:
   target Unpacked: patchoat (out/target/product/generic_arm64/obj_arm/EXECUTABLES/patchoat_intermediates/PACKED/patchoat)
   target Symbolic: patchoat (out/target/product/generic_arm64/symbols/system/bin/patchoat)
   target Strip: patchoat (out/target/product/generic_arm64/obj_arm/EXECUTABLES/patchoat_intermediates/patchoat)
   Install: out/target/product/generic_arm64/system/bin/patchoat
   collect2: error: ld returned 1 exit status
   make: *** [out/target/product/generic_arm64/obj_arm/SHARED_LIBRARIES/libxposed_art_intermediates/LINKED/libxposed_art.so] Error 1
   make: *** Waiting for unfinished jobs....

   #### make failed to build some targets (04:32 (mm:ss)) ####

因为之前在Ubuntu18上编译过的源码直接拿过来出现了这个问题,在源码目录执行git status发现改了cang编辑器,算了,直接还原环境,重新拉取guthub上xposed_art的art6.0对应的分之,重新编译果然没有这个问题了,并且成功编译通过

卡开机界面的解决

编译成功之后刷入手机卡在开机界面,获取日志

Failed to dlopen libart.so: dlopen failed: cannot locate symbol "__android_log_error_write" referenced by "/system/lib64/libart.so"...

在你报错的库libxxx.so的编译脚本Android.mk请加上:LOCAL_LDFLAGS += -fuse-ld=bfd

# 直接追加的方式
ifeq (1,$(strip $(shell expr $(PLATFORM_SDK_VERSION) \>= 22)))
  LOCAL_WHOLE_STATIC_LIBRARIES := libsigchain
  LOCAL_LDFLAGS := -Wl,--version-script,art/sigchainlib/version-script.txt -Wl,--export-dynamic
  LOCAL_LDFLAGS += -fuse-ld=bfd
endif

这样改过之后,可能会报:unrecognized option ‘–icf=safe’

果然修改之后编译出现如下错误

Last 10 lines from the log:
   target Symbolic: xposed (out/target/product/generic_arm64/symbols/system/bin/app_process64_xposed)
   target Strip (keep symbols): xposed (out/target/product/generic_arm64/obj/EXECUTABLES/xposed_intermediates/app_process64_xposed)
   /home/aosp/WORKING_DIRECTORY/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/../lib/gcc/arm-linux-androideabi/4.9.x-google/../../../../arm-linux-androideabi/bin/ld.bfd: unrecognized option '--icf=safe'
   /home/aosp/WORKING_DIRECTORY/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/../lib/gcc/arm-linux-androideabi/4.9.x-google/../../../../arm-linux-androideabi/bin/ld.bfd: use the --help option for usage information
   collect2: error: ld returned 1 exit status
   make: *** [out/target/product/generic_arm64/obj_arm/EXECUTABLES/xposed_intermediates/LINKED/app_process32_xposed] Error 1
   make: *** Waiting for unfinished jobs....

   #### make failed to build some targets (43 seconds) ####

解决办法:
修改TARGET_linux-arm.mk中P134行对TARGET_GLOBAL_LDFLAGS的赋值,去掉–icf=safe

这个路径采用如下命令查找出来的,源码目录下执行find ./ -iname TARGET_linux-arm.mk
路径是$aosp/build/core/combo/TARGET_linux-arm.mk

以上两种只是尝试方法,实际上并不能解决问题,第二种更是直接导致编译无法通过 ;通过重新配置统一的环境之后成功解决问题,刷入手机完美运行

将成功编译好的容器提交为镜像 导致根分区爆满

sudo docker commit "commit images" [containerId] myaosp:v1.0 ;

执行到一半,将根目录爆满,呵呵,赶紧ctrl +c终止,可能跟我挂载了主机的aosp目录并且在容器内部拉取了新的AOSP有关系,数据量太大,
解决办法:
临时解决:网上找了很多清理Linux的方法感觉可操作性都不强,毕竟涉及到清理文件还是谨慎一些的好,一招回到解放前可是不愿意的,先重启docker释放一部分吧

启动 systemctl start docker (这条命令即可)
守护进程重启 sudo systemctl daemon-reload
重启docker服务 systemctl restart docker
重启docker服务 sudo service docker restart
关闭docker service docker stop
关闭docker systemctl stop docker

写在最后

感谢这位博主提供的参考资料使用Docker编译Android系统源码

小确幸

每一丝灵感都值得被记录,每一笔记录都是成长,每一点成长都值得欢呼

博主个人站: www.imisty.cn
CSDN博客: https://blog.csdn.net/lookinthefog
博客园 :https://imist.cnblogs.com/

希望能够认识一些热爱技术的小伙伴,欢迎友链接哟

原文地址:https://www.cnblogs.com/imist/p/11417602.html

时间: 2024-11-10 01:07:22

Docker环境下编译android源码|编译可运行xposed的相关文章

Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决

本文转至  http://blog.csdn.net/yanzi1225627/article/details/9263097 昨晚在编译源码,make一段时间之后报错如下: [html] view plaincopyprint? # A fatal error has been detected by the Java Runtime Environment: # #  SIGSEGV (0xb) at pc=0x40362d33, pid=12195, tid=2835454784 # # 

【转】在Ubuntu下编译Android源码并运行Emulator

原文网址:http://www.mcuos.com/thread-4553-1-1.html 建立编译环境 1.在VirtualBox上安装Ubuntu 2.安装JDK   $ sudo apt-get install sun-java5-jdk  或   $ sudo apt-get install sun-java6-jdk (donut 1.6)3.安装flex,bison,gperf,libsdl-dev,libesd0-dev,libwxgtk2.6-dev(可选),build-ess

基于海思Hi3716cv200的Android源码编译及烧写

1.先说说硬件配置,我最开始是在Win7(I7 4770,8G RAM,2T硬盘)里装ubuntu10.10 64位系统(4G RAM,200G 硬盘)进行源码编译,大概花了3个多小时.而且还多次出现outofmemoryerror 错误.最后将硬件升级为I7 4770.16G内存.2T硬盘,不装虚拟机,直接跑Ubuntu 10.10系统,Swap分区为16G,编译一次大概花了40分钟,没有报任何错误. 所以不推荐在虚拟机里面跑. 2.根据官方文档配置编译环境: 官方文档说的是在"发布包/Sof

Android源码编译的全过程记录

写本篇文章主要参考了官方文档和网上的一些资料,但是对于Android最新的代码来说,网上资料有些已经过时.本文中步骤已经作者实验,大家可以亲自执行试试.由于没有使用Eclipse的习惯,所以没有做Eclipse的相关配置. 编译环境:ubuntu9.10,widnows平台目前不被支持. 1)安装必要的软件环境 $ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev l

编译Android源码致命错误解决方案

编译Android源码致命错误解决方案 字数1506 阅读17447 评论0 喜欢3 相信各位和我一样正在研究android内核的朋友们在经过漫长的源码下载的等待后,喜悦的拿到了源代码开始编译.可是在编译过程中,也会和下载一样出现各种各样的不顺.在这里我记录了一下本人在编译过程中的所有问题,如有疏漏,欢迎朋友们指出.下面是按照正常编译流程记录的所需步骤和操作,可能遇到的问题会在后面讲述. 步骤一:初始化编译环境 首先进入android源码所在目录,然后在Linux终端执行以下命令来完成编译初始化

白话开发——自己动手编译Android源码

在Android Studio代码调试一文中,简单的介绍了Android Studio代码调试的一些技巧.现在呢,我们来谈谈android源码编译的一些事.(俺认为,作为android developer人人都应该有一份自己Android源码,这样我们就可以随时对自己有疑惑的地方通过亲手调试来加强理解). 本文使用最新的Ubuntu 16.04,在开始之前,请首先确保自己已经安装了Git.没安装的同学可以通过以下命令进行安装: sudo apt-get install git git confi

Android源码编译

Android源码编译学习小结 内容 系统源码编译 笔者之前在学习安卓系统源码的编译,为了能够印象深刻,粗略的总结了以下内容,希望对我一样的初学者有一些帮助. 系统编译的初始化指令 对android编译环境进行初始化很简单,分为两步.第一步打开终端输入source build/envseup.sh加载所需的文件. $ source build/envseup.sh including device/asusource build/envseup.shs/grouper/vendorsetup.s

编译Android源码

Android源码体积非常庞大,由Dalvik虚拟机.Linux内核.编译系统.框架代码.Android定制C库.测试套件.系统应用程序等部分组成,在编译Android源码之前,先掌握Android源码的组成. Android源码目录结构 在Android源码中,按照不同功能代码被放在不同的目录下: 目录 描述 bionic 针对Android系统定制的仿生标准C库.链接器等所在目录,Android系统并没有使用Linux的glibc库,bioinc C库针对嵌入式系统做了优化,添加了一些And

【转】Ubuntu10.04上编译Android源码(Build Android source in Ubuntu10.04 Platform)

原文网址:http://blog.csdn.net/chenyafei617/article/details/6570928 一.Introduction 今天我们就来谈谈如何在Ubuntu平台上面编译android源码,我的是ubuntu10.04版本,在进行编译流程讲解之前我想讲一下 make .make snod .make kernel的作用,m.mm.mmm它们的作用以及区别. - make:                 编译源码,生成相应的系统镜像文件.