020 年 11 月 16 日,Google 開發者大會 (Google Developer Summit) 在線上舉行。本次大會以“代碼不止”為主題,全面介紹了產品更新以及一系列面向本地開發者的技術支持內容。11 月 18 日,進行了以 Flutter 為主題的演講,本文重點關注了 Flutter 性能方面的進展以及一些新功能。
2019 下半年,共收到 23 個量化的性能提升;2020 上半年,共收到 27 個量化的性能提升。2020 上半年共收到來自 78 位開發者的 49 個性能改進。
工具的性能十分重要,性能測試也同樣至關重要,擁有良好的性能測試可以:
能耗與速度相關,每一幀渲染時間越長,能耗就越高,但能耗并不等于速度,因為在某些情況下,渲染速度快可能會導致能耗升高;渲染速度慢也可能不耗能。
因此,在速度之外增加的能耗測試是十分必要的。因為 Flutter 團隊在 GitHub 上收到的大部分能耗問題都和 iOS 相關,所以,此次 Flutter 首先加入了 iOS 的能耗測試,Android 的能耗測試工具會于后續加入。
開發者可以使用 Flutter Gallery App 在 Timeline 中查看 CPU/GPU 的使用率,也可以用集成測試自動檢測 CPU/GPU 的使用率。
Flutter 還新加入了 SkSL 著色器編譯預熱功能,來幫助開發者消除著色器編譯卡頓。
如果一個 Flutter 程序第一次渲染某類動畫時出現明顯的卡頓,但是之后渲染這些動畫時,卡頓完全消失,那么這就很可能是著色器編譯卡頓。開發者可以使用 --trace-skia,然后檢查 Timeline 來確認是否為著色器卡頓。
值得一提的是,SkSL 可以實現自動化生成與測試,這對于需要持續更新的 Flutter App 來說,可以節省很多的人力。
此次,Flutter 團隊更新了 Dart 開發工具。Dart 開發工具是面向 Flutter 和 Dart 開發人員的工具套件,其中包括:
更多信息可以通過這篇由 Flutter 工程師撰寫的文章進行了解。
前端開發者往往會因為一些問題而感到困擾:設置布局以及讓外觀以你所希望的方式呈現。現在,前端開發者不再需要頭痛這些問題了,也不需要 CSS 過濾器這種復雜的解決手段。CSS Grid 可以同時用于水平和垂直布局設置,這意味著開發者現在可以通過使用 CSS Grid 實現許多強大的功能,從元素居中到創建強大的全頁面布局,都只需一行代碼即可完成。
它可以解決 CSS 中最大的問題:元素居中對齊。只需要將“display”設置為“gird”,即可進入網格模式,然后通過一行代碼:
place-items:center;
即可解決元素居中上遇到的問題。
可用于創建常用的頁眉頁腳和主體布局,同樣地,先將“display”設置為“gird”,然后通過一行代碼:
grid-template-rows: auto 1fr auto;
其中“grid-template-rows”用來設置父區域布局中行的大小,而后面的“auto”的含義是,對于自動放置的行,即自動調整大小的行,我們將使用最少內容的大小,在這種情況下就是內容的最小高度,這樣可以使內容剛好放入該布局的空間內;“1fr”的含義是,我們希望用父區域剩余空間的一等份單位來容納第二行。這樣的做法會使界面變得十分整潔,開發者可以利用自動值和等份單位非常方便地設置頁眉頁腳和主體區域。
上面所提到的“auto 1fr auto”,既可用于行,也可以用于列。通過這一功能,我們可以將頁面中除頁眉和頁腳的部分再分為三份,左右兩邊的區域依舊會根據內容自動分配空間大小。而在主體內容區添加內容時,空間大小保持不變。只需要一行代碼即可創建全頁面、自適應、可調整的流暢布局:
grid-template: auto 1fr auto / auto 1fr auto;
設置布局的另一種方法是使用網格,12-Span 的布局一直很受歡迎。現在,只需要一行代碼即可實現這一切:
grid-template-columns: repeat ( 12 , 1fr );
其中,我們使用了 repeat 函數,這樣就不需要重復寫 12 次 1fr,而是用“( 12 , 1fr )”來創建一個有 12 個 span 網格,每段網格具有相同單位值,均為空間的一等份單位。
李宇騫,Google 軟件工程師。
李宇騫是 Flutter 團隊的一位軟件工程師,主要專注于提升其性能。他畢業于清華大學計算機系本科,杜克大學計算機系博士。在加入 Flutter 前,他發明了一個新的矢量圖形抗鋸齒算法,顯著提升了其速度和順滑程度,并將其應用于 Flutter, Android, Chrome 等程序的2D 圖像渲染引擎 Skia 中。
侯悠揚,Flutter 用戶體驗研究員。
侯悠揚于2017年加入 Google,并于2019年加入 Flutter 團隊。她是 Flutter 團隊一名用戶體驗研究員,關注提升 Flutter 產品和開發工具的程序員體驗。加入 Flutter 團隊之前她任職于 Google Cloud 團隊,并在密歇根大學獲得人機交互博士。
Una Kravets,Google 開發技術推廣工程師。
延伸閱讀:
2020年:前端開發的痛苦與快樂-InfoQ
關注我并轉發此篇文章,私信我“領取資料”,即可免費獲得InfoQ價值4999元迷你書,點擊文末「了解更多」,即可移步InfoQ官網,獲取最新資訊~
話不多說直接上干活。
首推工具jadx(.apk, .dex, .jar, .class, .smali, .zip, .aar, .arsc, .aab),下載地址:https://github.com/skylot/jadx,將APK直接用工具打開即可,簡單省時。
另外還有dex2jar這款工具,操作步驟也比較簡單,將APK更改成rar/zip文件進行解壓,解壓后會得到class.dex文件,用命令 d2j-dex2jar.bat classes.dex 得到Jar文件后, jar文件的代碼查看可以使用jd-gui進行查看。
系統代碼僅僅指Android系統中的Java代碼部分。
不同的Android版本,java代碼部分大致分為jar, dex, vdex,cdex三種格式。根據不同的格式采用不同工具進行反編譯。
1.Jar,dex格式
可以采用jadx, 直接pull到電腦中,用jadx打開。
2.vdex格式
需要下載vdexExtractor 進行轉換。
執行./cdexExtractor/vdexExtractor -i hwPartIawareService.vdex ,生成cdex文件。
執行./cdexExtractor/compact_dex_converter hwPartIawareService_classes.cdex 生成hwPartIawareService_classes.cdex.new文件,該文件為dex格式,直接用jadx打開
工具下載:鏈接:https://pan.baidu.com/s/1Zt_XmLe4JMhhpKU5PthgBw
提取碼:f9b9
參考來源:https://github.com/anestisb/vdexExtractor
https://blog.cofface.com/archives/2932.html
3.odex格式
執行命令java -jar baksmali-2.5.2.jar d hwPartIawareService.odex -l --di false --sl
生成對應的out目錄,其中為smail文件。
執行java -jar smali-2.5.2.jar a out ,會將對應的out目錄生成out.dex,直接用jadx打開
下載路徑https://bitbucket.org/JesusFreke/smali/downloads/
注意:以上方式均不能很好地處理混淆后的代碼,混淆后的代碼比較晦澀。
代碼可任意下載的重大漏洞終于大規模爆發。
2018年的第一天,微信小程序被爆出驚天BUG:任何人可以通過AppID和版本號獲取任意小程序的源碼文件!
該漏洞被大范圍曝光起源于V2EX論壇一篇關于使用微信小游戲“跳一跳”不校驗post的漏洞進行刷分技術文章,文章同時給出了獲取跳一跳小游戲源碼的獲取方法。文章備注,此種獲取源碼的方法對于小程序也是通用的。
方法非常簡單:只要獲取到小程序的appid和版本號,即可通過構造URL直接下載該小程序的源碼wxapkg文件。
理論上,小程序的appid和版本號是只有開發者本人知道的,除非小程序開發者公布,其他人員無從獲取。而技術層面上,我們卻可以通過對小程序和服務器的通信進行抓包獲取到小程序appid和版本號。這就使得下載小程序源碼變得輕松異常。
微信小程序官方稱在當天修復了通過構造URL下載源碼的漏洞,目前,已無法使用構造URL的方式直接下載小程序執行包。
這個鍋應該由誰來背?
有開發者次日在V2EX爆料稱,該漏洞是由于小程序CDN服務商沒有給訪問做URL鑒權導致的。服務器開發我并不熟悉,此處不站隊。
實際上,通過構造URL的方式下載小程序源碼只是其中被曝光了的一個方式,我們的手機里其實已經保存了所有我們使用過的小程序執行包,對于root的安卓手機,我們可以在appbrand文件中找到所有已經使用過的小程序wxapkg文件。
只是命名規則比混亂,但這比抓包和構造URL的方法降低了對技術的要求。
之所以在標題使用“終于大規模爆發”,是因為這兩種獲取小程序源碼的方法早在2017年6月就有開發者發文給出了,而那位開發者寫文更多的是對前端代碼安全的討論。
更有討論價值的恰恰是前端代碼的安全問題。
小程序大部分功能的實現都是基于前端的,很多開發者為了省掉域名備案和SSL證書部署的麻煩,將小程序的大部分功能都寫在了前端。在被抓包和提取執行包不可避免的情況下,就要求小程序官方采取足夠的代碼安全保護措施。
而這一點,小程序開發團隊做的不是很好。
使用前文的任意方法獲取到小程序的執行文件,用Python版腳本(不得不佩服我們的程序員,在短短的一天時間內,出現了Python、PHP和js三個版本的解包腳本)對下載的wxapkg文件解包后得到這么幾個文件:
解碼后的小程序文件目錄
可以發現這些文件的組成和小程序的代碼已經非常相似了。與常規小程序代碼不同的是,解包的文件格式仍然是HTML文件。
但這不是重點。
打開page-frame.html和app-service.js,可以發現這些代碼已經非常具備可讀性了:
page-frame.html代碼截圖
app-service.js
對于熟悉小程序開發的人來說,這樣的代碼已經幾乎不需要再格式化了,現有文件已經可以比較清楚地看出代碼的邏輯。
回到代碼保護。
我們獲取到的wxapkg文件其實是小程序的執行文件,可以簡單理解為安裝包。安卓手機的安裝包(xxx.apk文件)大家非常熟悉,我們是很難通過apk文件獲取到應用源代碼的,因為代碼壓縮有非常復雜的加密過程,很難被反編譯。
但為什么小程序的執行包就可以被輕松地“反編譯”?(用“反編譯”其實已經非常高估小程序了,你可以發現前面我都是使用了“解包”這個詞,因為小程序的“反編譯”過程非常簡單,就像解壓縮一樣。)
小程序的執行文件之所以可以如此輕松地被反編譯,根源在于小程序的開發團隊并沒有對小程序的執行文件進行有效的保護,也就是加密。使用Hex Fiend(一款Mac OS上的十六進制編輯轉件)分析wxapkg文件會發現,大部分字段是沒有被加密的,可以直接看到文件的路徑。
實際上,小程序只是很簡單的將圖片、js和json文件壓在一起,而壓制的過程無非就是Wxml --> Html、 Wxml --> JS、Wxss --> Css,轉換后文件二進制格式跟后綴名為wx二進制格式完全一致。這就使得解包過程非常簡單,所以出現了一天之內涌現出Python、PHP和JS三個版本解包代碼的情況。
其實,早在2017年10月份,就有開發者在簡書分享了對小程序執行包的提取和解析過程,并在GitHub開源了腳本代碼。
So?
開發者Rolan在文章《從微信小程序看前端代碼的安全》中提到:
微信并沒有在代碼安全上進行過多的考慮。這導致需要在應用審核過程中花費比較多的功夫(也就是自己給代碼加密),不然作品太容易被復制竄改,以至于會失去渠道先機,這對流量是致命打擊。
由于歷史原因,前端的代碼安全技術發展的比較緩慢,相比其他被編譯成二進制的應用,前端這種純文本應用,太容易被辨識與竄改。
對前端代碼進行保護的目的在于讓機器容易識別相關的指令,而使人難以理解代碼的邏輯,但往往在對前端代碼進行保護過程中,很難既兼顧指令效率又能使可讀性降低。
因此,常常需要在現有的代碼中增加一些額外的驗證邏輯,例如一些增加無效的代碼進行混淆、采用守護代碼保護業務代碼不能在其他的域名下正常運行、增加一些防止調試跟蹤的斷點等,這些措施都是使得破解代碼時人工成本增加,從而增加代碼的安全性。
這篇文章是2017年6月發布的,早與小程序源碼大范圍泄漏前半年!半年前就已經被開發者意識到的安全問題,小程序開發團隊卻至今沒有發現,或者像Rolan說的“并沒有在代碼安全上進行過多的考慮”。
近乎開源的源代碼對于開發者而言,已經幾乎沒有任何盈利的可能性。當前互聯網環境下,個人開發者(或小型開發團隊)在沒有足夠資金和流量支持的情況下,先發優勢是他們唯一可以使用的資源,而代碼的安全性是對先發優勢的絕對保護。
一旦代碼被開源,優質小程序可能會迅速被不懷好意的資本和流量持有方抄襲取代。
作為微信生態內的新生力量,小程序不僅被官方,也被很多開發者和內容創業者寄予厚望,而此次暴露出的bug則令人心驚。希望微信官方能盡快修復漏洞,讓剛剛抬頭的小程序生態穩健成長。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。