布景

所开发的 App 包巨细达到了 230M+,下载缓慢,并且运用数据下载较费事。

为什么要优化包巨细?

首先是 Apple Store 数据下载的约束;

另外无非便是包大了,用户不愿意下载了,空间不足的时分要删去 App 第一个想到的便是删去大的 App。

怎么优化?

1. 删去无用类、无用图片

由于项目经过两次重构、多次 UI 替换,导致许多无用类和无用图片未铲除。

  1. 删去无用图片资源,能够运用 LSUnusedResources

  2. 剖析无用类,能够经过 AppCode 里的 Code->Inspect Code 进行静态剖析;或者是找一些脚本

需求留意的是:东西可能会误判,一定要经过二次承认再去删去,防止铲除后影响正常业务。

2. 重复代码抽离

举例:音讯 encode、decode 重构

原先音讯基类 messageContent 的公有特点,都需求在子类中 encode 和 decode 处理一遍,书写费事,并且代码冗余。

encode 和 decode 进行重构优化,子类只需求在 encode 的时分调用 super,然后将子类特有的值塞到 dict 中回来即可,在 decode 的时分从 dict 中取出特有的值运用即可。

优化结果

App 层 + SDK 层总计近 100 种音讯,每个基于 MessageContent 的子类重复代码削减约 40 行,每个基于 MediaMessageContent 的子类重复代码再削减 11 行,大约削减 4000+ 行冗余代码,极大程度地削减新建音讯子类的代码以及时间。

修正前子类代码:

///将音讯内容编码成json
- (NSData *)encode {
  NSMutableDictionary *dataDict = [NSMutableDictionary dictionary];
  [dataDict setObject:self.content forKey:@"content"];
  if (self.extra) {
    [dataDict setObject:self.extra forKey:@"extra"];
  }
  if (self.senderUserInfo) {
    [dataDict setObject:[self encodeUserInfo:self.senderUserInfo] forKey:@"user"];
  }
  if (self.mentionedInfo) {
    [dataDict setObject:[self encodeMentionedInfo:self.mentionedInfo] forKey:@"mentionedInfo"];
  }
  NSData *data = [NSJSONSerialization dataWithJSONObject:dataDict options:kNilOptions error:**nil**];
  return data;
}
///将json解码生成音讯内容
- (void)decodeWithData:(NSData *)data {
  if (data) {
    __autoreleasing NSError *error = nil;
    NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
    if (dictionary) {
      self.content = dictionary[@"content"];
      self.extra = dictionary[@"extra"];
      NSDictionary *userinfoDic = dictionary[@"user"];
      [self decodeUserInfo:userinfoDic];
      NSDictionary *mentionedInfoDic = dictionary[@"mentionedInfo"];
      [self decodeMentionedInfo:mentionedInfoDic];
    }
  }
}

修正后子类代码:

- (NSMutableDictionary *)encodeDict {
  NSMutableDictionary *dataDict = [super encodeDict];
  [dataDict setObject:self.content forKey:@"content"];
  return dataDict;
}
- (NSDictionary *)decodeWithData:(NSData *)data {
  NSDictionary *dictionary = [super decodeWithData:data];
  self.content = dictionary[@"content"];
  return dictionary;
}

3. 图片资源紧缩

图片资源运用 WebP,紧缩率高,并且肉眼看不出差异,一起支撑有损和无损两种紧缩模式。紧缩后巨细别离减小 64%、19%。

图片巨细超过 100KB,考虑运用 WebP,小于 100KB 时,能够对图片进行无损紧缩。

需求留意的是:尽管 WebP 的图片格式更小,但是系统 API 只支撑 iOS14 以上运用,低版本还需求用 sd/其他方法 解析,否则会导致显现不出来。

4. 删去合并动态库

删去合并无用的动态库

位置音讯合并至主库,删去公众号、客服、客服、讨论组、翻译、位置等动态库。

5. Xcode 编译设置优化

此模块处理参阅 百度APP iOS端包体积50M优化实践(一)总览

iOS 功能优化:包巨细优化