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修改的验证

  1. 进入源码修改目录mm编译
  2. out/target/product/xx/system【framework/lib】目录下找到编译出的jar或者so
  3. 如果是jar,替换system/framework对应的jar;如果是so,替换system/lib对应的so
  4. 确保权限是644【chmod 644 file
  5. 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编译、调试相关推荐

  1. Android10.0 系统解析(02)——搭建Android源代码编译调试环境

    1.前言 Android的编译环境作为深入学习Android的基础,不可或缺,能够完整下载Android源代码并编译成功,对深入学习Android是非常关键和重要的一步.Android环境搭建比较繁琐 ...

  2. android反编译源码查找,Android反编译调试源码

    微信小程序组件-----城市切换 直接上地址,有需要的直接下载,使用: https://github.com/chenjinxinlove/citySelect redis数据结构整理(二) 摘要: ...

  3. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )

    文章目录 一.Android 系统中调试器进程内存流程 二.编译内存调试动态库以及调试程序 三.博客资源 一.Android 系统中调试器进程内存流程 修改游戏运行中的内存 , 游戏运行之后 , 游戏 ...

  4. 【Android 逆向】代码调试器开发 ( 使用 NDK 中的 ndk-build + Android.mk 编译 Android 平台的代码调试器可执行应用 )

    文章目录 一.Android 平台代码调试器代码 二.Android.mk 构建脚本内容 三.Application.mk 构建脚本内容 四.正式编译 五.博客资源 一.Android 平台代码调试器 ...

  5. Android Linux内核编译调试

    对于在Windows上写代码写习惯的人,调试是必不可少的手段,但是转到Android以后,发现调试手段异常简陋,跟Windows简直不是一个级别,特别是Android的内核调试,网上资料也相对较少,不 ...

  6. Android FMRadio上层调试

    Android FMRadio上层调试 背景 获取RadioManager对象为空 HDIL相关问题 背景 在某个平台上,应用同事一直反馈FMRadio报错,闪退.这部分功能我们在framework部 ...

  7. Android STB 高效调试技巧

    文章目录 一.编译 1.1 版本全编 1.2 模块单编 1.3 芯片特有单编模块 1.3.1 Uboot 1.3.2 boot.img&dt.img 二.调试 2.1 文件替换 2.1.1 常 ...

  8. Android逆向--如何调试smali代码?

    最近在重整Android逆向分析环境,一切都在从零开始,做下记录,给大家分享. 本文介绍Android逆向中smali代码的调试及环境的准备. 事先准备如下工具: Android killer:反编译 ...

  9. Android逆向之调试smali代码基础

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 介绍Android逆向中调试smali代码的方法." 最近在重整Android逆向分析环境,一切都在从零开始,做下记录,给大家分享 ...

最新文章

  1. Vue源码解析之AST语法树(三)
  2. 湖南大学C语言作业用oj吗,湖南大学C语言题库(含答案)
  3. 牛客练习赛 65 (待补E-网络流)
  4. Java 中判断一个字符串是否包含另外一个字符串的方法
  5. mybatis like模糊查询_Java自学之mybatis:模糊查询和多条件查询
  6. idea修改回默认字体,设置 IntelliJ Idea 的中英文字体
  7. 使用HTML和CSS格式化DBMail
  8. java语言中实现键盘输入_Java程序设计中的键盘输入数据的方法分析
  9. hashCode方法的使用
  10. 西门子PID完整程序西门子PLC 1200和多台G120西门子变频器Modbud RTU通讯
  11. 科创人·优锘科技COO孙岗:错误问题找不到正确答案,求索万物可视的大美未来
  12. 模拟信号与数字信号的本质区别
  13. java计算机毕业设计四六级在线考试系统源码+系统+数据库+lw文档+mybatis+运行部署
  14. 请假工资扣费总额计算机公式,病假扣款计算公式excel
  15. Python入门基础总结笔记——正则表达式
  16. EDSR MDSR IRAN RCN -pytorch实现及代码常见问题
  17. Excel表格之——某一列生成UUID
  18. prometeus, grafana部署以及监控mysql
  19. windows查看端口
  20. Tweet with Disaster(Kaggle NLP项目实战)

热门文章

  1. 安卓出现闪退是什么情况
  2. go web编程入门教程
  3. wmv格式视频用windows自带播放器打开没有声音,用QQ影音可以
  4. 从“小胡子”到 vue 插值语法
  5. 到货单计算主辅计量工具类 包含价格计算
  6. 如果你有技术能力 我们提供场景 一起变成价值
  7. SSM整合 登录注册小项目
  8. 细谈text-align: center
  9. mac电脑无法读取移动硬盘
  10. win10系统运行vc6.0编译后的程序报:“0xc000007b应用程序无法正常启动”的解决方法