欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android源码编译以及导入过程

程序员文章站 2022-07-14 13:47:48
...

1.背景

源于自己想重新探索下android系统整个源码结构以及研究核心服务组件的实现原理,另外想将整个过程记录下来以备后续查看。(本次编译实例为android8.1.0,系统环境为ubuntu)

2.源码下载

不用说首先肯定得先参考官网将对应的源码拉下来,这里我就直接给官网地址不瞎补充了。下载地址

3.编译环境搭建

编译前需要根据源码对应的版本安装相应版本的jdk,不然将无法执行编译操作。

android系统版本 jdk版本
7.0以上 OpenJdk8
5.x-6.0 OpenJdk7
2.3-4.4.x Java Jdk6

本人是安装openjdk8,直接通过命令行如下:

    $ sudo apt-get update
    $ sudo apt-get install openjdk-8-jdk
复制代码

然后修改环境变量,我以前是用javajdk8因此需要修改才能正常使用。

注意如果缓存不够会报警,需要在源码树的根路径执行以下命令(不同源码路径可能会不一样):

prebuilts/misc/linux-x86/ccache/ccache -M 50G
复制代码
执行编译过程中如果报错很大可能是某些依赖工具没有安装,可以通过google查询对应软件名进行安装即可。当然为了防止编译中出错可以将以下依赖工具全部装下:
复制代码
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential  
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib 
sudo apt-get install libc6-dev-i386 
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache
复制代码

4.编译

初始化编译环境

执行如下命令:

    $ source build/envsetup.sh
复制代码

不难发现该命令只是引入了其他执行脚本,至于这些脚本做什么,目前不在本文中细说.
该命令执行成功后,我们会得到了一些有用的命令,比如最下面要用到的lunch命令.

选择编译目标

通过lunch指令设置编译目标,所谓的编译目标就是生成的镜像要运行在什么样的设备上.这里我们设置的编译目标是aosp_arm64-eng,因此执行指令:

$ lunch aosp_arm64-eng
复制代码

编译目标格式说明

编译目标的格式:BUILD-BUILDTYPE,比如上面的aosp_arm-eng的BUILD是aosp_arm,BUILDTYPE是eng.

编译目标列表

如果想查看所有的编译目标可以通过在命令行下输入(会列出所有编译目标):
复制代码
$ lunch
复制代码

注意点:google亲儿子有专用编译目标如下

设备型号 设备代码 编译目标
Nexus 6P angler aosp_angler-userdebug
Nexus 5X bullhead aosp_bullhead-userdebug
Nexus 6 shamu aosp_shamu-userdebug
Nexus 5 hammerhead aosp_hammerhead-userdebug

5.开始编译

$ make -j8
复制代码

该指令通过-j参数来设置参与编译的线程数量,以提高编译速度.比如这里我们设置8个线程同时编译:

6.源码导入

编译完成之后我们还需要生成androidstudio所需要的格式,在源码根目录执行以下命令即可:

$ mmm development/tools/idegen/
$ sh ./development/tools/idegen/idegen.sh
复制代码

修改android.iml文件去掉不想阅读的代码。
打开Intellij和Android Studio,File->open->android.ipr,或者Andoird Stuido, Open an existing Android Studio project -> android.ipr所在目录,然后等待索引的建立即可。
之后再删除当前项目setting中SDKs中classpath和sourcepath的指向,指向到源码目录下的frameworks和external目录下,apply即可。

结尾

本文属于个人实践总结,其中参考了许多其他人写的文章如有不妥敬请见谅。

转载于:https://juejin.im/post/5af94df7f265da0ba2671b5d