android 系统源码调试 局部变量值_如何方便快速的整编Android 9.0系统源码?

点击上方“刘望舒”,选择“星标”

多点在看,就是真爱!

作者 :  刘望舒  |  来源 :刘望舒的博客地址:http://liuwangshu.cn/framework/aosp/3-compiling-aosp.html

前言

在上一篇文章是时候下载Android 9.0系统源码了
中,我们顺利的将AOSP下载了下来,很多时候我们不仅仅需要去查看源码,还有以下的几个需求:

  • 动态调试Android系统源码

  • 定制Android系统

  • 将最新版本的Android系统刷入到自己的Android设备中

为了实现这些需求,就需要我们去编译系统源码。

1.编译系统概述

了解以下一些概念,会对Android编译系统有大概的了解。Makefile
Android平台的编译系统,其实就是用Makefile写出来的一个独立项目。它定义了编译的规则,实现了“自动化编译”,不仅把分散在数百个Git库中的代码整合起来、统一编译, 而且还把产物分门别类地输出到一个目录,打包成手机ROM,还可以生成应用开发时所使用的SDK、NDK等。
因此,采用Makefile编写的编译系统,也可以称为Makefile编译系统。Android.mk
Makefile编译系统的一部分,定义了一个模块的必要参数,使模块随着平台编译。通俗来讲就是告诉编译系统,以什么样的规则编译你的源代码,并生成对应的目标文件。

Ninja
Ninja是一个致力于速度的小型编译系统,如果把其他的编译系统看作高级语言,那么Ninja 目标就是汇编。

Soong
Soong是谷歌用来替代此前的Makefile编译系统的替代品,负责解析Android.bp文件,并将之转换为Ninja文件

Blueprint
Blueprint用来解析Android.bp文件翻译成Ninja语法文件。

kati
kati是谷歌专门为了Android而开发的一个小项目,基于Golang和C++。 目的是把Android中的Makefile,转换成Ninja文件。

Android.bp
Android.bp,是用来替换Android.mk的配置文件。

Android.mk、Ninja、Soong、Blueprint、kati、Android.bp的概念之间的联系为:

dde6a73435352bb7b5206de331b13230.png

Blueprint负责解析Android.bp文件内容,Blueprint类似一个处理相关语法的库文件,Soong则是定义具体如何处理相应的语法以及命令实现。通俗来讲就是Soong借助于Blueprint定义的Android.bp语法,完成Android.bp的解析,最终转换成Ninja文件。
Makefile文件会通过kati转换为Ninja文件。
随着Android工程越来越大,采用Makefile的编译系统花费的时间也越来越长,因此谷歌在Android 7.0开始引入了Ninja来编译系统,相对于Makefile来说Ninja在大的项目管理中速度和并行方面有突出的优势。
Makefile默认文件名为Makefile或makefile,也常用.make或.mk作为文件后缀。 Ninja的默认文件名是build.ninja,其它文件以.ninja为后缀。Makefile与Ninja的区别在于, Makefile是设计来给开发编写的,而Ninja设计出来是给其它程序生成的。如果Makefile是Java语言,那么Ninja就是汇编语言。

2.编译源码的方式

Androd系统源码编译有很多种方式,主要有以下几种:

  • 在Linux中直接进行系统源码编译(Android官方支持)

  • 在Mac OS中直接进行系统源码编译(Android官方支持)

  • 使用Docker编译,支持Mac OS和Windows

其中需要注意的是,Docker的最低支持版本为Windows7,建议用Windows10环境下使用Docker,因为在Windows7种还需要借助Docker Toolbox和VirtualBox中的容器进行通信,效率相对低些。
考虑到大多数人的设备和上手难易程度,本为讲解在Linux中直接进行系统源码编译,如果你的系统不是Ubuntu,可以查看趁周末,用VirtualBox安装 Ubuntu吧!这篇文章。

3.准备编译环境

1.安装 jdk8

sudo apt-get update
sudo apt-get install openjdk-8-jdk

2.使用 ubuntu 14+,需要安装以下依赖包:

sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip

3.设置处理器数量
在设置-->系统-->处理器选项,设置处理器数量,建议选择能设置的最大值,这里设置的是6。

4.源码整编

整编就是编译整个Android 源码,整编主要有三个步骤,下面分别就行介绍。

1.初始化环境

在AOSP的根目录,输入如下的命令:

source build/envsetup.sh
// 编译前删除build文件夹A
make clobber

使用 build目录中的envsetup.sh 脚本初始化环境,这个脚本会引入其他的执行脚本。

2. 选择编译目标
输入命令:

lunch

lunch命令是envsetup.sh里定义的一个命令,用来让用户选择编译目标。
会有以下信息输出:

You're building on Linux

Lunch menu... pick a combo:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_mips-eng
     4. aosp_mips64-eng
     5. aosp_x86-eng
     6. aosp_x86_64-eng
     7. aosp_car_arm-userdebug
     8. aosp_car_arm64-userdebug
     9. aosp_car_x86-userdebug
     10. aosp_car_x86_64-userdebug
     11. mini_emulator_arm64-userdebug
     12. m_e_arm-userdebug
     13. m_e_mips64-eng
     14. m_e_mips-userdebug
     15. mini_emulator_x86_64-userdebug
     16. mini_emulator_x86-userdebug
     17. uml-userdebug
     18. aosp_cf_x86_auto-userdebug
     19. aosp_cf_x86_phone-userdebug
     20. aosp_cf_x86_tablet-userdebug
     21. aosp_cf_x86_tablet_3g-userdebug
     22. aosp_cf_x86_tv-userdebug
     23. aosp_cf_x86_wear-userdebug
     24. aosp_cf_x86_64_auto-userdebug
     25. aosp_cf_x86_64_phone-userdebug
     26. aosp_cf_x86_64_tablet-userdebug
     27. aosp_cf_x86_64_tablet_3g-userdebug
     28. aosp_cf_x86_64_tv-userdebug
     29. aosp_cf_x86_64_wear-userdebug
     30. cf_x86_auto-userdebug
     31. cf_x86_phone-userdebug
     32. cf_x86_tablet-userdebug
     33. cf_x86_tablet_3g-userdebug
     34. cf_x86_tv-userdebug
     35. cf_x86_wear-userdebug
     36. cf_x86_64_auto-userdebug
     37. cf_x86_64_phone-userdebug
     38. cf_x86_64_tablet-userdebug
     39. cf_x86_64_tablet_3g-userdebug
     40. cf_x86_64_tv-userdebug
     41. cf_x86_64_wear-userdebug
     42. aosp_marlin-userdebug
     43. aosp_marlin_svelte-userdebug
     44. aosp_sailfish-userdebug
     45. aosp_walleye-userdebug
     46. aosp_walleye_test-userdebug
     47. aosp_taimen-userdebug
     48. hikey-userdebug
     49. hikey64_only-userdebug
     50. hikey960-userdebug

Which would you like? [aosp_arm-eng]

意思就是要你选择编译目标的格式,编译目标的格式组成为BUILD-BUILDTYPE,比如aosp_arm-eng的BUILD为aosp_arm,BUILDTYPE为eng。

其中BUILD表示编译出的镜像可以运行在什么环境,aosp代表Android开源项目,arm表示系统是运行在arm架构的处理器上。
更多参考官方文档。
BUILDTYPE 指的是编译类型,有以下三种:

  • user:用来正式发布到市场的版本,权限受限,如没有 root 权限,不能 dedug,adb默认处于停用状态。

  • userdebug:在user版本的基础上开放了 root 权限和 debug 权限,adb默认处于启用状态。一般用于调试真机。

  • eng:开发工程师的版本,拥有最大的权限(root等),具有额外调试工具的开发配置。一般用于模拟器。

如果你没有Nexus设备,只想编译完后运行在模拟器查看,那么BUILD可以选择aosp_x86,BUILDTYPE选择eng,Which would you like? [aosp_arm-eng]后面直接输入对应序号5就可以。

也可以直接指定编译的目标:

lunch aosp_x86-eng

或者(不同的系统版本,序号的对应会有差别,建议不要直接用序号)

lunch 5

3. 开始编译
通过-jN参数来设置编译的并行任务数,以提高编译速度,在此前我的CPU核心数为6,这里N值最好选在6到12之间,这里我们设置6个并行任务进行编译:

make -j6

整编成功后会打印类似如下内容:

98b282905306b4b1768c3b13d67cbb94.png

由于采用的是虚拟机整编,编译速度会慢一些,这里花费了2小时46分钟.
最终会在 out/target/product/generic_x86/目录生成了三个重要的镜像文件: system.img、userdata.img、ramdisk.img。大概介绍着三个镜像文件:
system.img:系统镜像,里面包含了Android系统主要的目录和文件,通过init.c进行解析并mount挂载到/system目录下。
userdata.img:用户镜像,是Android系统中存放用户数据的,通过init.c进行解析并mount挂载到/data目录下。
ramdisk.img:根文件系统镜像,包含一些启动Android系统的重要文件,比如init.rc。

运行模拟器
在编译完成之后,就可以通过以下命令运行Android虚拟机了,命令如下:

source build/envsetup.sh
lunch 5
emulator

如果是在编译完后运行虚拟机,由于之前已经执行过source和lunch命令了,可以直接运行:

emulator

如果不出意外就会启动模拟器,如果出现报错,网上也有很多的解决方案。

5.源码单编

比如我们要编译系统的Settings应用模块,
在AOSP根目录执行:

source build/envsetup.sh
lunch 5

进入Settings的目录:

cd packages/apps/Settings

mm编译当前目录下的模块,不编译依赖模块。

mm

编译成功后会有提示生成文件的存放路径。

07d2d0394441a7dca3551035cf7333ad.png

除了Settings.odex文件,还会在out/target/product/generic_x86/system/priv-app/Settings目录下生成Settings.apk。

如果你修改了源码,想查看生成的APK文件,有两种方式:

  1. 通过adb push或者adb install 来安装APK。

  2. 使用make snod命令,重新生成 system.img,运行模拟器查看。

热门文章

Java中的锁到底有几种,你知道吗?

Flutter 美团的实践及原理

一次违反常规的大厂OPPO面试经历(文末大量面试文章)

----------  END  ----------

分享大前端、Java、跨平台等技术,

关注职业发展和行业动态。

a8c577bb78dce0956799e40f94484d90.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让“是男人就下到100层”在Android平台上跑起来

原工程:https://github.com/jeekun/DownFloors 移植后的代码:HelloCpp.zip 移植后的APK:HelloCpp.apk 说明:(cocos2d-x版本是“ 2.2) 1.该工程是直接在HelloCpp上修改完成,所以包名也不修改了 2.原工程里面可能是采用g…

Codeforces Round #277 (Div. 2) 题解

Codeforces Round #277 (Div. 2)A. Calculating Functiontime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputFor a positive integer n lets define a function f: f(n)   - 1  2 - 3  ..  ( - 1)nn Your …

QT 边框圆角处理

平时的边框是平角的: 如果需要圆角的话,就要加stylesheet加上这个: border-radius:3px;比如: QPushButton{ border-radius:3px; }就变成圆角了: px前面的数字越大就越圆,比如5px比3px圆 假如只需要某一…

3级调度 fpga_Vivado HLS学习笔记——1.了解FPGA架构

本篇文章为本人学习Xilinx的Vivado HLS教程记录的学习笔记,仅供学习参考。Vivado HLS官方视频教程:优酷视频​v.youku.com目录: Vivado HLS课程简介FPGA与CPU、GPU、DSP的区别FPGA的优势Xilinx FPGA架构:逻辑单元、算术逻辑单元、存储单元使用…

BZOJ2435 [Noi2011]道路修建

这是NOI11年题,你在逗我? 直接dfs就可以了,Linux下貌似不会爆栈。。。 1 /**************************************************************2 Problem: 24353 User: rausen4 Language: C5 Result: Accepted6 Time:5184 …

Qt异常结束程序无法重新运行

有时候代码有问题会导致qt异常结束 修改完后重新运行又会出现 查看任务管理器又没有这个进程 可以使用资源管理器打开看看 也可以考虑使用process explorer查看 发现程序挂起来,结束掉它就可以重新运行了

Qt新添加的类无法链接

通过这个方法给工程添加了个类: 编译的时候就出现了这个问题: 执行一下qmake 然后再重新构建项目就可以了

按钮图片拉伸_图片墙有多香?高手都在用的PPT封面制作技巧!

大家好,我是李导~这次,冬天是真的来了,不知道大家有没有感觉,每次冷空气真正袭来之前我们都会以为今年是个暖冬,结果突然有一天气温从20度直降到个位数,我们都会认为今年比以往的冬天都冷。但是&#xff0c…

POJ 1745 Divisibility【DP】

题意:给出n,k,n个数,在这n个数之间任意放置,-号,称得到的等式的值能够整除k则为可划分的,否则为不可划分的。 自己想的是枚举,将所有得到的等式的和算出来,再判断它是否能够整除k,可是有10000个…

spring-session之一:简介、使用及实现原理

一、背景 http session(企业)一直都是我们做集群时需要解决的一个难题,我们知道HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的。而如果我们把web服务器搭建成分布式的集群,然后利用LVS或…

cad2017怎么改变选择方式_家用胎心仪怎么使用?建议孕妈妈选择数胎动的方式...

一般胎心仪都有说明书,孕妈妈可以根据说明书上的方法去做。 下面介绍比较通用的方法。时间:早中晚餐后的30-60分钟内 环境:周围没有电磁或辐射等干扰 辅助:耦合剂 步骤: 1、平躺,寻找适合胎心位置 在听胎心…

c#endread怎么打印出来_打印机打印出来是白板是怎么回事

引起针式打印纸空白的原因大多是由于色带油墨干涸、色带拉断、打印头损坏等,应及时更换色带或维修打印头。故障现象:针式打印机有打印声但打印空白。维修方法:具体解决方法如下:1) 检查打印机色带盒是否正确安装,如果安装不正确,重新安装色带…

使用dnspod遭遇的奇特问题以及背后的原因与临时解决方法

由于园子里有不少用户在使用dnspod,我们觉得有必要将这两天blogjava.net域名在dsnpod遇到的奇特问题分享一下,以免再有人踩着这个坑。 12月11日,我们登录到dnspod的后台时,大吃一惊,blogjava.net这个域名竟然消失了。 …

lgg6可以root的版本_Kali Linux 2020.1版本变更内容

kali2020.1于2020年1月28日发布,为2020年的第一个版本,由于此版本相较以前有较大变化,故专篇记录一下。根据官方说明,主要改变如下:默认用户改为非root用户针对不同需求出了单独的镜像文件nethunter改为非root用户改进…

icem密度盒怎么设置_怎么做好火灾自动报警系统施工安装?

关于火灾自动报警系统施工安装GB50166-2019 《火灾自动报警系统施工及验收标准》 中有明确规定:3.1 一般规定3.1.1 系统部件的设置应符合设计文件和现行国家标准《火灾自动报警系统设计规范》GB50116的规定。3.1.2 有爆炸危险性的场所,系统的布线和部件的…

python岗位 上海_上海黑马Python24期,平均薪资10150元,16个工作日就业率70.73%

黑马程序员上海中心月薪一万只是起点关注网红遍地起,颜值即正义,要说哪个网红靠实力,Python当属第一!Python作为时下最流行的一门网红语言,用一句话来证明它的实力就是:Python在手,天下我有&…

在IIS中部署Asp.net Mvc

概述: 最近在做一个MVC 3的项目,在部署服务器时破费了一番功夫,特将过程整理下来,希望可以帮到大家! 本文主要介绍在IIS5.1、IIS6.0、IIS7.5中安装配置MVC 3的具体办法! 正文: IIS5.1 1. 安装Mi…

idea在分屏拖不回来_朋友圈赏花晒照新玩法,宫格分屏视频!

∆ 点击上方【有科唠】一起涨姿势~近期的天气好的不要不要的,出去赏花是件很惬意的事情,继《城墙下》推出的近期赏花攻略,唠科粉们可以跟着攻略赏花一番,赏花的同时,大家肯定会发个朋友圈纪念一下,见过九宫…

导出配置_Lua配置表导出优化

随着游戏的开发,项目的配置表数据越来越多,占用的内存越来越;配置表占用太大就会影响游戏加载速度,游戏流畅度的每一毫秒都是我们的必争之路。[1] {DungeonID10000, Dungeon "王进打高俅", NextDungeonID10100, Battle…

iOS数据存取---iOS-Apple苹果官方文档翻译

本系列所有文章,链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址(2013年12月29日更新版) 本文对应pdf文档下载链接,猛戳—>:数据存取文档.key.zip3.1 MB数据存取文档.pdf1.1 MB 数据存取/*技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://w…