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文件打包生成的