iOS
    一.图片
    1.优先考虑图片转在线加载,图片管理系统(新地址:http://channelcms.jd.com/)使用文档:https://cf.jd.com/pages/viewpage.action?pageId=201974972。或者使用ImageProcess:[https://3.cn/107jTw-Tn](https://3.cn/107jTw-Tn),有条件的也可以直接使用对象存储:[http://oss.jd.com/](http://oss.jd.com/)。
    2.对于无法转下载的大图:大图千万不要放到Assets里面!大图千万不要放到Assets里面!大图千万不要放到Assets里面!处理方式如下:

    • 使用webp格式,webp转换工具:https://3.cn/107jTw-Tn,适合背景图,只保留一种分辨率。从10.0.4 支持webp本地图片使用, 同步调用:syncDecodeImageWith,异步调用:asyncDecodeImageWith。 如果webp格式无法优化请参考以下措施。
    • 无alpha通道的图片转成jpg格式,使用mac自带的图片”预览“-导出jpg格式,可以适当降低质量,
    • 有alpha通道的图片使用https://tinypng.com/压缩后,放到.bundle中再使用。注意:不要放到根路径下,bundle中2x,3x只保留一种分辨率的图片,bundle中的图片不会根据设备分发的。
    • 适合拉伸的图片可以切成小图拉伸使用,如聊天泡泡。

    3.对于无法转下载的小图:一定要放到Assets中!有两个优点:

    • 最低支持版本为iOS9后,Xcode打包的时候会将若干小图合并成一张大图,节省空间。如:

    • Assets中的图片会根据设备进行分发。

    4.小图标可以在iconFont中查询是否有可替换的图标(返回、箭头、关闭等基础图标尽量统一):http://cf-pmp.jd.com/pages/viewpage.action?pageId=153427720
    二.文本类文件(json、js、html…)
    主APP中文本类文件存在以下问题:
    1.数量多,缺乏高效的组织方式:因磁盘最小存储单位为4K,即使只有几个字节的文件也会占用4K的大小,文件多同样占用空间。
    2.无压缩:这类文件现在基本没有压缩,但此类文件压缩率比较高,压缩后需要自己解压性能不佳,而且没有缓存。
    解决方案:Asset托管,可以大大提高IO效率,经测试读取700K文件,耗时<10ms (iPhoneX,iOS14.6)。

    1. //读取数据 NSDataAsset *asset = [[NSDataAsset alloc] initWithName:@"Data Set Name"]; //获取字符串 NSString *s = [[NSString alloc] initWithData:asset.data encoding:NSUTF8StringEncoding]; //获取字典 NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:asset.data options:NSJSONReadingMutableContainers error:nil];<br />三.代码<br />有目标地优化,查看各个类的大小的方法:<br />size 命令 + 静态库路径 > 路径/temp.txt 导出静态库中各个目标文件(.o)的大小,dec段即大小。 可以将temp.txt中的内容复制到excel中对dec段排序。如:"size /Users/rong/Documents/jd/JDDebugLoggerModule/Example/Pods/JDBBusinessFoundationModule/JD_vendored_libs/JDBBusinessFoundationModule_2.15.54/Release/JDBBusinessFoundationModule.framework/Versions/A/JDBBusinessFoundationModule > /Users/rong/Desktop/test/temp.txt"<br />1.和产品梳理下线不使用、使用频率低、ab测试的功能,效果最好。<br />2.删除重复代码,如重复类库,Category。尽量复用主站已有的公共库。<br />3.删除无用代码。<br />4.尽量少使用属性,编译器会生成setter,getter方法。可以直接使用成员变量。<br />5.减少使用block。<br />6.预处理,特别容易出问题(可以使用XCode预处理工具(Editor-Assistant-Preprocess)查看预处理后的代码):
    • 宏定义/内联函数,不要定义函数体、复杂逻辑代码。
    • 函数实现不要写到头文件中,import一次复制一次。
    • import的时候注意不要import .m文件。

    7.入口深的页面使用后装RN,h5,小程序,动态化等方案实现需求。
    四.优化效果验证
    动态库代码大小:size命令+动态库路径(arm64下dec字段):

    静态库代码大小:
    计算工具:http://bamboo.jd.com/,打包后查看模块大小。
    资源文件大小计算,详细数据工具:https://3.cn/102fOho-O
    Android
    一.资源文件
    1.非重点功能图片优先考虑转在线加载,图片管理系统使用文档:https://cf.jd.com/pages/viewpage.action?pageId=201974972
    2.小图标可以在iconFont中查询是否有可替换的图标(返回、箭头、关闭等基础图标尽量统一):http://cf-pmp.jd.com/pages/viewpage.action?pageId=153427720
    3.不包含Alpha通道的图片可以转webp格式:资源右键——>Convert to WebP 需要验证Api16、17版本上显示效果,待最低版本升级到18以后可尝试大量转为webP。部分大图可针对16、17版本进行降级,高版本使用webP格式。
    4.使用一套xhdpi图片,对图片资源压缩,未转png则统一压缩为8-bit图片。
    5.无用资源扫描、assets大文件认领,确认所属人及用途,对无用资源进行下线。
    6.其他资源文件:

    • 转在线加载
    • 压缩文本文件(txt,json,js,html,css)

    二.代码
    1.和产品梳理下线不使用、使用频率低、ab测试的功能,效果最好。
    2.删除重复代码,公共逻辑替换为统一组件或公共方法。
    3.扫描删除无用代码。
    4.keep代码最小集,不要全包名keep,针对需要的类进行keep。
    5.入口深的页面使用后装RN,h5,小程序,动态化等方案实现需求。
    三.优化效果验证
    基于master分支构建出安装包,拖到Android Studio里,查看lib>armeabi-v7a目录里对应so的大小,其中文件名以 libcom.jd.lib开头的是插件,其它的是动态库。

    JDReact
    1.后装(升级)逻辑说明

    • 预下载强制升级:打开APP即下载升级包,适合2级页面或者高访问量的页面使用。
    • 非预下载强制升级:进到页面后,如果版本已经最新的直接展示,如果不是最新的版本,等待下载完成展示,有三次重试机会,下载失败如有h5兜底走兜底,如没有兜底显示错误提示和重试按钮,适合3级以上页面使用。
    • 非强制升级:进入页面展示本地最新的版本或者h5兜底页面,同时触发下载最新的版本(如果有的话),新版本下载后不会刷新。适合3级以上页面使用。

    2.模块大小计算说明,该模块占用磁盘空间大小(Appstore显示的大小也是磁盘空间),查看方式:Mac环境,右键-显示简介-大小-磁盘上的xx M。附 iOS V10.0.0版本RN包https://3.cn/1-01MyMy8。因为在iOS中磁盘空间最小存储单元是4KB,所以即使只有1KB的图片,占用的空间是4KB,所以除了压缩图片,减少图片数量也很重要。
    3.JDReact资源文件假删除问题:在工程中删除的资源文件最终集成到主站不会被删除,需要主站清理安装包后重新集成(这个是个坑)。如果修改了资源文件路径,最终可能有两份拷贝。可以对比下工程中和安装包内的资源文件,如果需要清理,在joyspace中登记。
    4.JDReact转h5(兜底页):后装的RN模块的兜底页可以采用RN转Web的方式得到兜底H5页面,复杂页面可以适当做一些功能上的降级。文档:https://cf.jd.com/pages/viewpage.action?pageId=96693338