iOS APP包分析工具 | 京東云技術團隊

介紹

分享一款用于分析iOSipa包的腳本工具,使用此工具可以自動掃描發現可修復的包體積問題,同時可以生成包體積數據用于查看。這塊工具我們團隊內部已經使用很長一段時間,希望可以幫助到更多的開發同學更加效率的優化包體積問題。

工具下載地址

背景

APPAnalyze工具最早誕生主要是為了解決以下包體積管理的問題:

對于定位下沉市場的APP來講,包體積是一個非常重要的性能指標,包體積過大會影響用戶下載APP的意愿。但是在早期我們缺少一些手段幫助我們更高效的去進行包體積管理。

自動發現問題
  • 提升效率- 人工排查問題效率低,對于常見的問題盡可能自動掃描出來。并且對于組件化工程來講,很多外部組件是通過Framework方式提供,沒有倉庫源碼權限用于分析包體積問題。

  • 流程化- 形成自動化的質量流程,添加到CI流水線自動發現包體積問題。

數據指標量化
  • 包體積問題- 提供數據化平臺查看每個組件的包體積待修復問題

  • 包體積大小- 提供數據化平臺查看每個組件的包體積占比,包括總大小,單個文件二進制大小和每個資源大小。可以針對不同的APP版本進行組件化粒度的包體積數據對比,更方便查看每個版本的組件大小增量。

實現方式

我們選擇了不依賴源碼而是直接掃描二進制庫的方式來實現這個能力,總體的執行流程一下:
執行流程

提示:基于組件化工程的掃描方式內部支持,只是暫時不對外開放。

使用指南

安裝

無需安裝。通過下載鏈接直接下載終端可執行命令文件APPAnalyzeCommand到本地即可使用。

APPAnalyzeCommand 下載地址

使用

$ /Users/Test/APPAnalyzeCommand --help
OPTIONS:--version <version>     當前版本 1.0.0--output <output>       輸出文件目錄。必傳參數--config <config>       配置JSON文件地址。非必傳參數--ipa <ipa>             ipa.app文件地址。必傳參數-h, --help              Show help information.

執行

打開終端程序直接執行以下shell指令,即可生成ipa的包體積數據以及包體積待修復問題。

提示:不能直接使用AppStore的包,AppStore的包需要砸殼。建議盡量使用XCodeDebug的包。

/Users/Test/APPAnalyzeCommand --ipa ipas/JDAPP/JDAPP.app --output ipas/JDAPP

提示:如果提示permission denied沒有權限,執行sudo chmod -R 777 /Users/a/Desktop/ipas/APPAnalyzeCommand即可。

生成產物

生成產物
指令執行完成以后,會在ouput參數指定的文件夾生成APPAnalyze文件夾。具體文件介紹如下:

包體積信息
  • app_size.html- 展示ipa每個framework的包體積數據,可直接用瀏覽器打開。

提示:按照主程序和動態庫進行粒度劃分

app_size.html

  • framework_size.html- 展示單個framework所有的包體積數據,二級頁面不要直接打開

framework_size.html

提示:XCode生成Assets.car時會將一些小圖片拼接成一張PackedAssetImage的大圖片。

  • package_size.json-ipa包體積 JSON 數據
包體積待修復問題
  • app_issues.html- 展示ipa每個framework的包體積待修復問題數量,可直接用瀏覽器打開。

提示:按照主程序和動態庫進行粒度劃分
app_issues.html

  • framework_issues.html- 展示單個framework所有的待修復問題詳細數據,二級頁面不要單獨打開

framework_issues.html

  • issues.json-ipa待修復包體積問題 JSON 數據

提示:json數據可用于搭建自己的數據平臺,擴展更多的能力。例如查看不同APP版本以及支持多個APP版本對比等。

規則介紹

規則

包體積

未使用的類

定義了類沒有被使用到,包含ObjC類和Swift類。

掃描規則

  • 沒有查到到對應的ObjC類被引用

  • 沒有被當做父類使用

  • 沒有使用的字符串和類名一致

  • 沒有被當做屬性類型使用

  • 沒有被創建或調用方法

  • 沒有實現+load方法

可選的修復方式

  • 移除未使用的類

  • Swift類如果只是用了static方法考慮修改成Enum類型

  • 如果只是在類型轉換時使用了也會檢測出是未使用的類,例如(ABCClass *)object;。建議檢查是否真的有沒有到相關類后刪除

  • 對于ObjC,如果只是作為方法參數類型使用也會被檢測出是未使用的類。建議刪除相關方法即可。

提示:刪除類相對是一種安全的行為,因為刪除后如果有被使用到會產生編譯時錯誤。雖然有做字符串調用的掃描過濾,不過還是建議檢查是否可能被Runtime動態創建調用

未使用的ObjC協議

定義了ObjC協議沒有被類使用

掃描規則

  • 對應的協議沒有被類引用

可選的修復方式

  • 移除未使用的協議
Bundle內多Scale圖片

Bundle內同一張圖片包含多個Scale會導致更大的包體積。

掃描規則

  • 同一個Bundle內存在同名但是scale不同的圖片。例如a@2x.png/a@3x.png

可選的修復方式

  • 移除Scale更低的圖片
大資源

文件大小超過一定大小的即為大資源,默認為20KB

掃描規則

  • 某個文件超過設置的大資源限額

可選的修復方式

  • 移除資源動態下發

  • 使用更小的數據格式,例如使用更小的圖片格式

重復的資源文件

存在多個同樣的重復文件。

掃描規則
  • 多個文件MD5一致即判定為重復文件。

可選的修復方式

  • 移除多余的文件
未使用的類Property屬性

ObjC類中定義的屬性沒有被使用到。

掃描規則

  • 對應的屬性沒有被調用 set/get 方法,同時也沒有被_的方式使用

  • 不是來自實現協議的屬性

  • 不是來自Category的屬性

  • 不存在字符串使用和屬性名一致

可選的修復方式

  • 移除對應的屬性

  • 如果是接口協議的屬性,需要添加類實現此接口

注意事項

  • 可能存在部分動態使用的場景,需要進行一定的檢查。例如一些繼承NSObject的數據模型類,可能存在屬性沒有被直接使用到,但是可能會被傳喚成JSON作為參數的情況。例如后臺下發的數據模型
未使用的ImageSet/DataSet

包含的Imageset/DataSet并沒有被使用到。

掃描規則

  • 未檢測到和Imageset同樣名字的字符串使用

可選的修復方式

  • 移除ImageSet/DataSet

注意事項

  • 某些Swift代碼中使用的字符串不能被發現所以會被當做未使用。

  • 使用字符串拼接的名字作為imageset的名字。

  • 被合成到PackedAssetImage里的Imageset不能被掃描出來

未使用的ObjC方法

定義的ObjCCategory 方法并未被使用到。

掃描規則

  • 不存在和此方法一樣的方法名使用

  • 不存在使用的字符串和方法名一致

  • 不是來自父類或Category的方法

  • 不是來自實現接口的方法

  • 不是屬性 set/get 方法

可選的修復方式

  • 移除對應方法
未使用的分類方法

定義的ObjCCategory 方法并未被使用到。

掃描規則

  • 不存在和此方法一樣的方法名使用

  • 不存在和方法名一致的字符串使用

  • 不是來自父類或Category的方法

  • 不是來自實現接口的方法

可選的修復方式

  • 移除未使用的方法

  • 如果是接口協議的方法,需要添加類實現此接口

未使用的資源文件

包含的文件資源并沒有被使用到。這里的資源不包含Imageset/DataSet

掃描規則

  • 未檢測到和文件名同樣名字的字符串使用

可選的修復方式

  • 移除資源

注意事項

  • 某些Swift代碼中使用的字符串不能被發現所以會被當做未使用

  • 使用字符串拼接的名字作為資源的名字

安全

動態反射調用ObjC類

存在類名和字符串一致,可能使用NSClassFromString()方法動態調用類。當字符串或類名變更時無法利用編譯時檢查發現問題,可能會導致功能異常。

掃描規則

  • 存在使用的字符串NSObject子類類名相同

可選的修復方式

  • 使用NSStringFromClass()獲取類名字符串

  • 使用Framework外部的類應該使用方法封裝,除了少部分功能不應該使用反射去調用

提示:包含繼承NSObject的 swift 類。

ObjC屬性內存申明錯誤

一些特殊的NSObject類型的屬性內存類型申明錯誤,可能會導致功能異常或觸發Crash

掃描規則

  • NSArray/NSSet/NSDictionary類型的屬性使用strong申明

  • NSMutableArray/NSMutableSet/NSMutableDictionary類型的屬性使用copy申明

可選的修復方式

  • 修改strong/copy申明
沖突的分類方法

ObjC同一個類的多個Category分類中存在多個相同的方法,由于運行時最終會加載方法可能是不確定的,可能會導致功能異常等未知的行為。

掃描規則

  • NSObject類的多個Category分類中存在多個相同的方法

修復方式

  • 移除多余的分類方法
重復的分類方法

ObjC原始類和類的Category分類中有相同的方法,分類中的方法會覆蓋原始類的方法,可能會導致功能異常等未知的行為。

掃描規則

  • NSObject原始類和類的Category分類中有相同的方法

修復方式

  • 移除重復的分類方法
未實現的ObjC協議方法

類實現了某個ObjC協議,但是沒有實現協議的非可選方法。可能會導致功能異常或觸發Crash

掃描規則

  • 分類未實現NSObject協議的非可選方法

可選的修復方式

  • 對應的類實現缺失的非可選協議方法

  • 將對應的協議方法標識為optional可選方法

重復的ObjC類

多個動態庫靜態庫之間存在同樣的。不會導致編譯失敗,但是運行時只會使用其中一個類,可能會導致功能異常或觸發Crash。同時會增加包體積

掃描規則

  • 多個動態庫靜態庫之間存在同樣的NSObject類符號

可能的修復方式

  • 移除重復的類

性能

使用動態庫

使用動態庫會增加啟動耗時。

掃描規則

  • Macho為動態庫

可選的修復方式

  • 使用靜態庫

  • 使用Mergeable Library

實現+load方法的類

APP啟動后會執行所有+load方法,減少+load方法可以降低啟動耗時。

掃描規則

  • 實現+load方法的NSObject

可選的修復方式

  • 移除+load方法

  • 使用+initialize替代

自定義配置

重要配置

systemFrameworkPaths

可以基于自身項目進行系統庫目錄的配置,解析工程時也會對系統庫進行解析。配置系統庫目錄對于未使用方法的查找可以提供更多的信息避免誤報。但是配置更多會導致執行的更慢,建議至少配置Foundation/UIKit

unusedObjCProperty-enable

unusedObjCProperty規則默認不開啟。

  • 開啟未使用屬性檢查以后,會掃描macho__TEXT段,會增加分析的耗時。
unusedClass-swiftEnable

unusedClass-swiftEnable默認不開啟。

  • 開啟Swift類檢查以后,會掃描macho__TEXT段,會增加分析的耗時。

  • 未使用Swift類的項目建議不要開啟,如果考慮執行性能的話Swift使用相對比較多的再開啟。

提示:掃描macho__TEXT段需要使用XCodeRun編譯出的包,不能直接使用用于上架APP Store構建出的包。主要是Debug會包含更多的信息用于掃描。

配置屬性

/Users/Test/APPAnalyzeCommand -ipa /Users/Desktop/ipas/APPMobile/APPMobile.app -config /Users/Desktop/ipas/config.json --output /Users/Desktop/ipas/APPMobile

可基于自身項目需要,添加下列規則可配置參數。在使用APPAnalyzeCommand指令時添加--config配置文件地址。

{"systemFrameworkPaths": ["/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/UIKitCore.framework/UIKitCore", "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Foundation.framework/Foundation"], // 配置系統庫。會極大增加未使用方法的誤報"rules": {"dynamicCallObjCClass": { // 動態調`ObjC類"enable": false, // 是否啟用"excludeClasslist": [ // 過濾類名"NSObject","param"]},"incorrectObjCPropertyDefine": { // 錯誤的 ObjC 屬性定義"enable": false // 是否啟動},"largeResource": { // 大資源"maxSize": 20480 // 配置大資源判定大小。默認 20480Byte=20KB},"unusedObjCProperty": { // 未使用的 ObjC 屬性"enable": false, // 是否啟用。默認不開啟"excludeTypes": ["NSString", "NSArray", "NSDictionary", "NSNumber", "NSMutableArray", "NSMutableDictionary", "NSSet"] // 過濾掉部分類型的屬性},"unusedClass": { // 未使用的類"swiftEnable": false, // 是否支持 Swift 類。默認不支持"excludeSuperClasslist": ["JDProtocolHandler", "JDProtocolScheme"],// 如果類繼承了某些類就過濾"excludeProtocols": ["RCTBridgeModule"], // 如果類實現了某些協議就過濾"excludeClassRegex": ["^jd.*Module$", "^PodsDummy_", "^pg.*Module$", "^SF.*Module$"] // 過濾掉名字符合正則表達式的類},"unusedObjCMethod": { // 未使用的 ObjC 方法"excludeInstanceMethods": [""], // 過濾掉某些名字的對象方法"excludeClassMethods": [""], // 過濾掉某些名字的類方法"excludeInstanceMethodRegex": ["^jumpHandle_"], // 過濾掉名字符合正則表達式的對象方法"excludeClassMethodRegex": ["^routerHandle_"], // 過濾掉名字符合正則表達式的類方法"excludeProtocols": ["RCTBridgeModule"] // 如果類集成了某些協議就不再檢查,例如 RN 方法},"loadObjCClass": { //  調用 ObjC + load 方法"excludeSuperClasslist": ["ProtocolHandler"], // 如果類繼承了某些類就過濾"excludeProtocols": ["RCTBridgeModule"] // 如果類實現了某些協議就過濾,例如 RN 方法},"unusedImageset": { // 未使用 imageset"excludeNameRegex": [""] // 過濾掉名字符合正則表達式的imageset},"unusedResource": { // 未使用資源"excludeNameRegex": [""] // 過濾掉名字符合正則表達式的資源}}
}

組件化工程掃描

可以基于APPAnalyzeCore.framework定制實現自己的組件化工程掃描,或者添加基于自身組件化工程的檢查規則。詳情可以看Demo

基于組件化掃描方式有以下優勢:

  • 細化數據粒度- 可以細化每個模塊的包體積和包體積問題,更容易進行包體積優化。

  • 更多的檢查- 例如檢查不同組件同一個Bundle包含同名的文件,不同組件包含同一個category方法的的實現。

  • 檢查結果更準確- 例如ObjC未使用方法的檢查,只要存在一個和方法名同樣的調用就表示方法有被使用到。但是整個ipa中可能存在很多一樣的方法名但是只有一個方法有真正被調用到,如果細分到組件的粒度就可以發現更多問題。

提示:只有APP主工程無代碼,全部通過子組件以framework的形式導入二進制庫的方式的工程才適合這種模式。

其他

掃描質量如何

這套工具我們團隊內部開發加逐步完善有一年的時間了。基于此工具修改了幾十個組件的包體積問題,同時不斷的修復誤報問題。目前現有提供的這些規則檢查誤報率是很低的,只有極少數幾個規則可能存在誤報的可能性,總體掃描質量還是很高的。

和社區開源的工具有什么差異

我們在早期調研了社區的幾個同類型的開源工具,主要存在以下幾個問題:

  • 擴展性不夠- 無法支持項目更好的擴展定制能力,例如添加掃描規則、支持不同類型掃描方式、生成更多的報告類型。

  • 功能不全- 只提供部分能力,例如只提供未使用資源或者未使用類

  • 無法生成包體積數據- 無法生成包體積完整的數據。

  • 檢查質量不高- 掃描發現的錯誤數據多,或者有一些問題不能被發現。

開源計劃

后續一定會開源。主要是希望調整一些內部結構再開源,開源后就不方便調整。順便修復一些常見的問題。

開源帶來的好處

開源帶來的好處是,部分工程可以基于自身的業務需要,擴展定制自己的掃描工具。同時也可以將一些更好的想法實現添加進來。

  • 擴展解析方式- 目前只支持ipa模式掃描,很快會開放支持project組件化工程的掃描方式。基于組件化工程的掃描可以更加準確,但是不同的公司組件化工程的構建方式可能是不一樣的,有需要可以在上層定制自身組件化工程的掃描解析。

  • 擴展掃描規則- 雖然現在已經添加了比較多的通用性的規則,同時提供了一定的靈活性配置能力。但是不同的項目可能需要定制一些其他的規則,這些規則沒辦法通過在現有規則上添加配置能力實現。

  • 擴展數據生成- 默認包里只包含兩種數據生成,包體積數據還有包體積待修復問題數據。可以擴展更多的數據生成格式,例如我們自身的項目就有添加基于組件的依賴樹格式。

后續規劃

組件化工程支持

添加更多用于組件化工程的掃描

對于 Swift 更好的支持

對于Swift語言只要開啟XCode編譯優化以后就能在生成產物的時候支持無用代碼的移除,包括未使用類型未使用方法的自動移除,但是依然有部分場景不會進行優化。所以這一塊也是后續完善的重點:

  • 未使用屬性- 編譯器不會對于未使用屬性進行移除,包括classstruct的屬性。

  • 未使用方法- 對于class的方法,編譯器并不會進行移除,即使沒有申明[@objc](https://my.oschina.net/TnhqVdFXL8vnu)進行消息派發。

相關鏈接

  • Github地址

作者:京東零售 何驍

來源:京東云開發者社區 轉載請注明來源

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165778.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165778.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165778.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeeCode前端算法基礎100題(4)- 無重復字符的最長子串

一、問題詳情&#xff1a; 給定一個字符串 s &#xff0c;請你找出其中不含有重復字符的 最長子串 的長度。 示例 1: 輸入: s "abcabcbb" 輸出: 3 解釋: 因為無重復字符的最長子串是 "abc"&#xff0c;所以其長度為 3。示例 2: 輸入: s "bbbbb…

在VMware Workstation的Centos上實現KVM虛擬機的安裝部署:詳細安裝部署過程(保姆級)

KVM概述 ? 以色列qumranet公司研發&#xff0c;后被RedHad公司收購 &#xff08;1&#xff09;kvm只支持x86平臺 &#xff08;2&#xff09;依賴于 HVM,inter VT AMD-v ? KVM是&#xff08;Kernel-based Virtual Machine&#xff09;的簡稱&#xff0c;是一個開源的系統虛擬…

Spark---補充算子

一、Spark補充Transformation算子 1、join,leftOuterJoin,rightOuterJoin,fullOuterJoin 作用在K&#xff0c;V格式的RDD上。根據K進行連接&#xff0c;對&#xff08;K&#xff0c;V&#xff09;join&#xff08;K&#xff0c;W&#xff09;返回&#xff08;K&#xff0c;&a…

世界復合醫學雜志世界復合醫學雜志社世界復合醫學編輯部2023年第8期目錄

論著 能譜&#xff08;Revolution&#xff09;CT胸腹聯合胸痛三聯CTA掃描對急性胸痛患者疾病的差異分析 左明飛;溫麗娟;焦宇; 1-38 超聲引導下肩袖間隙注射及肩胛上神經阻滯聯合觸發點針刺治療粘連性肩關節囊炎的療效分析 余菲;王嫻;戴甫成;張維;劉武;孫勇; 4-8 神…

python tkinter 使用(六)

python tkinter 使用&#xff08;六&#xff09; 本文主要講述tkinter中進度條的使用。 1:確定的進度條 progressbar tkinter.ttk.Progressbar(root, mode"determinate", maximum100, value0) progressbar.pack()def updateProgressBar():for i in range(100):pr…

【Unity】 UGUI的PhysicsRaycaster (物理射線檢測)組件的介紹及使用

1. 什么是PhysicsRaycaster組件&#xff1f; PhysicsRaycaster是Unity UGUI中的一個組件&#xff0c;用于在UI元素上進行物理射線檢測。它可以檢測鼠標或觸摸事件是否發生在UI元素上&#xff0c;并將事件傳遞給相應的UI元素。 2. PhysicsRaycaster的工作原理 PhysicsRaycast…

【Proteus仿真】【51單片機】智能垃圾桶設計

文章目錄 一、功能簡介二、軟件設計三、實驗現象聯系作者 一、功能簡介 本項目使用Proteus8仿真51單片機控制器&#xff0c;使用報警模塊、LCD1602液晶模塊、按鍵模塊、人體紅外傳感器、HCSR04超聲波、有害氣體傳感器、SG90舵機等。 主要功能&#xff1a; 系統運行后&#xf…

基于GPRS的汽車碰撞自動報警系統(論文+源碼)

1. 系統設計 本次基于GPRS的汽車碰撞自動報警系統的設計中&#xff0c;其主要的目標功能如下&#xff1a;1、實時檢測當前的GPS精度和緯度坐標&#xff1b;2.當發生碰撞后系統自動將當前的信息通過GPRS數據發送到遠端數據進行報警&#xff1b;3、系統在碰撞后一方面進行本地報警…

聽GPT 講Rust源代碼--src/tools(2)

題圖來自AI生成 File: rust/src/tools/rust-analyzer/crates/hir-def/src/src.rs rust-analyzer 是一個 Rust 語言的語法分析器和語義分析器&#xff0c;用于提供代碼補全、導航、重構等開發工具。而 rust-analyzer 的代碼實現存儲在 rust/src/tools/rust-analyzer 這個文件夾中…

010 OpenCV中的4種平滑濾波

目錄 一、環境 二、平滑濾波 2.1、均值濾波 2.2、高斯濾波 2.3、中值濾波 2.4、雙邊濾波 三、完整代碼 一、環境 本文使用環境為&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、平滑濾波 2.1、均值濾波 在OpenCV庫中&#xff0c;blur函數是一種簡…

遞歸剪枝題

期中考終于考完了&#xff0c;整道題獎勵下自己 我一北大同學問我的&#xff0c;說他遞歸超時了&#xff0c;叫我想一個辦法 后面他說他加了個剪枝就過了&#xff0c;然后我自己嘗試了一個方法&#xff1a; 就是先把城市按1到n排列&#xff0c;然后考慮互換&#xff0c;如果互…

考過了PMP,面試的時候應該怎么辦?

近期喜番在后臺收到了很多同學們的私信&#xff0c;表示自己已經過了8月份的PMP考試&#xff0c;開始著手往項目管理崗位轉型&#xff0c;但是對于項目管理崗位的面試卻一籌莫展。放輕松&#xff0c;大家的需求喜番都了解了&#xff0c;喜番給大家總結了一些項目經理在面試的時…

SpringCloud 微服務全棧體系(十七)

第十一章 分布式搜索引擎 elasticsearch 七、搜索結果處理 搜索的結果可以按照用戶指定的方式去處理或展示。 1. 排序 elasticsearch 默認是根據相關度算分&#xff08;_score&#xff09;來排序&#xff0c;但是也支持自定義方式對搜索結果排序。可以排序字段類型有&#…

【Python】Fastapi swagger-ui.css 、swagger-ui-bundle.js 無法加載,docs無法加載,redocs無法使用

使用fastapi的時候&#xff0c;swagger-ui.css 、swagger-ui-bundle.js、redoc.standalone.js 有時候無法加載&#xff08;國內環境原因或者是局域網屏蔽&#xff09;&#xff0c;此時就需要自己用魔法下載好對應文件&#xff0c;然后替換到fastapi里面去。 fastapi里面依靠這…

計算機視覺(CV)技術的優勢:

計算機視覺&#xff08;CV&#xff09;技術的優勢&#xff1a; 自動化&#xff1a;計算機視覺技術可以自動化處理大量的視覺數據。 精度和速度&#xff1a;計算機視覺技術可以在很短的時間內對大量的圖像數據進行處理&#xff0c;并且可以達到非常高的精度。 可靠性&#xff…

【微軟技術棧】使用(TAP)基于任務的異步模式

本文內容 使用 Await 掛起執行取消異步操作監視進度使用內置的基于任務的連結符構建基于任務的連結符構建基于任務的數據結構 c#使用基于任務的異步模式 (TAP) 處理異步操作時&#xff0c;可以使用回叫實現等待&#xff0c;而不會阻塞。 對于任務&#xff0c;這可通過 Task.C…

java學習part07數組工具類

1比較內容 2輸出信息 3值填充 4快速排序 5二分查找 負數沒找到&#xff0c;其他表示下標

ES6 — ES14 新特性

一、ES6 新特性&#xff08;2015&#xff09; 1. let和const 在ES6中&#xff0c;新增了let和const關鍵字&#xff0c;其中 let 主要用來聲明變量&#xff0c;而 const 通常用來聲明常量。let、const相對于var關鍵字有以下特點&#xff1a; 特性varletconst變量提升??全局…

【漏洞復現】金蝶云星空管理中心 ScpSupRegHandler接口存在任意文件上傳漏洞 附POC

漏洞描述 金蝶云星空是一款云端企業資源管理(ERP)軟件,為企業提供財務管理、供應鏈管理以及業務流程管理等一體化解決方案。金蝶云星空聚焦多組織,多利潤中心的大中型企業,以 “開放、標準、社交”三大特性為數字經濟時代的企業提供開放的 ERP 云平臺。服務涵蓋:財務、供…

什么是切片

切片&#xff0c;是一個比較生疏的名詞&#xff0c;這是現代計算機編程語言或者說Python里的一個概念&#xff0c;大致意思是從一個集合里切出一塊來&#xff0c;就像切一塊豆腐&#xff0c;一刀下去切出兩塊豆腐 先看一個函數range、返回值是列表&#xff0c;內容和傳入range…