cf辅助网站源码分享大全,cf辅助网站源码分享大全最新

大家好,今天给各位分享cf辅助网站源码分享大全的一些知识,其中也会对cf辅助网站源码分享大全最新进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

一.前言

本篇文章重点介绍HEIC图片和无用类检测的优化实践。HEIC是HighEfficiencyImageFormat(高效图像格式)的缩写,是一种新的图像文件格式,它是2017年苹果公司在iOS11中引入,用于代替JPEG图像格式,以更高效地压缩图像并减少存储空间占用。HEIC支持多帧图像、透明度和16位深度色彩,使得它成为高质量图像和动画的理想选择。本文重点探究HEIC图片在百度APP中使用的可行性和包体积收益,验证HEIC图片在Bundle和AssetCatalog的兼容性,重点研究了AssetCatalog管理图片的机制,记录了验证过程中发现的特殊问题和解决思路。无用类则是详细介绍了如何用静态分析和动态分析相结合的方式,精简代码体积。

测试环境

基本工具

xcode:Version14.1(14B47b)

sips、convert:图片格式转换工具

Mac:macOS12.5(21G72)

actool:AssetCatalog内图片打包工具

iPhone:iOS10及以上系统

assetutil:car文件解析工具

二.HEIC图片格式转换和使用方式

丨2.1格式转换

有三种常见的HEIC图片转换方式:Mac图片转换功能、Mac自带sips命令、多平台支持的ImageMagick命令。

丨2.1.1Mac图片转换功能:

右键图片,快速操作—>转换图像格式选HEIF,图像大小根据需求选择

丨2.1.2sips工具:

sips是一个MacOS自带的命令行的图片处理工具,具有转换图片格式、修改图片大小(扩充或者重新采样缩小图片)、修改质量,设置版权信息等功能。

举例:sips-sformatheic-sformatOptionsdefaultguideview@3x.png–outguideview@3x.heic

丨2.1.3ImageMagick工具:

ImageMagick包括一个用于执行复杂图像处理任务的命令行界面,以及用于将其功能集成到软件应用程序中的API。它是用C编写的,可以在各种操作系统上使用,包括Linux、Windows和macOS。

用法参考:https://imagemagick.org/index.php

需要手动安装:

brewinstallimagemagick

convertguideview@3x.pngguideview@3x.heic

丨2.2HEIC在iOS中使用

在iOS系统中,ImageIO、CoreImage、UIKit、PhotoKit都支持HEIC图片。HEIC图片可以放Bundle里也可以放AssetCatalog里。使用原生方法就可以创建UIImage对象,和JPEG、PNG等图片使用方式一致。

//加载本地图片\nUIImage*image=[UIImageimageNamed:@&34;];\nUIImage*image=[UIImageimageWithContentsOfFile:filePath];\n\n\n//由网络请求的NSData解码\nUIImage*image=[UIImageimageWithData:heifImageData];

丨2.3HEIC图片兼容性

编码:

硬编:A10及以上芯片iOS设备(iPhone7)

解码:

硬解:A9及以上芯片iOS设备(iPhone6s),配备6代及以上InterCore处理(Skylake)。

软解:iOS12和macOS支持软解码,(官方说是iOS11,实测iOS11并不能解码)

可以调用ImageI/O相关函数获取支持的图片编解码支持的格式,这里值得注意的是,在iPhone6p,iOS11.0.4实测不支持HEIC,即调用CGImageSourceCopyTypeIdentifiers();查询可解码格式包含public.heic,依旧是无法正常显示出HEIC图片;在iPhone6p,iOS12.5.6测试机上可以正常显示HEIC图片。

//获取所支持的图片格式数组,解码\nCFArrayRefdecodeArr=CGImageSourceCopyTypeIdentifiers();\nNSArray*decodeUTI=(__bridgeNSArray*)decodeArr;\nNSLog(@&34;,decodeUTI);\n\n\n//获取所支持的图片格式数组,编码\nCFArrayRefencodeArr=CGImageDestinationCopyTypeIdentifiers();\nNSArray*encodeUTI=(__bridgeNSArray*)encodeArr;\nNSLog(@&34;,encodeUTI);

百度APP最低支持的系统版本是iOS10,iOS10的5s和iPhone6、iPhone6p无法直接解码HEIC图片,这三款机型会受到影响。但是这并不意味着这些机型不能兼容HEIC图片。常规思路是引入三方SDK,如:SDWebImageHEIFCoder(https://github.com/SDWebImage/SDWebImageHEIFCoder),增加解码支持,不过引入三方SDK变相增加了包体积,顾此失彼。在测试中发现,将HEIC图片放入AssetCatalog管理,是可以在上述三款机型上正常显示图片的。

三.Bundle和AssetCatalog的兼容性

在iOS系统中,APP内的图片资源可以放Bundle和AssetCatalog。若图片放Bundle中,ipa包安装到设备上后,图片占用的磁盘空间和图片实际大小一致。不过放Bundle的缺点是需要针对不同分辨率的进行放不同大小的倍图,明显增加了包体积。

苹果推荐使用AssetCatalog管理内置资源,包括图片资源、音视频等,同样也支持HIEC图片。AssetCatalog的好处显然易见,支持appslicing、支持设置拉伸区域、给不同的机型配置不同的图片、配置渲染颜色等。最终所有的文件最终会打包成.car压缩文件。

对此,我们选择了两张具有代表性的图片,log.png是带有Alpha通道的图片和guideview@3x.png是不带Alpha通道的图片。然后分别生成对应的HEIC图片log.heic和guideview@3x.heic,图片没有经过任何其余压缩处理。

guideview@3x.png

log.png

丨3.1生成car文件

从Xcode编译的log中发现,系统使用自有actool工具对workspace内所有的.xcassets压缩生成一个.car文件,对于Xcode是否连接测试机,编译Assets.car的参数又有所不同。

对于未连接测试机,选择AnyiOSDevice(arm64),生成通用的Assets.car文件,编译参数如下:

//AnyiOSDevice(arm64)\n/Applications/Xcode.app/Contents/Developer/usr/bin/actool–output-formathuman-readable-text–notices–warnings–export-dependency-info/Users/xxxxx/Library/Developer/Xcode/DerivedData/ImageDemoS-auwsocxqgbwbgmfoiguzuahzizre/Build/Intermediates.noindex/ImageDemoS.build/Debug-iphoneos/ImageDemoS.build/assetcatalog_dependencies–output-partial-info-plist/Users/xxxxx/Library/Developer/Xcode/DerivedData/ImageDemoS-auwsocxqgbwbgmfoiguzuahzizre/Build/Intermediates.noindex/ImageDemoS.build/Debug-iphoneos/ImageDemoS.build/assetcatalog_generated_info.plist–app-iconAppIcon–accent-colorAccentColor–compress-pngs–enable-on-demand-resourcesYES–development-regionen–target-deviceiphone–target-deviceipad–minimum-deployment-target16.0–platformiphoneos–compile/Users/xxxxx/Library/Developer/Xcode/DerivedData/ImageDemoS-auwsocxqgbwbgmfoiguzuahzizre/Build/Products/Debug-iphoneos/ImageDemoS.app/Users/xxxxxR/baidu/personal-code/ImageDemoS/ImageDemoS/Assets.xcassets/Users/xxxxx/baidu/personal-code/ImageDemoS/Media.xcassets

若连接了测试机,则根据测试机的机型和系统生成对应的Assets.car文件。关键参数–filter-for-thinning-device-configurationiPhone7,1–filter-for-device-os-version11.4.1,这两个参数可以解释HEIC图片在iOS11的iPhone6p上的兼容性问题。实测中发现HEIC图片放AssetCatalog中,实际上是可以在iOS11的iPhone6p上显示的,只不过这时候AssetCatalog里的图片已经不是HEIC编码了。具体的编译参数如下:

//iPhone6p(iOS11.4.1)\n/Applications/Xcode.app/Contents/Developer/usr/bin/actool–output-formathuman-readable-text–notices–warnings–export-dependency-info/Users/xxxxx/Library/Developer/Xcode/DerivedData/ImageDemoS-auwsocxqgbwbgmfoiguzuahzizre/Build/Intermediates.noindex/ImageDemoS.build/Debug-iphoneos/ImageDemoS.build/assetcatalog_dependencies–output-partial-info-plist/Users/xxxxx/Library/Developer/Xcode/DerivedData/ImageDemoS-auwsocxqgbwbgmfoiguzuahzizre/Build/Intermediates.noindex/ImageDemoS.build/Debug-iphoneos/ImageDemoS.build/assetcatalog_generated_info.plist–app-iconAppIcon–accent-colorAccentColor–compress-pngs–enable-on-demand-resourcesYES–optimizationspace–filter-for-thinning-device-configurationiPhone7,1–filter-for-device-os-version11.4.1–development-regionen–target-deviceiphone–target-deviceipad–minimum-deployment-target9.0–platformiphoneos–compile/Users/xxxxx/Library/Developer/Xcode/DerivedData/ImageDemoS-auwsocxqgbwbgmfoiguzuahzizre/Build/Products/Debug-iphoneos/ImageDemoS.app/Users/xxxxx/baidu/personal-code/ImageDemoS/ImageDemoS/Assets.xcassets/Users/xxxxx/baidu/personal-code/ImageDemoS/Media.xcassets

同时我们发现,使用actool工具对.xcassets进行处理时,会出现以下warning,而不是error。从actool给的警告信息看,HIEC图片只在iOS11以后的系统上被支持,但是在生成Asset.car文件时,actool工具会根据指定的最小系统版本,对iOS11以下的机型生成兼容的图片,虽然图片体积可能有所变大,但是HIEC图片在AssetCatalog中对所有机型兼容。而HIEC图片放Bundle则无法兼容iOS11以下系统。进一步证明了actool自己对HEIC图片兼容性的处理。

/*com.apple.actool.document.warnings*/\n/Media.xcassets:./logHEICAlpha.imageset/[universal][][][3x][][][][][][][][][][]:warning:You&34;AssetType&34;Image&34;BitsPerComponent&34;ColorModel&34;RGB&34;Colorspace&34;srgb&34;Compression&34;deepmap2&34;Encoding&34;ARGB&34;Name&34;logPNGAlpha&34;NameIdentifier&34;Opaque&34;PixelHeight&34;PixelWidth&34;RenditionName&34;log.png&34;Scale&34;SizeOnDisk&34;TemplateMode&34;automatic&34;AssetType&34;Image&34;BitsPerComponent&34;ColorModel&34;RGB&34;DeploymentTarget&34;2017&34;Encoding&34;HEIF&34;Name&34;logHEICAlpha&34;NameIdentifier&34;Opaque&34;PixelHeight&34;PixelWidth&34;RenditionName&34;log.heic&34;Scale&34;SizeOnDisk&34;TemplateMode&34;automatic&34;AssetType&34;Image&34;BitsPerComponent&34;ColorModel&34;RGB&34;Colorspace&34;srgb&34;Compression&34;jpeg-lzfse&34;Encoding&34;ARGB&34;Name&34;logHEICAlpha&34;NameIdentifier&34;Opaque&34;PixelHeight&34;PixelWidth&34;RenditionName&34;log.heic&34;Scale&34;SizeOnDisk&34;TemplateMode&34;automatic&34;AssetType&34;Image&34;BitsPerComponent&34;ColorModel&34;RGB&34;Colorspace&34;srgb&34;Compression&34;deepmap2&34;Encoding&34;ARGB&34;Name&34;guideviewPNG&34;NameIdentifier&34;Opaque&34;PixelHeight&34;PixelWidth&34;RenditionName&34;guideview@3x.png&34;Scale&34;SizeOnDisk&34;TemplateMode&34;automatic&34;AssetType&34;Image&34;BitsPerComponent&34;ColorModel&34;RGB&34;DeploymentTarget&34;2017&34;Encoding&34;HEIF&34;Name&34;guideviewHIEC&34;NameIdentifier&34;Opaque&34;PixelHeight&34;PixelWidth&34;RenditionName&34;guideview@3x.heic&34;Scale&34;SizeOnDisk&34;TemplateMode&34;automatic&34;AssetType&34;Image&34;BitsPerComponent&34;ColorModel&34;RGB&34;Colorspace&34;srgb&34;Compression&34;lzfse&34;Encoding&34;RGB555&34;Name&34;guideviewHIEC&34;NameIdentifier&34;Opaque&34;PixelHeight&34;PixelWidth&34;RenditionName&34;guideview@3x.heic&34;Scale&34;SizeOnDisk&34;TemplateMode&34;automatic&imagedescription34;\\n&34;=====%@=====\\n&34;CGImageGetHeight:%d\\n&34;CGImageGetWidth:%d\\n&34;CGImageGetColorSpace:%@\\n&34;CGImageGetBitsPerPixel:%d\\n&34;CGImageGetBitsPerComponent:%d\\n&34;CGImageGetBytesPerRow:%d\\n&34;CGImageGetBitmapInfo:0x%.8X\\n&34;kCGBitmapAlphaInfoMask=%s\\n&34;kCGBitmapFloatComponents=%s\\n&34;kCGBitmapByteOrderMask=%s\\n&34;kCGBitmapByteOrderDefault=%s\\n&34;kCGBitmapByteOrder16Little=%s\\n&34;kCGBitmapByteOrder32Little=%s\\n&34;kCGBitmapByteOrder16Big=%s\\n&34;kCGBitmapByteOrder32Big=%s\\n&34;YES&34;NO&34;YES&34;NO&34;YES&34;NO&34;YES&34;NO&34;YES&34;NO&34;YES&34;NO&34;YES&34;NO&34;YES&34;NO&34;PixelData:\\n&34;(&34;%.2d&34;,&34;)&34;,&34;\\n&34;ImagesourceisNULL.&34;Imagenotcreatedfromimagesource.&imagedescriptionpathdescription34;public.heic&34;无法编码&获取Mach-O架构\nMach-O64-bitexecutablearm64\n\n\n%otool-archarm64-oVBaiduBoxApp.app/BaiduBoxApp>ovrelease.txt39;Contentsof(__DATA,__objc_classlist)section&classlist节标识\n&39;,39;Contentsof(__DATA,__objc_superrefs)section&父类节标\n&39;,39;Contentsof(__DATA,__objc_protolist)section&39;Contentsof(__DATA,__objc_selrefs)section&39;Contentsof(__DATA,__objc_imageinfo)section&defineRW_INITIALIZED(1<<29)\n\n\nstructobjc_class:objc_object{\n\n\nboolisInitialized(){\nreturngetMeta()->data()->flags&RW_INITIALIZED;\n}\n};

以上摘取objc-runtime源码中,objc_class结构下获取当前类是否已被初始化的函数。但在应用中,我们无法直接调用类结构体中的函数,所以在百度APP工程中,自定义与系统类相同的结构体,并实现相应isInitialized()函数。通过赋值转换,我们可以拿到指定类对应meta-class中的数据,即可以判断指定类是否在当前生命周期中是否被初始化过(被使用过)。

丨8.1技术实现

1.模仿objc_class实现自定义结构体,用于获取指定类结构体内部数据

if__arm64__\nelif__x86_64__\nendif\n\n\nstructlazyFake_objc_class:lazyFake_objc_object{\n//提供metaClass函数,获取元类对象\nlazyFake_objc_class*metaClass(){\nelse\nreturn(lazyFake_objc_class*)((longlong)isa);\n#endif\n}\nboolisInitialized(){\nreturnmetaClass()->data()->flags&RW_INITIALIZED;\n}\n};

2.首先获取百度APP工程中所有自定义OC类

Dl_infoinfo;\ndladdr(&_mh_execute_header,&info);\nclasses=objc_copyClassNamesForImage(info.dli_fname,&classCount);

3.遍历自定义类,并逐个对其进行赋值转换为自定义结构体,并通过自定义类结构方法,获取当前类是否被初始化过。

structlazyFake_objc_class*objectClass=(__bridgestructlazyFake_objc_class*)cls;\n\n\nBOOLisInitial=objectClass->isInitialized();

九.总结

HEIC图片相较于PNG,对部分图片可以降低图片体积,收益从10%-70%不等,具体问题具体分析,编写githook检查脚本提供指导;HEIC图片放AssetCatalog可以兼容iOS10以上的所有机型和系统;HEIC图片放Bundle只能在iOS12系统上解码,这个和Apple给出的结论相悖。若APP最低支持系统小于iOS12,则HEIC图片禁止放Bundle。A9以上芯片的机型为硬解,速度更快;带有Alpha通道的PNG图片,未经过pngquant有损压缩的,利用sips命令直接转HEIC图片可以正常显示;带有Alpha通道的PNG图片,已经被pngquant有损压缩过的在iOS12,13,14系统上会显示绿幕,iOS115,iOS16显示正常。虽然显示正常,但是RGB位图颜色解码错误,只是因为alpha为0,绿色变成了透明;无论是PNG还是HEIC图片,在AssetCatalog管理下,打包生成的体积和原图片不同,都会经过不同的处理压缩,可能变大也可能变小,以最终产物为准;pngquant适合对Bundle里的PNG压缩,获取收益,对AssetCatalog里的图片不应该处理,因为这个收益其实是有损压缩获取的,并且会导致压缩过的带Alpha通道的PNG无法转HEIC;无用类检测结合动态检测和静态检测,检测较为严格,主要是为了降低误报率,降低对RD的影响,实际操作过程中发现有些无用类会被漏检。准确度和覆盖度需要根据需求动态调整;

十.参考文献

[1]、503_WWDC2017CMF_03_D:https://devstreaming-cdn.apple.com/videos/wwdc/2017/503i6plfvfi7o3222/503/503_introducing_heif_and_hevc.pdf

[2]、iOS代码瘦身实践:删除无用的类:httpshttps://juejin.cn/post/6844903922201526285

作者:TXT

来源:微信公众号:百度App技术

出处:https://mp.weixin.qq.com/s/PU5rC0U0XZ1VYqLWSUBWLQ

好了,文章到这里就结束啦,如果本次分享的cf辅助网站源码分享大全和cf辅助网站源码分享大全最新问题对您有所帮助,还望关注下本站哦!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平