首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

如何在arm单板中压缩python详解(2)

如何在arm单板中压缩python详解(2)

3.2 缩小必要文件的体积3.2.1 删掉调试信息arm-none-linux-gnueabi-strip python2.7
arm-none-linux-gnueabi-strip libpython2.7.so.1.0
这时已经有大幅度的瘦身效果了,已经比较让人满意了。
如果需要进一步缩小,可以使用下面的upx技术。
3.2.2 采用upx技术。upx可以将执行程序和动态库进行压缩,我平均压缩效果都大于50%,当然,代价就是加载时慢一点。
upx大家可以关注一下,以前很多木马就是用了upx技术,通过这个壳,躲过了杀毒软件的查杀)
ubuntu中,apt-get install upx
由于动态库默认是只读权限,因此这里必须增加可写权限:
chmod +w libpython2.7.so.1.0
压缩
upx libpython2.7.so.1.0
这时,动态库已经从1.8M降为只有不到1M了。
(没有必要使用upx --best这种终极压缩,解压代价太大了)
python2.7由于只有8.7k,太小了,upx压缩没有必要。

3.3 库的最小化其实,真正的难点在于让/lib/python2.7这个庞大的文件夹缩小。
该文件夹包含了平台依赖和平台独立的两种文件。
平台依赖的动态库.so文件放在python2.7/lib-dynload里。
平台独立的文件为其他的.py,.pyc,pyo文件,这些都可以在不同的平台动态解析。
3.3.1 只保留pyc文件.py是最基本的文件,理论上来说,有这种文件就够了。
.pyc.py compile后的字节流文件,不但可以加快加载文件的速度,还可以有一定的保密作用(当然,道高一尺魔高一丈,现在可以反编译这些pyc文件)。其实,python在读取.py时,也会自动生成.pyc文件的。
.pyo.py加了优化参数后的compile后的字节流文件,官方表明优化效果很少,例如只是删除断言之类的。
因此,这里,删除所有的.py.pyo文件,只保留.pyc就够了。
(由于我的pclinuxcsulinux有些时间的不对应的问题,csu在加载.pyc文件时,会有bad mtime的告警。因此,我是只保留py文件后,在csu的下进行重编译,然后再删除所有py文件。
重编译的方法如下:
csu中进入python的输入命令界面(开发中,我都是通过NFSCSU使用python的)
import compileall
compileall.compile_dir('./xxx')
则可以编译该文件夹下的所有py文件为pyc文件。

3.3.2 使用zippython是支持zip格式的库的。
python环境下输入:
import sys
sys.path
这会得到python搜索库的所有路径,可以发现第一个路径非常有趣,叫/lib/python27.zip
也就是说,把python2.7库文件夹压缩为python27.zippython是可以从这个压缩文件中读取的。
3.3.2.1 python支持zip由于python默认给pc使用,官方认为使用压缩库的概率小,因此,默认python不支持zip库的解压的。需要修改如下:
cdpython源码包的arm_build下(该文件夹默认没有,请查看《CSU移植python》一文)。
vim Modules/Setup
输入?zlib     ?表示从后往前搜索)
将如下这句取消注释,让其生效:
zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
:wq
(我的ubuntu没有fedora12 DVD版集成那么多的东西,还需要安装zlibczlib1g.dev
apt-get install zlibc   这条是必要的,已经验证
apt-get install zlib1g.dev     这条不确定是否必要)
重新生成与安装arm版本的python
make python && make -i install
这样python就会集成zlib功能了。
3.3.2.2 制作全功能的zip由于CSU目前是网络加载虚拟机的文件夹,因此,在虚拟机侧或CSU侧制作zip库,效果是一样的。考虑pc压缩快一些,这里在pc压缩,csu侧进行测试验证。
cd /opt/arm_python/lib/python2.7
建议复制一份完整的库到python2.7.bak文件夹中。
mkdir ../python2.7.bak
cp ./* ../python2.7.bak
采用du –h 查看当前文件夹的大小,发现有70MCSU肯定放不进去。
cd ./lib-dynload
这里有蛮多平台依赖的so文件,用上面介绍的arm-none-linux-gnueabi-stripupx把它们全部缩小。
cd ..  回到python2.7目录。
find -name ‘*.py’ -delete
(find -name‘*.py’ -print0 | xargs -0 rm要方便;注意:find -name‘*.py’ | xargs rm的用法不推荐,当文件名有空格时,会有错误。加了-0就可以解决这个。但是还是推荐我使用的那句。)
find -name ‘*.pyo’ -delete
rm -r ./config ./test
删除掉包括子目录下的所有.py.pyo文件,删除不是库功能的config文件夹,删除用不到的test文件夹。
zip –r ../python27.zip .
(注意,要到python2.7里面进行压缩,才不会包含python2.7这个文件夹,包含了,就用不了)
cd -
ll 查看一下全功能库的大小,只有5.2M!CSU是可以放进去的。
(注:我很喜欢用llalias ll=’ls -alh’)
返回列表