标题:
如何在arm单板中压缩python详解(2)
[打印本页]
作者:
look_w
时间:
2017-10-24 21:39
标题:
如何在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
就够了。
(由于我的
pc
的
linux
和
csu
的
linux
有些时间的不对应的问题,
csu
在加载
.pyc
文件时,会有
bad mtime
的告警。因此,我是只保留
py
文件后,在
csu
的下进行重编译,然后再删除所有
py
文件。
重编译的方法如下:
csu
中进入
python
的输入命令界面(开发中,我都是通过
NFS
让
CSU
使用
python
的)
import compileall
compileall.compile_dir('./xxx')
则可以编译该文件夹下的所有
py
文件为
pyc
文件。
)
3.3.2
使用
zip
库
python
是支持
zip
格式的库的。
python
环境下输入:
import sys
sys.path
这会得到
python
搜索库的所有路径,可以发现第一个路径非常有趣,叫
/lib/python27.zip
。
也就是说,把
python2.7
库文件夹压缩为
python27.zip
,
python
是可以从这个压缩文件中读取的。
3.3.2.1
让
python
支持
zip
库
由于
python
默认给
pc
使用,官方认为使用压缩库的概率小,因此,默认
python
不支持
zip
库的解压的。需要修改如下:
cd
到
python
源码包的
arm_build
下(该文件夹默认没有,请查看《
CSU
移植
python
》一文)。
vim Modules/Setup
输入
?zlib
(
?
表示从后往前搜索)
将如下这句取消注释,让其生效:
zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
:wq
(我的
ubuntu
没有
fedora12 DVD
版集成那么多的东西,还需要安装
zlibc
和
zlib1g.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
查看当前文件夹的大小,发现有
70
多
M
,
CSU
肯定放不进去。
cd ./lib-dynload
这里有蛮多平台依赖的
so
文件,用上面介绍的
arm-none-linux-gnueabi-strip
和
upx
把它们全部缩小。
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
是可以放进去的。
(注:我很喜欢用
ll
,
alias ll=
’ls -alh’)
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0