1 这一节重点来分析一下distribute.sh,以此来了解一下Kivy的整个编译过程
2 在上一篇文章中,我们讲到编译的方法:
./distribute.sh -m 'openssl pyjnius pil kivy'
3 那整个过程是怎么进行的,下面来分析一下:
4 首先来看下这个脚本文件的最后一行脚本:run
function run() { check_build_deps run_prepare run_source_modules run_get_packages run_prebuild run_build run_biglink run_postbuild run_pymodules_install run_distribute info "All done !" }
刚好是十个函数,这十个函数到底各自做了什么呢,一直来分析一下:
5 check_build_deps
该函数用于检测编译所依赖的软件包是否存在:build-essential zlib1g-dev cython
6 run_prepare
检测NDK,SDK是否已经安装,环境变量是否已经设置
检测tar bzip2 unzip make gcc g++是否已经安装
检查dist/default是否已经存在,如已经存在,提示是否删除
创建一堆的目录等等
7 run_source_modules
该函数的主要作用是根据要编译的模块调用recipes目录下相应的recipes.sh加载相应的环境变量以及编译函数
并且会检查模块的依赖关系,把一些依赖的模块也编译进去,例如要编译openssl pyjnius pil kivy,那么实际会编译的模块包含以下这些:
hostpython jpeg openssl png python pil sdl pygame pyjnius android kivy
8 run_get_packages
run_source_modules已经把下载的路径的环境变量给设置好了,接下来就是下载相应的代码并解压了
所有的代码会被下载到.packages目录下,并被解压到build目录下
9 run_prebuild
该函数会调用各模块的recipes.sh里的prebuild_xxx以完以一些编译前的初始化工作
如prebuild_python就会给Python打上patch
10 run_build
这里就开始编译各个模块了
这里要特别注意的是,如果是一个python模块,如pyjnius
在build_xxx中,如build_pyjnius中
会有下面的脚本:
export LDSHARED="$LIBLINK"
而$LIBLINK即为src\tools\liblink,它会在build/objects生成相应的以.so.o结尾的动态库
上演了一场替换大法。
11 run_biglink
将build\objects目录下的所有.so.o动态库文件链接成一个动态库文件:libpymodules.so
12 run_postbuild
该函数会调用各模块的recipes.sh里的postbuild_xxx以完以一些编译前的初始化工作
13 run_pymodules_install
将所有的python模块,如jnius,pil,kivy,pygame安装到python-install\lib\python2.7\site-packages
14 再看来最后一个函数:run_distribute
这个函数的作用是把所有需要的文件拷贝到dist/default目录下,为下一步的apk的生成作准备。
15 好了,distribute.sh分析完毕了,这个时候应该对kivy的整个模块的编译过程有一个比较完整的认识了
16 需要注意的地方有liblink以及biglink,这两个过程在通常的编译过程中都是不会特意这样做的,有点奇怪。
17 (完)