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