獲取文件中的函數(shù)名和變量名(swift篇)

在混淆代碼的時候怔锌,要在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ù)名和變量名顿颅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市足丢,隨后出現(xiàn)的幾起案子粱腻,更是在濱河造成了極大的恐慌,老刑警劉巖霎桅,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栖疑,死亡現(xiàn)場離奇詭異,居然都是意外死亡滔驶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門卿闹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揭糕,“玉大人,你說我怎么就攤上這事锻霎≈牵” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵旋恼,是天一觀的道長吏口。 經(jīng)常有香客問我,道長冰更,這世上最難降的妖魔是什么产徊? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蜀细,結(jié)果婚禮上舟铜,老公的妹妹穿的比我還像新娘。我一直安慰自己奠衔,他們只是感情好谆刨,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布塘娶。 她就那樣靜靜地躺著,像睡著了一般痊夭。 火紅的嫁衣襯著肌膚如雪刁岸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天她我,我揣著相機(jī)與錄音难捌,去河邊找鬼。 笑死鸦难,一個胖子當(dāng)著我的面吹牛根吁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播合蔽,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼击敌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拴事?” 一聲冷哼從身側(cè)響起沃斤,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刃宵,沒想到半個月后衡瓶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡牲证,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年哮针,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坦袍。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡十厢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捂齐,到底是詐尸還是另有隱情蛮放,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布奠宜,位于F島的核電站包颁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏压真。R本人自食惡果不足惜娩嚼,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望榴都。 院中可真熱鬧待锈,春花似錦、人聲如沸嘴高。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至春瞬,卻和暖如春柴信,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宽气。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工随常, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人萄涯。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓绪氛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涝影。 傳聞我的和親對象是個殘疾皇子枣察,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容