包大小

作者: 张_何 | 来源:发表于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或者静态库体积

相关文章

  • 包大小

    查看可执行文件构成 1.XCode开启编译选项Write Link Map FileXCode -> ***.xc...

  • 包大小

    常规的图片压缩,png->tinypng -> webp(当然Android从4.0才开始WebP的原生支持,但是...

  • 包大小

    1.删除无用的图片 [LSUnusedResources]2.删除无用的类 CATClearProjectTOOL...

  • 微信小程序开发工具查看包大小

    点击开发工具中的详情,在详情中会有本次提交的代码包大小,既有主包大小,也有子包大小

  • 包大小优化

    背景知识 App的大小分为下载大小和安装大小。下载大小指的是App压缩包(.ipa)所占的空间大小。用户下载的是压...

  • iOS性能优化-包大小+linkMap分析和查找未使用类和方法

    1. LinkMap解析 导读IOS在做包大小优化的时候,需要分析包大小组成,然后通过包大小组成来有针对的做优化。...

  • compose 相关问题

    1 包大小比较 直接加入相关依赖包demo包大小增加 (11252KB-12975KB)增加了1723KB 7...

  • 性能优化-安装包大小优化

    安装包大小优化 安装包大小对应用的使用没什么影响,但提高来用户的下载门槛。减少安装包大小用户更愿意下载和体验。减少...

  • 优化IPA包大小

    最近在做个人产品VoiceCalcultor语音计算器,在集成百度语音后,上线第一版成功了很高兴,但是IPA包大小...

  • 如何减少包大小

    1. 减少二进制文件大小 手段主要有: 删除无用业务 如非必要,使用 method 而不是 block 碎片文件合...

网友评论

      本文标题:包大小

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