itools 0.4.8 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +9 -8
- data/bin/itools +13 -8
- data/lib/itools/link_map.rb +114 -7
- data/lib/itools/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf38167231314d38da1f2027c16c24df9cd7419205c154e6bf8591fe89d58133
|
4
|
+
data.tar.gz: ecbcb2405ee49c04d97de632f10d56ff4f2a17f26679fb7d0ed72bca3e0278c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9d233beb82f1909ef00e6791789caae405cd852763fa2d5590cbe469a81f710b0e1358812da22b452359dd55f21f85ba8ee5b1290ecdecdbdd05ec15be7a9f25
|
7
|
+
data.tar.gz: 7684e2bafc4abc09757f3dbf96f316f44b6172b68cc532b5edb25a579db57ea3103d04ffd3b774dbbc822984e1cddd72304dde7e149c560f7874670803583061
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -19,21 +19,22 @@ SYNOPSIS
|
|
19
19
|
itools [global options] command [command options] [arguments...]
|
20
20
|
|
21
21
|
VERSION
|
22
|
-
0.4.
|
22
|
+
0.4.9
|
23
23
|
|
24
24
|
GLOBAL OPTIONS
|
25
25
|
--help - Show this message
|
26
26
|
--version - Display the program version
|
27
27
|
|
28
28
|
COMMANDS
|
29
|
-
count_code_line -
|
30
|
-
find -
|
29
|
+
count_code_line - 统计代码行数
|
30
|
+
find - 查找无用图片
|
31
31
|
help - Shows a list of commands or help for one command
|
32
|
-
parse -
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
32
|
+
parse - 解析linkmap
|
33
|
+
pre_commit - 通过执行该命令,hook 本地commit,然后进行规范化
|
34
|
+
search - 在文件夹或文件中查找字符串(或者字符串组)
|
35
|
+
search_file - 查找文件
|
36
|
+
search_unuse_class - 查找无用类
|
37
|
+
size_for - 计算文件或者文件夹占用内存大小
|
37
38
|
```
|
38
39
|
|
39
40
|
### 功能1:解析LinkMap
|
data/bin/itools
CHANGED
@@ -7,15 +7,20 @@ include GLI::App
|
|
7
7
|
program_desc 'a collection of tools for ios developer'
|
8
8
|
version Itools::VERSION
|
9
9
|
|
10
|
-
desc "
|
10
|
+
desc "解析linkmap"
|
11
11
|
arg 'xxx.txt'
|
12
12
|
command :parse do |c|
|
13
13
|
c.action do |global_options, options, args|
|
14
|
-
|
14
|
+
if args.size == 1
|
15
|
+
Itools::LinkMap.parser(args[0])
|
16
|
+
else
|
17
|
+
Itools::LinkMap.parser_by_folder(args)
|
18
|
+
end
|
19
|
+
|
15
20
|
end
|
16
21
|
end
|
17
22
|
|
18
|
-
desc "
|
23
|
+
desc "在文件夹或文件中查找字符串(或者字符串组)"
|
19
24
|
arg 'xxx.txt'
|
20
25
|
command :search do |c|
|
21
26
|
c.action do |global_options, options, args|
|
@@ -23,7 +28,7 @@ command :search do |c|
|
|
23
28
|
end
|
24
29
|
end
|
25
30
|
# 查找工程中没有用到的图片
|
26
|
-
desc "
|
31
|
+
desc "查找无用图片"
|
27
32
|
arg 'xxx.txt'
|
28
33
|
command :find do |c|
|
29
34
|
c.action do |global_options, options, args|
|
@@ -31,7 +36,7 @@ command :find do |c|
|
|
31
36
|
end
|
32
37
|
end
|
33
38
|
# 查找Xcode工程中没有用到的类
|
34
|
-
desc "
|
39
|
+
desc "查找无用类"
|
35
40
|
arg 'xxx.txt'
|
36
41
|
command :search_unuse_class do |c|
|
37
42
|
c.action do |global_options, options, args|
|
@@ -40,7 +45,7 @@ command :search_unuse_class do |c|
|
|
40
45
|
end
|
41
46
|
|
42
47
|
# 计算占用内存大小
|
43
|
-
desc "
|
48
|
+
desc "计算文件或者文件夹占用内存大小"
|
44
49
|
arg 'xxx.txt'
|
45
50
|
command :size_for do |c|
|
46
51
|
c.action do |global_options, options, args|
|
@@ -49,7 +54,7 @@ command :size_for do |c|
|
|
49
54
|
end
|
50
55
|
|
51
56
|
# 查找文件
|
52
|
-
desc "
|
57
|
+
desc "查找文件"
|
53
58
|
arg 'file name'
|
54
59
|
command :search_file do |c|
|
55
60
|
c.action do |global_options, options, args|
|
@@ -58,7 +63,7 @@ command :search_file do |c|
|
|
58
63
|
end
|
59
64
|
|
60
65
|
# 统计代码行数
|
61
|
-
desc "
|
66
|
+
desc "统计代码行数"
|
62
67
|
arg 'file name or folder'
|
63
68
|
command :count_code_line do |c|
|
64
69
|
c.action do |global_options, options, args|
|
data/lib/itools/link_map.rb
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'pathname'
|
3
|
-
|
3
|
+
require 'find'
|
4
4
|
module Itools
|
5
5
|
# ---------------------------------ObjectFile class---------------------------------
|
6
6
|
class ObjectFile
|
7
|
-
|
7
|
+
# file_size:单个文件的大小
|
8
|
+
# o_name:某个文件的名字
|
9
|
+
# o_size: 某个o文件的大小
|
10
|
+
attr_accessor :serial_number, :file_path, :file_name, :file_size, :o_name, :o_size
|
8
11
|
def initialize()
|
9
12
|
@serial_number = []
|
13
|
+
@file_size = 0
|
14
|
+
@o_size = 0
|
10
15
|
end
|
11
16
|
|
12
17
|
end
|
@@ -53,9 +58,19 @@ module Itools
|
|
53
58
|
obj_file.serial_number = tempSplit[0].delete("[").strip.to_i #设置serial_number
|
54
59
|
obj_file.file_path = tempSplit[1].strip
|
55
60
|
obj_file.file_name = tempSplit[1].split("/").last.chomp
|
61
|
+
obj_file.o_name = get_o_name(tempSplit[1].split("/").last.chomp)
|
56
62
|
l_obj_files << obj_file
|
57
63
|
end
|
58
64
|
end
|
65
|
+
# 得到o_ame 有待优化,可以使用正则表达式处理TODO
|
66
|
+
def get_o_name(str)
|
67
|
+
temp_arr = str.split("(")
|
68
|
+
if temp_arr.size > 1
|
69
|
+
temp_arr[1].split(".o)")[0]
|
70
|
+
else
|
71
|
+
return temp_arr[0].split(".o")[0]
|
72
|
+
end
|
73
|
+
end
|
59
74
|
# 处理sections
|
60
75
|
def handle_sections(str)
|
61
76
|
sectionSplit = str.split(" ")
|
@@ -131,6 +146,7 @@ module Itools
|
|
131
146
|
|
132
147
|
end
|
133
148
|
end
|
149
|
+
# 对linkmap进行解析,然后输出结果
|
134
150
|
def self.parser(path_para)
|
135
151
|
start_time = Time.now.to_i #程序开始执行时间(以毫秒为单位)
|
136
152
|
# 获取link map file's name
|
@@ -138,8 +154,8 @@ module Itools
|
|
138
154
|
puts "获取的文件路径为:#{link_map_file_name}"
|
139
155
|
if link_map_file_name.nil?
|
140
156
|
puts "请按照如下命令执行该脚本:"
|
141
|
-
puts "\033[
|
142
|
-
puts "**指代Link Map File的名字,例如LinkMapApp-LinkMap-normal-x86_64.txt"
|
157
|
+
puts "\033[31mitools parse **.txt \033[0m"
|
158
|
+
puts "**指代Link Map File的名字,例如LinkMapApp-LinkMap-normal-x86_64.txt,parse后面为绝对路径"
|
143
159
|
return
|
144
160
|
end
|
145
161
|
if File.exist?(link_map_file_name)
|
@@ -223,10 +239,99 @@ module Itools
|
|
223
239
|
puts "\033[32m整个程序执行时间为:#{end_time - start_time}秒\033[0m"
|
224
240
|
end
|
225
241
|
|
242
|
+
# 根据linkmap && folder计算占用
|
243
|
+
# 第一个参数为linkmap路径,第二个参数为要分析的项目文件夹
|
244
|
+
def self.parser_by_folder(args)
|
245
|
+
link_map_file_name = args[0] #linkmap文件路径
|
246
|
+
project_folder = args[1] #项目文件夹
|
247
|
+
# 对参数进行校验
|
248
|
+
if File::directory?(project_folder)
|
249
|
+
puts "获取的项目目录路径为:#{project_folder}"
|
250
|
+
else
|
251
|
+
puts "\033[31m#{project_folder}文件夹不存在,请重新输入 \033[0m"
|
252
|
+
return
|
253
|
+
end
|
254
|
+
if File.exist?(link_map_file_name)
|
255
|
+
puts "获取的linkmap文件路径为:#{link_map_file_name}"
|
256
|
+
puts "\033[32m获取LinkMap文件: #{link_map_file_name}成功,开始分析数据...\033[0m"
|
257
|
+
else
|
258
|
+
puts "\033[31m#{link_map_file_name}文件不存在,请重新输入 \033[0m"
|
259
|
+
return
|
260
|
+
end
|
261
|
+
# 开始处理数据
|
262
|
+
link_map = LinkMap.new(link_map_file_name)
|
263
|
+
link_map.handle_map #处理文件为对象,然后继续后续操作
|
264
|
+
link_map.handle_l_sym_map #处理symbols为hashmap
|
265
|
+
|
266
|
+
# 所有的文件
|
267
|
+
link_map.l_obj_files
|
268
|
+
# 所有的symbols
|
269
|
+
link_map.l_symbols
|
270
|
+
|
271
|
+
# 处理得到每个obj_file的大小
|
272
|
+
link_map.l_obj_files.each do |obj|
|
273
|
+
if link_map.l_sym_map[obj.serial_number]
|
274
|
+
link_map.l_sym_map[obj.serial_number].each do |symb|
|
275
|
+
obj.o_size = obj.o_size + symb.s_size.hex
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
# key为文件名,value为ojbect
|
280
|
+
sort_by_obj_files_map = link_map.l_obj_files.group_by(&:o_name)
|
281
|
+
# save_file_path = SizeResult.getSaveFileName(project_folder)
|
282
|
+
# save_file = File.new(save_file_path,"w+")
|
283
|
+
# sort_by_obj_files_map.keys.each do |sss|
|
284
|
+
|
285
|
+
# save_file.puts("#{sort_by_obj_files_map[sss][0].o_name} #{sort_by_obj_files_map[sss][0].o_size}")
|
286
|
+
# end
|
287
|
+
# save_file.close
|
288
|
+
# exit
|
289
|
+
|
290
|
+
|
291
|
+
|
292
|
+
size_results = [] #盛放计算结果
|
293
|
+
size_files = []
|
294
|
+
space_index = 0
|
295
|
+
puts "计算开始"
|
296
|
+
traverse_dir(sort_by_obj_files_map,project_folder,size_results,size_files,space_index)
|
297
|
+
size_results.reverse!
|
298
|
+
# 存储为文件
|
299
|
+
save_file_path = SizeResult.getSaveFileName(project_folder)
|
300
|
+
if File.exist?(save_file_path)
|
301
|
+
File.delete(save_file_path)
|
302
|
+
end
|
303
|
+
save_file = File.new(save_file_path,"w+")
|
304
|
+
size_results.each do |o|
|
305
|
+
save_file.puts("#{' ' * o.space_count}|- #{o.folder_name.split('/').last} #{SizeResult.handleSize(o.size)}")
|
306
|
+
end
|
307
|
+
save_file.close
|
308
|
+
puts "分析结果已经保存为文件,位置为:\n\033[32m#{save_file_path}\033[0m"
|
309
|
+
end
|
310
|
+
def self.traverse_dir(sort_by_obj_files_map,file_path,results,size_files,space_index)
|
311
|
+
s_result = SizeResult.new
|
312
|
+
s_result.folder_name = file_path
|
313
|
+
space_index = space_index + 2
|
314
|
+
file_name_arr = [] #盛放计算过的类
|
315
|
+
Find.find(file_path) do |file|
|
316
|
+
if File.file?(file)
|
317
|
+
file_name = File.basename(file,".*")
|
318
|
+
if !file_name_arr.include?(file_name) && sort_by_obj_files_map[file_name] #没有已经计算过
|
319
|
+
s_result.size = s_result.size + sort_by_obj_files_map[file_name][0].o_size
|
320
|
+
file_name_arr << file_name
|
321
|
+
end
|
322
|
+
elsif File::directory?(file) && file != file_path
|
323
|
+
traverse_dir(sort_by_obj_files_map,file,results,size_files,space_index)
|
324
|
+
end
|
325
|
+
end
|
326
|
+
if s_result.size > 0 && !size_files.include?(s_result.folder_name)
|
327
|
+
s_result.space_count = space_index
|
328
|
+
results << s_result
|
329
|
+
size_files << s_result.folder_name
|
330
|
+
end
|
331
|
+
end
|
226
332
|
end
|
227
|
-
# --------------------------------- Size utils class ---------------------------------
|
228
333
|
class SizeResult
|
229
|
-
attr_accessor :file_name, :file_serial_numers, :size
|
334
|
+
attr_accessor :file_name, :file_serial_numers, :size,:folder_name, :space_count
|
230
335
|
def initialize
|
231
336
|
@file_serial_numers = []
|
232
337
|
@size = 0
|
@@ -248,5 +353,7 @@ module Itools
|
|
248
353
|
save_file_path = path.dirname.to_s + "/" + "parse_" + path.basename.to_s + "_result.txt"
|
249
354
|
return save_file_path
|
250
355
|
end
|
251
|
-
end
|
356
|
+
end
|
252
357
|
end
|
358
|
+
|
359
|
+
# --------------------------------- Size utils class ---------------------------------
|
data/lib/itools/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: itools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zhanggui
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-01-
|
11
|
+
date: 2019-01-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|