准备阶段

最好完整编译过一次,有完整的out;

确认kernel编译指令

最快的方式不是去看Makefile,而是故意写个断言触发编译报错,并通过搜索字段”Failed:“获取完整编译指令,类似这种:

FAILED: out/target/product/*****/obj/KERNEL_OBJ/arch/arm/boot/zImage
/bin/bash -c "(./prebuilts/build-tools/linux-x86/bin/make -j32 -C kernel-4.19 O=/*****/out/target/product/*****/obj/KERNEL_OBJ ARCH=arm CROSS_COMPILE=arm-linux-androidkernel- CLANG_TRIPLE=arm-linux-gnueabi- LD=ld.lld CC=clang ROOTDIR=/***** PATH=/*****/prebuilts/clang/host/linux-x86/clang-r383902/bin:/*****/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin:/usr/bin:/bin:\$PATH PROJECT_DTB_NAMES=*****) && (if [ -e out/target/product/*****/obj/KERNEL_OBJ/arch/arm/boot/compressed/.piggy.xzkern.cmd ]; then cp out/target/product/*****/obj/KERNEL_OBJ/arch/arm/boot/compressed/.piggy.xzkern.cmd out/target/product/*****/obj/KERNEL_OBJ/arch/arm/boot/compressed/.piggy.xzkern.cmd.bak; sed -e 's/\\\\\\\\\\\\\\\\/\\\\\\\\/g' < out/target/product/*****/obj/KERNEL_OBJ/arch/arm/boot/compressed/.piggy.xzkern.cmd.bak > out/target/product/*****/obj/KERNEL_OBJ/arch/arm/boot/compressed/.piggy.xzkern.cmd; rm -f out/target/product/*****/obj/KERNEL_OBJ/arch/arm/boot/compressed/.piggy.xzkern.cmd.bak; fi ) && (python device/mediatek/build/build/tools/check_kernel_size.py out/target/product/*****/obj/KERNEL_OBJ kernel-4.19 *****)"

需要这一步的原因是,我们需要make时的环境变量PATH,因此需要手动复制上面加粗部分的实际内容到你的终端中执行一次;

确认子模块编译指令

以mm/vmscan.o为例,可以在这个地方找到这个目标文件的编译指令:

out/target/product/*****/obj/KERNEL_OBJ/mm/.vmscan.o.cmd

用文本编辑类工具打开,第一行则是编译指令:

cmd_mm/vmacache.o := clang -Wp,-MD,mm/.vmacache.o.d -nostdinc -isystem /*****/prebuilts/clang/host/linux-x86/clang-r383902/lib64/clang/11.0.1/include -I/*****/kernel-4.19/arch/arm/include -I./arch/arm/include/generated  -I/*****/kernel-4.19/include -I/*****/kernel-4.19/drivers/misc/mediatek/include -I./include -I/*****/kernel-4.19/arch/arm/include/uapi -I./arch/arm/include/generated/uapi -I/*****/kernel-4.19/include/uapi -I./include/generated/uapi -include /*****/kernel-4.19/include/linux/kconfig.h -include /*****/kernel-4.19/include/linux/compiler_types.h  -I/*****/kernel-4.19/mm -Imm -D__KERNEL__ -mlittle-endian -Qunused-arguments -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fshort-wchar -Werror-implicit-function-declaration -Wno-format-security -std=gnu89 --target=arm-linux-gnueabi --prefix=/*****/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/ --gcc-toolchain=/*****/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9 -no-integrated-as -Werror=unknown-warning-option -fno-PIE -fno-dwarf2-cfi-asm -fno-omit-frame-pointer -mabi=aapcs-linux -mfpu=vfp -meabi gnu -marm -Wa,-mno-warn-deprecated -D__LINUX_ARM_ARCH__=7 -march=armv7-a -msoft-float -Uarm -fno-delete-null-pointer-checks -Wno-int-in-bool-context -Wno-address-of-packed-member -O2 -Wframe-larger-than=1400 -fstack-protector-strong -Wno-format-invalid-specifier -Wno-gnu -Wno-tautological-compare -mno-global-merge -Wno-unused-const-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -g -Wdeclaration-after-statement -Wno-pointer-sign -Wno-array-bounds -fno-strict-overflow -fno-merge-all-constants -fno-stack-check -Werror=implicit-int -Werror=strict-prototypes -Werror=date-time -Werror=incompatible-pointer-types -fmacro-prefix-map=/*****/kernel-4.19/= -Wno-initializer-overrides -Wno-unused-value -Wno-format -Wno-sign-compare -Wno-format-zero-length -Wno-uninitialized -Werror -DJRD_PROJECT_=1    -DKBUILD_BASENAME='"vmacache"' -DKBUILD_MODNAME='"vmacache"' -c -o mm/.tmp_vmacache.o /*****/kernel-4.19/mm/vmacache.c

可以看到,这里用的-o直接输出.o目标文件;

那么我们就可以基于这个命令进行改造:

预编译阶段 ——  clang ... -E -o tmp.i ...

编译阶段 —— clang ... -S -o tmp.s ...

汇编阶段 —— 原指令即可

注:这句命令是需要进入到out/target/product/*****/obj/KERNEL_OBJ目录中执行的

以上是将Android kernel文件从.c到.o的编译阶段进行拆分的具体步骤,可以用于定位一些编译异常的原因,亲测在Android R上可用。

如果有更好的方法,还请下方留言

[Android]按阶段编译Android kernel中的代码相关推荐

  1. android 运行在ui县城,Android基础:在UI线程中运行代码

    Android基础:在UI线程中运行代码 从在UI线程中运行代码的角度来看,在以下方面有什么区别:MainActivity.this.runOnUiThread(new Runnable() { pu ...

  2. android studio 闪电编译,Android Studio中Instant Run

    Instant Run 翻译成中文叫即时运行或直接运行模板.不过我一般习惯了叫做闪电运行,为什么这么叫?请看图: 小闪电 有个小闪电(2.3.x版本独立有个小闪电,2.0-2.2是和左边运行图标在一块 ...

  3. android:自己动手编译Android源码(超详细)

    自己动手编译Android源码(超详细) 涅槃1992 2016.06.20 02:12* 字数 4330 阅读 86819评论 89喜欢 339赞赏 7 在Android Studio代码调试一文中 ...

  4. [Android Pro] ant 编译android工程

    参考文章: http://blog.csdn.net/xyz_lmn/article/details/7268582?reload http://hubingforever.blog.163.com/ ...

  5. Android 使用Ant编译Android 工程

    如何编译Android 工程? 关于如何编译Android 工程在这篇官方文档这里中解释的比较清楚, 太多的详细的解释我就不说了,RTFM. 我需要说的是我们既可以让IDE替你完成编译的编译工作,也可 ...

  6. android 关闭jack_编译Android时禁用Jack Server

    编译Android时禁用Jack Server 2017-07-24 15:29:43 +08 字数:818 标签: Android 本文的代码与方法,基于Android O(8.0). 简介 ¶ J ...

  7. android studio ant编译,Android Studio编译cocos2dx项目

    一.所需工具 1.Android studio2.3 2.cocos2dx3.10 3.jdk1.8 4.ndkr9d 5.sdk 6.ant 7.python2.7.14 二.配置环境变量 1.sd ...

  8. android 关闭jack_编译Android时禁用Jack

    编译Android时禁用Jack 2017-07-06 18:18:52 +08 字数:815 标签: Android 本文的代码与方法,基于Android O(8.0). 问题 ¶ 根据Androi ...

  9. android 12306反编译,Android开发(七)| “我的12306”实例

    作为程序员,从一无所知开始接触.熟练使用android控件.布局.活动,自己开发的项目随之越来越茁壮,功能越来越完善,我们的内心是由衷感到高兴的. 为了对两个月的学习成果有一个检验,我把之前所学所讲做 ...

  10. linux kernel中cache代码解读

    1. 在kernel中调用__dma_flush_range,底层是如何操作的呢? /* remove any dirty cache lines on the kernel alias */__dm ...

最新文章

  1. 宠物乘机的三种模式【转】
  2. JTA 深度历险 - 原理与实现---转
  3. The Elder HDU - 5956
  4. 在线文本转2-36任意进制工具
  5. JS判断字符串包含的方法
  6. 拓端tecdat|R语言t检验和非正态性的鲁棒性
  7. Python | OpenCV简单生成调色板
  8. 应聘引擎程序需做哪些准备
  9. 树莓派x86Android,3种创客开发板走向专业-浅谈X86树莓派板型的UP系列
  10. C++ 惯用法之 Nifty Counter
  11. 大数据为湖湘互联网发展加码
  12. 小米15.6笔记本安装UBUNTU18.04 无WIFI驱动解决方法
  13. Python四行代码实现的猜数字小游戏,基于thinker,带GUI界面
  14. 市场的结构,各种投资方法的此消彼长,没有所谓圣杯
  15. 计算机程序无法启动,应用程序无法正常启动,教您电脑应用程序无法正常启动0xc000007b怎么解决...
  16. STM32 BLDC电机驱动开发板资料 反电动势B-EMF过零检测
  17. python爬虫教程:如何用40行Python代码实现天气预报和每日鸡汤推送功能
  18. java排序-基础排序
  19. java实现老鼠迷宫游戏
  20. iOS微博项目(五)- 实现超链接和时间,下拉,未读数,微博正文,评论

热门文章

  1. 记zabbix正常启动,但是没有监听任何端口问题
  2. 混沌数学之Chua's circuit(蔡氏电路)
  3. 计算机专业考研的好学校排名2015,计算机类专业考研最好的学校排名
  4. 北京与洛杉矶时差16小时,飞机飞行时间是12小时40分钟。请输入从洛杉矶起飞的日期与时间,计算出到达北京的日期与时间。
  5. 做最便宜的监控,旧手机变监控摄像头,还不用app
  6. Web前端——HTML表单及表格
  7. 网站建设就是要大胆创新
  8. animate发布html5教程,Adobe Animate CC 中的 HTML 发布模板 - Adobe Animate 用户指南
  9. [安卓逆向]安卓逆向-一次简单的静态分析
  10. angularJs监控页面加载完毕