1+ #coding=utf-8
2+ '''
3+ Created on 2015年10月27日
4+ Framework下的头文件里的api = 有文档的api + 没有文档的api
5+ @author: hzwangzhiwei
6+ '''
7+ from db import dsidx_dbs
8+ import os
9+
10+ def framework_dump_header_apis (sdk , framework_folder ):
11+ '''
12+ class-dump Framework下的库生成的头文件中的api
13+ sdk: sdk version
14+ info: 用class-dump对所有的公开库(/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk/System/Library/Frameworks)进行逆向工程得到所有的头文件内容。提取每个.h文件中的api得到api集合set_A。
15+ '''
16+ pass
17+
18+ def framework_header_apis (sdk , framework_folder ):
19+ '''
20+ get all public frameworks' header files(documented)
21+ '''
22+ def iterate_dir (framework , prefix , path ):
23+ files = []
24+ for f in os .listdir (path ):
25+ if os .path .isfile (os .path .join (path , f )):
26+ files .append ((framework , prefix + f , os .path .join (path , f )))
27+ elif os .path .isdir (os .path .join (path , f )):
28+ files += iterate_dir (framework , prefix + f + "/" , os .path .join (path , f ))
29+ return files
30+ all_headers = []
31+
32+ for framework in os .listdir (framework_folder ):
33+ if framework .endswith (".framework" ):
34+ header_path = framework_folder + framework + "/Headers/"
35+ if os .path .exists (header_path ):
36+ #for header in os.listdir(header_path):
37+ # file_path = header_path + header
38+ # allpaths.append((framework, header, file_path))
39+ all_headers += iterate_dir (framework , "" , os .path .join (framework_folder , header_path ))
40+
41+ return all_headers
42+
43+ #没有文档的api
44+ def undocument_apis (sdk ):
45+ '''
46+ info:不在文档中的api方法
47+ '''
48+ framework_header_apis (sdk ) - document_apis (sdk )
49+
50+ #有文档的api
51+ def document_apis (sdk , db_path ):
52+ '''
53+ has document apis
54+ info:获得带文档的api。(/Users/sngTest/Library/Developer/Shared/Documentation/DocSets/com.apple.adc.documentation.AppleiOS7.0.iOSLibrary.docset/Contents/Resources),在里面有个docSet.dsidx的文件,这就是Xcode针对api做的数据库,从这里可以获得带文档的api的各种信息了,从而有了带文档的api集合set_B。
55+
56+ '''
57+ doc_apis = []
58+ #从dsidx 数据库中获得初始数据
59+ apiset = dsidx_dbs .get_dsidx_apis (db_path )
60+ #过滤初始数据获得有文档的api集合
61+ for api in apiset :
62+ Z_PK = api ['Z_PK' ]
63+ ZDECLAREDIN = api ['ZDECLAREDIN' ]
64+ # get containername from ZCONTAINER table
65+ container_name = ''
66+ if Z_PK :
67+ container_name = dsidx_dbs .get_container_name (Z_PK , db_path ) or ''
68+ # get frameworkname and headerpath from ZHEADER table
69+
70+ framework_name = ''
71+ header_path = ''
72+ if ZDECLAREDIN :
73+ frame_header = dsidx_dbs .get_framework_and_header (ZDECLAREDIN , db_path )
74+ if frame_header :
75+ framework_name = frame_header .get ('ZFRAMEWORKNAME' , '' )
76+ header_path = frame_header .get ('ZHEADERPATH' , '' )
77+
78+ doc_apis .append ({'api_name' : api ['ZTOKENNAME' ], 'class_name' : container_name , 'type' : api ['ZTOKENTYPE' ], 'header_file' : header_path , 'framework' : framework_name , 'sdk' : sdk })
79+ return doc_apis
80+
81+ def private_framework_apis (sdk ):
82+ '''
83+ PrivateFramework下的api
84+ '''
85+ pass
86+
87+ def all_private_apis (sdk ):
88+ pub_private_apis = framework_dump_header_apis (sdk ) - document_apis (sdk ) - undocument_apis (sdk )
89+
90+ pri_private_apis = private_framework_apis (sdk )
91+
92+ return pub_private_apis + pri_private_apis
0 commit comments