包大小

作者: 张_何 | 来源:发表于2018-08-20 19:31 被阅读0次

    查看可执行文件构成

    1.XCode开启编译选项Write Link Map File
    XCode -> ***.xcodeproj -> targets -> *** -> Build Settings -> 搜map -> 把Write Link Map File选项设为yes,并指定好linkMap的存储位置

    1.png

    2.2.编译后,到编译目录里找到该txt文件,文件名和路径就是上述的Path to Link Map File
    位于~/Library/Developer/Xcode/DerivedData/XXX-eumsvrzbvgfofvbfsoqokmjprvuh/Build/Intermediates/XXX.build/Debug-iphoneos/XXX.build/
    ***.text文件里列出了每一个可执行文件
    3.新建一个名为linkmap.js的文件,在这个文件中写入如下脚本:

    var readline = require('readline'),
        fs = require('fs');
    
    var LinkMap = function(filePath) {
        this.files = []
        this.filePath = filePath
    }
    
    LinkMap.prototype = {
        start: function(cb) {
            var self = this
            var rl = readline.createInterface({
                input: fs.createReadStream(self.filePath),
                output: process.stdout,
                terminal: false
            });
            var currParser = "";
            rl.on('line', function(line) {
                if (line[0] == '#') {
                    if (line.indexOf('Object files') > -1) {
                        currParser = "_parseFiles";
                    } else if (line.indexOf('Sections') > -1) {
                        currParser = "_parseSection";
                    } else if (line.indexOf('Symbols') > -1) {
                        currParser = "_parseSymbols";
                    }
                    return;
                }
                if (self[currParser]) {
                    self[currParser](line)
                }
            });
    
            rl.on('close', function(line) {
                cb(self)
            });
        },
    
        _parseFiles: function(line) {
            var arr =line.split(']')
            if (arr.length > 1) {
                var idx = Number(arr[0].replace('[',''));
                var file = arr[1].split('/').pop().trim()
                this.files[idx] = {
                    name: file,
                    size: 0
                }
            }
        },
    
        _parseSection: function(line) {
        },
    
        _parseSymbols: function(line) {
            var arr = line.split('\t')
            if (arr.length > 2) {
                var size = parseInt(arr[1], 16)
                var idx = Number(arr[2].split(']')[0].replace('[', ''))
                if (idx && this.files[idx]) {
                    this.files[idx].size += size;
                }
            }
        },
    
        _formatSize: function(size) {
            if (size > 1024 * 1024) return (size/(1024*1024)).toFixed(2) + "MB"
            if (size > 1024) return (size/1024).toFixed(2) + "KB"
            return size + "B"
        },
    
        statLibs: function(h) {
            var libs = {}
            var files = this.files;
            var self = this;
            for (var i in files) {
                var file = files[i]
                var libName
                if (file.name.indexOf('.o)') > -1) {
                    libName = file.name.split('(')[0]
                } else {
                    libName = file.name
                }
                if (!libs[libName]) {
                    libs[libName] = 0
                }
                libs[libName] += file.size
            }
            var i = 0, sortLibs = []
            for (var name in libs) {
                sortLibs[i++] = {
                    name: name,
                    size: libs[name]
                }
            }
            sortLibs.sort(function(a,b) {
                return a.size > b.size ? -1: 1
            })
            if (h) {
                sortLibs.map(function(o) {
                    o.size = self._formatSize(o.size)
                })
            }
            return sortLibs
        },
    
        statFiles: function(h) {
            var self = this
            self.files.sort(function(a,b) {
                return a.size > b.size ? -1: 1
            })
            if (h) {
                self.files.map(function(o) {
                    o.size = self._formatSize(o.size)
                })
            }
            return this.files
        }
    }
    
    if (!process.argv[2]) {
        console.log('usage: node linkmap.js filepath -hl')
        console.log('-h: format size')
        console.log('-l: stat libs')
        return
    }
    var isStatLib, isFomatSize
    var opts = process.argv[3];
    if (opts && opts[0] == '-') {
        if (opts.indexOf('h') > -1) isFomatSize = true
        if (opts.indexOf('l') > -1) isStatLib = true
    }
    
    var linkmap = new LinkMap(process.argv[2])
    linkmap.start(function(){
        var ret = isStatLib ? linkmap.statLibs(isFomatSize) 
                            : linkmap.statFiles(isFomatSize)
        for (var i in ret) {
            console.log(ret[i].name + '\t' + ret[i].size)
        }
    })
    
    1. 将找到的text文件和linkmap.js 文件 放到同一个文件夹下
      5.打开终端 cd到刚才的文件夹下 执行下面的命令:
      node linkmap.js ***.txt -hl // 为你刚才找到的txt文件
      执行完终端会输出所有可执行文件的大小

    检测未使用到的图片

    检测未使用到图片可以使用LSUnusedResources
    使用该工具需要注意图片名称是拼接的情况

    查找内容相同的图片
    Duplicate photo Finder


    未使用的文件

    按C++的经验,没有被使用到的类和方法编译器都会优化掉,不会编进最终的可执行文件,但object-c不一样,oc 只要指定了target的,如果编译该target都会编译到最终的可执行文件中去

    检测未使用的文件可以使用fui(Find Unused Imports)
    使用方式:
    1.如果没有安装过fui,先执行下面命令安装
    sudo gem install fui -n /usr/local/bin
    2.cd到工程目录下,执行fui find 命令可以找出所有没有用到的class文件,执行该命令可能需要几分钟,视文件多少而定


    压缩图片

    在线jpg压缩
    Optimize-Images GitHub
    在线jpg压缩


    参考文章:
    iOS APP可执行文件的组成
    iOS 优化ipa包,减小安装包大小
    减小iOS App或者静态库体积

    相关文章

      网友评论

          本文标题:包大小

          本文链接:https://www.haomeiwen.com/subject/dlgliftx.html