Android的编译

来源:互联网 发布:php 权限管理 层级权限 编辑:程序博客网 时间:2024/06/11 02:05
Android的编译


Linux系统下,.ko文件,Kernel Object,可以在Linux内核起来后,动态的加载和卸载,内核加载文件,一般是驱动文件
             .so,Shared Object(动态链接文件),相当于Window下面的dll文件


FDL       Bootloader    Logo    vm        Modem    Android
fdl1      u-boot-spl-16k        Vmjaluna  Modem    Boot
fdl2      u-boot                          DSP      System
                                          Nvitem   Userdata
                                                   recovery
ramdisk.img,解压后就是Android编译出的root文件夹
system.img,放在应用程序,配置文件,字体等
userdata.img
boot.img,包含内核,基本的文件系统(这个文件系统是不是对应ramdisk)
u-boot.img,对应bootloader,最开始启动                                                   
                                                   
OTA package,OTA升级时Android提供的标准升级方式。可提供完全升级,增量升级模式;也可通过T卡升级,或网络升级


apk 签名,签名的作用及其应用范围


bootloader -> fastboot,命令或SD卡烧写模式
              recovery,加载recovery.img
              正常开机,加载boot.img


prelink,事先链接代替运行时链接


GCC工具链(toolchain)
GCC  + binutils + glibc
GCC部分是指cpp, gcc, as, ld(预处理,编译,汇编,链接四个过程)
Binutil二进制工具集
gdb,GNU发布,UNIX下的程序调试工具,可设断点,看变量;也人也用于Linux,Andriod调试
ar,打包工具
ELF文件格式有三种类型:
   可重定位文件:也就是通常称的目标文件,后缀为.o。
   共享文件:也就是通常称的库文件,后缀为.so。
   可执行文件
交叉编译,就是在一个平台上生成另一个平台上的可执行代码。平台这里,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)


vmlinux(vmlinuz)是一个包含linux kernel的静态链接的可执行文件,文件型态可能是linux接受的可执行文件格式之一(ELF、COFF或a.out),vmlinux若要用于除错时则必须要在开机前增加symbol table。


Android 用 Bionic Libc 而非 glibc
        toolchain用 arm-eabi
        用 apriori 做prelink工具


将编译完成的可执行文件或动态库进行strip,可去掉其中多余的符号表信息


Android.mk的用法|静态库|动态库
动态库,c库,*.so
静态库,c库,*.a
可执行文件
预编译文件
主机动态库
主机静态库
主机可执行文件
主机预编译文件
apk文件
静态jar包,java库
动态jar包,java库
主机jar包
补充说明:
1,与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。通常class文件仅在需要使用时才加载。 这本身就是一种动态链接。
   Java作为一种天生的动态链接语言,无法支持静态链接。但C语言的静态库除了静态链接的概念外,还隐含了一层意思,即库中的代码会打包到可执行文件中。JAVA中的JAR某种程度上类似一个可执行文件或库,借用C语言中静态库和动态库的概念,这里把最终会合并到生成的JAR文件中的JAR包叫静态库,反之仅仅在编译中使用,并不打包到生成的JAR包中,运行时需系统自行提供的JAR包叫动态库。
2,在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。
   为了克服这个缺点可以采用动态链接库。这个时候链接器仅仅是在可执行文件中打上标志,说明需要使用哪些动态连接库;当运行程序时,加载器根据这些标志把所需的动态链接库加载到内存。
3,Eclipse中对JAR包的使用方式有两种,library和user libraries
4,注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'foo'的共享库模块,将会生成'libfoo.so'文件
5,另外,在Android.mk文件中,还可以指定最后的目标安装路径,
   用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH来指定。不同的文件系统路径用以下的宏进行选择:
   TARGET_ROOT_OUT:表示根文件系统。
   TARGET_OUT:表示system文件系统。
   TARGET_OUT_DATA:表示data文件系统。
   用法如:
   LOCAL_MODULE_PATH:=$(TARGET_ROOT_OUT)






        dx工具     apkbuilder
.class    ->   .dex    ->    apk包
         AAPT
资源文件  ->  .ap_


out目录下的host文件夹是给主机用的


Android源代码查版本
/build/core/version_


repo和git如何共同管理版本


make snod,是make system.img ingore dependencies,直接从out/target/product/xxx/system生成的
make system.img是从新生成out/target/product/xxx/system,再生成system.img


展讯编译命令
make bootloader -> spl, u-boot
     bootimage -> boot.img(kernel, ramdisk)
     systemimage -> system.img
     userdataimage -> userdata.img
     recoveryimage -> recovery.img
     ota package -> 


System.map文件(/proc/ksyms)
符号表,Kernel和uboot都有
A,T,t,W:小写代表本地符号,大写代表外部符号


make O=dir [target] 编译过程中,将所有中间文件和目标文件(包括.config文件)存到dir目录中
make help
可以通过减少模块文件的数量,提升编译速度




make
     “all”
        这个伪目标是所有目标的目标,其功能一般是编译所有的目标。
     “clean”
        这个伪目标功能是删除所有被make创建的文件。
     “install”
        这个伪目标功能是安装已编译好的程序,其实就是把目标执行文件拷贝到指定的目标中去。
     “print”
        这个伪目标的功能是例出改变过的源文件。
     “tar”
        这个伪目标功能是把源程序打包备份。也就是一个tar文件。
     “dist”
        这个伪目标功能是创建一个压缩文件,一般是把tar文件压成Z文件。或是gz文件。
     “TAGS”
        这个伪目标功能是更新所有的目标,以备完整地重编译使用。
     “check”和“test”
        这两个伪目标一般用来测试makefile的流程。


LDS--程序连接描述文件格式
kernel和uboot才有


linux 内部模块 外部模块
内部模块:可能指kernel的ko文件
外部模块:可能指非kernel部分
lsmod显示的模块数很少,没有内部模块的
原创粉丝点击