三、小贴士:
几种linux内核文件的区别:
1、vmlinux/Image 编译出来的最原始的内核文件,未压缩。
2、zImage/Image.gz 是vmlinux经过gzip压缩后的文件。
3、bzImage bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。
4、uImage U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag。
5、vmlinuz 是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接。
6、initrd 是“initial ramdisk”的简写。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态;
7、kernel android编译系统中对linux内核的通称,可以是vmlinux/Image,zImage/Image.gz其中之一;
四、常见错误处理
1.build.sh -m kernel执行出错,错误如下:
/home/nansutech/A63_SDK/lichee/tools/pack/pctools/linux/android/mkbootimg : No such file or directory
解决方法:进入该目录,发现文件是存在的,单独运行也提示类似的错误,后来确定是该可执行文件是32位,而系统是64位,在https://github.com/XT701/Tools下载64位应用后替换,工作正常;
2.android/ 目录下编译:make 出现错误:
Starting build with ninja
/bin/bash: out/host/linux-x86/bin/makeparallel: No such file or directory
解决方法:隔天,lunch选择不同的平台,问题居然解决了,out/host/linux-x86/bin/目录生成了makeparallel;
3.error:flex-2.5.39: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))’ failed.
Aborted (core dumped)
解决方法:参考:https://blog.csdn.net/shui1025701856/article/details/80497911,在编译脚本(android/envsetup.sh)中增加:export LC_ALL=C,不再报此错误;
4.在lichee/, ./build.sh pack 出错:
file /home/nansutech/A63_SDK/lichee/tools/pack/out/scp.fex cant be open
create package failed
ERROR: dragon pack run error
解决方法:所有命令(包括source)都用root身份执行;
5.在lichee/, ./build.sh pack 出错:
packing for android
ERROR: please specify ANDROID_IMAGE_OUT env 解决方法:在android目录执行pack即可;
五、设备打包后,没有出现预期的效果,通过adb查看设备中的内容也非预期的东西,这个时候可以通过解压img包,来确认打包的固件是否符合预期。
1.拷贝img至windows,然后用imgRePacker_206(E:A63_PDKDocuments ools_winimgRePacker_206)进行解压得到需要的各个image;
.imgrepacker .sun50iw3p1_android_nansu_uart0.img
2.将system.fex拷贝至linux目录。然后重命名;
mv system.fex system.img
3.确认镜像是格式,之后转换为ext4格式,file system.img
system.img: Android sparse image, version: 1.0, Total of 524288 4096-byte output blocks in 4557 input chunks.
4.利用lichee自带的simg2img工具进行格式转换;
./lichee/tools/buildroot/target/tools/host/usr/bin/simg2img system.img system.img.ext4
5.mount文件系统;
mkdir system
sudo mount -t ext4 -o loop system.img.ext4 system
6.验证完毕后,记得卸载
sudo umount system
之后进入system目录,此即对于设备运行后的/system/目录;
六、如何最小编译系统,最小升级固件来验证修改后的效果。
有的时候,修改了部分参数或者部分文件代码,想快速验证一下,这个时候根据修改的文件不同,可以进行不同的操作来达到快速验证的目的。
1.修改的是sys_config.fex文件;
无需编译,只需执行pack操作。然后通过phonixCard.exe升级时选择“ENV”,然后进行升级即可;
2.修改的是licheelinux-3.10archarm64ootdtsxxx.dtsi文件;
编译kernel,执行pack操作。然后通过phonixCard.exe升级时选择“ENV”,然后进行升级即可;
3.修改的是driver文件,且为非ko模块;
编译kernel,执行pack操作,然后通过phonixCard.exe升级时选择“system”,然后进行升级即可;
4.修改的是driver文件,且为ko模块;
编译kernel,得到xxx.ko文件;执行adb remout操作后,将该ko文件push到对应路径。
5.修改的是android文件;
修改的android文件都可以通过编译对应模块(无需全编译),然后将对应的模块(可执行文件[脚本可以直接push,无需编译],脚本,应用程序,lib库等)push到相应目录即可。
m/mm/mmm/mma/mmma YOUR_DIR/
adb remout
adb push xxx.lib /system/usrlib/
6.在.mk中删除了某个应用,此时简单的make -j 后pack,应用并没有被删除,这时候需要到out argetproducturanus-nansusystem目录找到对应的文件进行删除,如果无法得知对应的文件,可以将system*都删除,然后编译。编译也会很快完成。
七、android init.*rc文件解析:
ASOP/system/core/init/init.c/main()–>
init_parse_config_file(“/init.rc”);
./system/core/rootdir/init.rc
./system/core/rootdir/init.zygote64.rc
./system/core/rootdir/init.zygote64_32.rc
./system/core/rootdir/init.zygote32_64.rc
./system/core/rootdir/init.usb.rc
./device/softwinner/common/init.wireless.realtek.rc
./device/softwinner/common/init.wireless.broadcom.rc
./device/softwinner/common/init.wireless.xradio.rc
./device/softwinner/common/init.common.rc
./device/softwinner/common/init.debug.rc
./device/softwinner/uranus-t1/init.device.rc
./device/softwinner/uranus-common/init.recovery.sun50iw3p1.rc
./device/softwinner/uranus-common/init.sun50iw3p1.usb.rc
./device/softwinner/uranus-common/init.sun50iw3p1.rc
./bootable/recovery/etc/init.rc
包含,引用顺序图:
init.rc–>
import init.environ.rc #EXPORT global enviroment
import init.usb.rc
import init.${ro.hardware}.rc–>init.sun50iw3p1.rc
import init.common.rc
import init.device.rc–>
import init.wireless.realtek.rc
import init.sun50iw3p1.usb.rc
import init.${ro.zygote}.rc–>init.zygote64.rc–>
import init.trace.rc