在混淆代碼的時候怔锌,要在func.plist文件中配置需要混淆的函數(shù)名和變量名款青。整個項目工程的代碼量太大,不可能手動將所有的函數(shù)名和變量名添加到func.plist中嵌屎,所以寫了一個工程來獲取整個項目工程中的函數(shù)名和變量名誉裆。
實現(xiàn)流程如下圖
判斷是否是文件夾
? ? func isDirectory(path:String) ->Bool
? ? {
? ? ? ? var isDir:ObjCBool=true
? ? ? ? if FileManager.default.fileExists(atPath: path, isDirectory: &isDir)
? ? ? ? {
? ? ? ? ? ? return isDir.boolValue
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? return false
? ? ? ? }
? ? }
獲取所有的文件夾地址(包括子路徑下的文件夾地址)
func getAllFilePaths(path :String) -> [String]
? ? {
? ? ? ? var filePaths = [String]()
? ? ? ? do{
? ? ? ? ? ? let array =try FileManager.default.contentsOfDirectory(atPath: path)
? ? ? ? ? ? var isDir:ObjCBool=true
? ? ? ? ? ? for fileName in array {
? ? ? ? ? ? ? ?let fullPath ="\(path)/\(fileName)"
? ? ? ? ? ? ? ? if FileManager.default.fileExists(atPath: fullPath, isDirectory: &isDir) {
? ? ? ? ? ? ? ? ? ? if isDir.boolValue{
? ? ? ? ? ? ? ? ? ? ? ? filePaths.append(fullPath)
? ? ? ? ? ? ? ? ? ? ? ? let paths =self.getAllFilePaths(path: fullPath)
? ? ? ? ? ? ? ? ? ? ? ? filePaths = filePaths + paths
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ?}catch{}
//? ? ? ? print("filePaths = \(filePaths)")
? ? ? ? return filePaths
? ? }
獲取文件夾下的所有.swift文件地址
func getAllFile(pathList : [String]) -> [String]
? ? {
? ? ? ? var files = [String]()
? ? ? ? do{
? ? ? ? ? ? for path in pathList
? ? ? ? ? ? {
? ? ? ? ? ? ? ? var array =try FileManager.default.contentsOfDirectory(atPath: path)
? ? ? ? ? ? ? ? if array.count> 0 {
? ? ? ? ? ? ? ? ? ? array =NSArray.init(array: array).pathsMatchingExtensions(["swift"])
? ? ? ? ? ? ? ? ? ? array = array.map({"\(path)/\($0)"})
? ? ? ? ? ? ? ? ? ? files = files +? array
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }catch{}
//? ? ? ? print("fileList = \(files)")
? ? ? ? return files
? ? }
獲取.swift文件中所有的函數(shù)名和變量名
? ? func getMethods(path:String)->[String: [String]]
? ? {
? ? ? ? var methods = [String]()
? ? ? ? var propertyNames = [String]()
? ? ? ? do
? ? ? ? {
? ? ? ? ? ? let string =try String.init(contentsOfFile: path, encoding: .utf8)
//? ? ? ? ? ? print("string \(string)")
? ? ? ? ? ? //property
? ? ? ? ? ? var classList : [String] = string.components(separatedBy:"class ")
? ? ? ? ? ? classList.removeFirst()
? ? ? ? ? ? for classStr in classList
? ? ? ? ? ? {
? ? ? ? ? ? ? ? var strList : [String] = classStr.components(separatedBy:"{")
? ? ? ? ? ? ? ? let str = strList[1]
? ? ? ? ? ? ? ? var varList : [String] = str.components(separatedBy:"var ")
? ? ? ? ? ? ? ? varList.removeFirst()
? ? ? ? ? ? ? ? for str in varList
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? var arr = str.split(separator:" ", maxSplits: 1, omittingEmptySubsequences:false)
? ? ? ? ? ? ? ? ? ? arr =String(arr[0]).split(separator:":", maxSplits: 1, omittingEmptySubsequences:false)
? ? ? ? ? ? ? ? ? ? arr =String(arr[0]).split(separator:"!", maxSplits: 1, omittingEmptySubsequences:false)
? ? ? ? ? ? ? ? ? ? if(!self.isSpecialStr(str:String(arr[0])))
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? propertyNames.append(String(arr[0]))
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? var letList : [String] = str.components(separatedBy:"let ")
? ? ? ? ? ? ? ? let List.removeFirst()
? ? ? ? ? ? ? ? for str in letList
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? let arr = str.split(separator:" ", maxSplits: 1, omittingEmptySubsequences:false)
? ? ? ? ? ? ? ? ? ? if(!self.isSpecialStr(str:String(arr[0])))
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? propertyNames.append(String(arr[0]))
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
//? ? ? ? ? ? print("propertys \(propertyNames)")
? ? ? ? ? ? //method
? ? ? ? ? ? var funcList : [String] = string.components(separatedBy:"func ")
? ? ? ? ? ? funcList.removeFirst()
? ? ? ? ? ? for str in funcList
? ? ? ? ? ? {
? ? ? ? ? ? ? ? letarr = str.split(separator:"(", maxSplits: 1, omittingEmptySubsequences:false)
? ? ? ? ? ? ? ? if(!self.isSpecialStr(str:String(arr[0])))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? methods.append(String(arr[0]))
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
//? ? ? ? ? ? print("methods \(methods)")
? ? ? ? }
? ? ? ? catch{}
? ? ? ? return["methods": methods ,"propertyNames": propertyNames]
判斷解析出來的函數(shù)名或者變量名是否是特殊字符
? ? func isSpecialStr(str:String) ->Bool
? ? {
? ? ? ? let specialList = ["id":"id","weak":"weak","strong":"strong",
?? ? ? ? ? ? ? ? ? ? ? ? ? "awakeFromNib":"awakeFromNib",
?? ? ? ? ? ? ? ? ? ? ? ? ? "tableView":"tableView",
?? ? ? ? ? ? ? ? ? ? ? ? ? "mapping":"mapping",
?? ? ? ? ? ? ? ? ? ? ? ? ? "viewDidLoad":"viewDidLoad",
?? ? ? ? ? ? ? ? ? ? ? ? ? "viewWillAppear":"viewWillAppear",
?? ? ? ? ? ? ? ? ? ? ? ? ? "==":"=="]
? ? ? ? if(specialList[str] ==nil)
? ? ? ? {
? ? ? ? ? ? return false
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? return true
? ? ? ? }
? ? }
?去重
? ? func deDuplication(arr:[String]) -> [String]
? ? {
? ? ? ? letset :Set =Set(arr)
? ? ? ? returnArray(set)
? ? }
最后的使用
? ?override func viewDidLoad() {
? ? ? ? super.viewDidLoad()
? ? ? ? // Do any additional setup after loading the view, typically from a nib.
? ? ? ? let mainPath = "/Users/cafei/Documents/xxxProject"
? ? ? ? letpath = [mainPath +"Login",
? ? ? ? ? ? ? ? ? ? mainPath +"Mine",
? ? ? ? ? ? ? ? ? ? mainPath +"Util",
? ? ? ? ? ? ? ? ? ? mainPath +"Discover",
? ? ? ? ? ? ? ? ? ? mainPath +"Core",
? ? ? ? ? ? ? ? ? ? mainPath +"Base",
? ? ? ? ? ? ? ? ? ? mainPath +"Launch"]
? ? ? ? var list =self.getAll(paths: path)
//? ? ? ? print("all list = \(list)")
? ? ? ? list =self.deDuplication(arr: list)
? ? ? ? for resultStr in list{
? ? ? ? ? ?print("\(resultStr)")
? ? ? ? }
? ? }
func getAll(paths : [String]) -> [String]
? ? {
? ? ? ? var all = [String]()
? ? ? ? for path in paths
? ? ? ? {
? ? ? ? ? ? let pathList =self.getAllFilePaths(path: path)
? ? ? ? ? ? let fileList =self.getAllFile(pathList: pathList)
? ? ? ? ? ? var methodList = [String]()
? ? ? ? ? ? var propertyList = [String]()
? ? ? ? ? ? for file in fileList
? ? ? ? ? ? {
? ? ? ? ? ? ? ? let dic =self.getMethods(path: file)
? ? ? ? ? ? ? ? methodList = methodList + (dic["methods"] ?? [""])
? ? ? ? ? ? ? ? propertyList = propertyList + (dic["propertyNames"]? ?? [""])
? ? ? ? ? ? }
? ? ? ? ? ?all.append(contentsOf:self.deDuplication(arr: methodList))
? ? ? ? ? ? all.append(contentsOf:self.deDuplication(arr: propertyList))
? ? ? ? }
? ? ? ? return all
? ? }
將最后在控制臺打印出來的resultStr列表就是指定路徑下所有文件中的函數(shù)名和變量名顿颅。