Android ROM编译、调试
android源码目录下的build/envsetup.sh文件,描述编译的命令
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
要想使用这些命令,首先需要在android源码根目录执行. build/envsetup.sh
脚本设置环境
m:编译所有的模块
mm:编译当前目录下的模块,当前目录下要有Android.mk文件
mmm:编译指定路径下的模块,指定路径下要有Android.mk文件
以上三个命令都可以用-B选项来重新编译所有目标文件。强制clean编译
注:
1、make:不带任何参数,用于编译整个系统,编译时间比较长
2、如果只知道目标模块的名称,则建议使用make模块名的方式编译目标模块
3、一般的编译方式都会采用增量编译,即只编译发生变化的目标文件,但有时则需要重新编译所有目标文件,那么就可以使用make -B强制编译所有的目标文件
make -j32
mm -j8
source build/envsetup.sh //初始化编译环境,并引入一些辅助的shell函数lunch XXX //编译选项,不同的项目不同make -j8 //开启8个线程编译,可任选,具体根据编译服务器的核数而定
framework修改的验证
- 进入源码修改目录
mm
编译 - 在
out/target/product/xx/system【framework/lib】
目录下找到编译出的jar或者so - 如果是jar,替换
system/framework
对应的jar;如果是so,替换system/lib
对应的so - 确保权限是644【
chmod 644 file
】 reboot
【或者kill
引用库的对应程序,对于jar,最好先sync
一下再重启】
注:Android9.0因为默认开启预编译,这样修改framework调试验证的时候还要替换odex和vdex文件,我们本地调试可以修改platform目录device/amlogic/common/software.mk,关闭预编译,将WITH_DEXPREOPT置为FALSE
建立软链接
ln -s 源文件 目标文件
删除软链接【file后面不能带/,否则会删除源文件内容】
rm -rf file
挂载system
mount -o rw,remount /system
Linux解压命令
tar -xzvf test.tar.gz
系统起不来可以挂载U盘的方法
cd system/lib insmod dwc3.ko lsmod mount -t vfat /dev/block/sda1 /tmp
进入recovery模式
reboot recovery
签名
java -Xmx2048m -jar signapk.jar -w platform.x509.pem platform.pk8 test.apk test_sign.apk //apk签名 java -Xmx2048m -jar signapk.jar -w testkey.x509.pem testkey.pk8 update.zip update_signed.zip //update.zip签名
vim命令
vi fileName //打开文件 :set nu //显示行数 / //检索 :w //保存修改 :q //退出 i //进入编辑模式 Esc //退出编辑模式 dd //删除一行
屏幕尺寸的计算
通过Physcial size(cm): 52 x 29(即屏幕的宽高),来计算出屏幕的对角线尺寸,具体计算公式为:(int)(Math.sqrt(height * height + weight * weight)/2.54 + 0.5)
framework中添加接口
在原生Service中添加:
- 定义接口的地方,一般为IXXXService.aidl文件
- 实现接口的地方,一般为XXXService.java文件
- 调用接口的地方,一般为XXXManager.java文件
实现定制的Service:
在frameworks/base/services/java/com/android/server/SystemServer.java的initAndLoop方法中,将XxxService添加到ServiceManager中
创建AIDL文件
定义一个供上层调用的接口,创建一个frameworks/base/core/java/android/app/XxxManager.java的接口文件
创建一个中间桥梁文件,连接两者,即frameworks/base/core/java/android/app/XxxManagerImpl.java
上层应用在调用系统接口时,需要用一个Context类型的对象,调用该对象的getSystemService方法获取系统Service的代理对象。同时,在获取系统Service代理对象时,需要现在ServiceManager中查询是否存在这样一个Service,要想查询到Service,就肯定要先注册Service,注册的地方有两个:一个是前面已经看到的SystemServer.java中添加,另一个就是在frameworks/base/core/java/android/app/ContextImpl.java中的static块中添加
实现具体的接口,即创建一个frameworks/base/services/java/com/android/server/XxxManagerService.java
接口编译到最终的版本里,在frameworks/base/Android.mk中添加IXxxManager.aidl,具体内容如下:
LOCAL_SRC_FILES += \core/java/android/app/IXxxManager.aidl \
上层应用调用Context.getSystemService获取Service
update.zip的目录结构
|----boot.img |----system|----app|----bin|----lib|----etc...... |----META-INF|----CERT.RSA|----CERT.SF|----MANIFEST.MF|----com|----android|----metadata|----otacert|----google|----android|----update-binary|----updater-script
boot.img
boot.img是更新boot分区所需要的文件,主要包括kernel+ramdisk。system目录
system目录的内容在升级后会放在系统的system分区,主要用来更新系统的apk、so、bin等,在系统源码中对应着out/target/product/xxx/system/中的所有文件。META-INF目录
CERT.RSA:与签名文件相关联的签名程序块文件,它存储了用于签名JAR文件的公共签名。
CERT.SF:JAR文件的签名文件,其中前缀CERT代表签名者。
MANIFEST.MF:定义了与包的组成结构相关的数据,类似上层Android应用的mainfest.xml文件。
metadata:描述设备信息及环境变量的元数据,主要包括一些编译选项,签名公钥,时间戳以及设备型号等。
otacert:具体的签名检验文件,里面存放着签名校验的字符串。
update-binary:二进制文件,相当于一 个脚本解释器,能够识别updater-script中描述的操作。
updater-script:脚本文件,具体描述了更新过程。
Java代码执行顺序
Java静态代码块≈C#静态构造函数
静态代码块>构造代码块>构造函数>普通代码块析构函数
析构函数于构造函数相对应,构造函数是对象创建的时候自动调用的,而析构函数就是对象在销毁的时候自动调用的的特点:
1)构造函数可以有多个来构成重载,但析构函数只能有一个,不能构成重载
2)构造函数可以有参数,但析构函数不能有参数
3)与构造函数相同的是,如果我们没有显式的写出析构函数,那么编译器也会自动的给我们加上一个析构函数,什么都不做;如果我们显式的写了析构函数,那么将会覆盖默认的析构函数
4)在主函数中,析构函数的执行在return语句之前,这也说明主函数结束的标志是return,return执行完后主函数也就执行完了,就算return后面还有其他的语句,也不会执行的
5)与栈区普通对象不同,堆区指针对象并不会自己主动执行析构函数,就算运行到主函数结束,指针对象的析构函数也不会被执行,只有使用delete才会触发析构函数
6)malloc不会触发构造函数,但new可以;free不会触发析构函数,但delete可以
linux中.so、.ko、.a、.o文件区别
1、.so文件是用户层的动态链接库,用于用户层的动态链接使用,内核态的代码同样不能直接访问
2、.ko文件是内核态的动态链接库,用于内核态的动态链接使用,可以用于内核之间的模块相互调用。用户态的代码不可直接调用内核态的代码,但是可以通过其他方式进行通信
3、.a文件是用于静态链接时,使用的静态库
4、.o文件是目标文件,编译生成,.a文件就是由.o文件打包生成的
Android ROM编译、调试相关推荐
- Android10.0 系统解析(02)——搭建Android源代码编译调试环境
1.前言 Android的编译环境作为深入学习Android的基础,不可或缺,能够完整下载Android源代码并编译成功,对深入学习Android是非常关键和重要的一步.Android环境搭建比较繁琐 ...
- android反编译源码查找,Android反编译调试源码
微信小程序组件-----城市切换 直接上地址,有需要的直接下载,使用: https://github.com/chenjinxinlove/citySelect redis数据结构整理(二) 摘要: ...
- 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )
文章目录 一.Android 系统中调试器进程内存流程 二.编译内存调试动态库以及调试程序 三.博客资源 一.Android 系统中调试器进程内存流程 修改游戏运行中的内存 , 游戏运行之后 , 游戏 ...
- 【Android 逆向】代码调试器开发 ( 使用 NDK 中的 ndk-build + Android.mk 编译 Android 平台的代码调试器可执行应用 )
文章目录 一.Android 平台代码调试器代码 二.Android.mk 构建脚本内容 三.Application.mk 构建脚本内容 四.正式编译 五.博客资源 一.Android 平台代码调试器 ...
- Android Linux内核编译调试
对于在Windows上写代码写习惯的人,调试是必不可少的手段,但是转到Android以后,发现调试手段异常简陋,跟Windows简直不是一个级别,特别是Android的内核调试,网上资料也相对较少,不 ...
- Android FMRadio上层调试
Android FMRadio上层调试 背景 获取RadioManager对象为空 HDIL相关问题 背景 在某个平台上,应用同事一直反馈FMRadio报错,闪退.这部分功能我们在framework部 ...
- Android STB 高效调试技巧
文章目录 一.编译 1.1 版本全编 1.2 模块单编 1.3 芯片特有单编模块 1.3.1 Uboot 1.3.2 boot.img&dt.img 二.调试 2.1 文件替换 2.1.1 常 ...
- Android逆向--如何调试smali代码?
最近在重整Android逆向分析环境,一切都在从零开始,做下记录,给大家分享. 本文介绍Android逆向中smali代码的调试及环境的准备. 事先准备如下工具: Android killer:反编译 ...
- Android逆向之调试smali代码基础
点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 介绍Android逆向中调试smali代码的方法." 最近在重整Android逆向分析环境,一切都在从零开始,做下记录,给大家分享 ...
最新文章
- Vue源码解析之AST语法树(三)
- 湖南大学C语言作业用oj吗,湖南大学C语言题库(含答案)
- 牛客练习赛 65 (待补E-网络流)
- Java 中判断一个字符串是否包含另外一个字符串的方法
- mybatis like模糊查询_Java自学之mybatis:模糊查询和多条件查询
- idea修改回默认字体,设置 IntelliJ Idea 的中英文字体
- 使用HTML和CSS格式化DBMail
- java语言中实现键盘输入_Java程序设计中的键盘输入数据的方法分析
- hashCode方法的使用
- 西门子PID完整程序西门子PLC 1200和多台G120西门子变频器Modbud RTU通讯
- 科创人·优锘科技COO孙岗:错误问题找不到正确答案,求索万物可视的大美未来
- 模拟信号与数字信号的本质区别
- java计算机毕业设计四六级在线考试系统源码+系统+数据库+lw文档+mybatis+运行部署
- 请假工资扣费总额计算机公式,病假扣款计算公式excel
- Python入门基础总结笔记——正则表达式
- EDSR MDSR IRAN RCN -pytorch实现及代码常见问题
- Excel表格之——某一列生成UUID
- prometeus, grafana部署以及监控mysql
- windows查看端口
- Tweet with Disaster(Kaggle NLP项目实战)