apk是什么?为什么需要优化?_batch 图片压缩

apk打包流程

res并不是所有的资源都能编译成二进制,除了图片,和raw 这个下面的文件以外,其他的我可以把他编译成二进制,但是asside 他也是可以不可编译的

签名完之后 通过zipalign 这是Android的工具,zipalign 是压缩并且对齐处理, 4字节对齐,这样就生成了最终上线的apk  压缩对齐处理是干什么呢?干嘛要进行要4字节处理?

zipalign他编译生成4字节对齐,它主要是对齐后,就可以通过mmap去直接访问这样的资源文件 那么这样的话,你的速度会更快,而且减少了这个运行时内存的使用  一个是解决内存,第二个是访问的速度更快,所以说这个4字节对齐,我们一般肯定是要做的

对齐后就可以使用mmap去使用

 

首先不管是什么java代码他最终都会编译成classes.dex文件,这一个就是我们虚拟机可以执行的

res下面就是一些没有编译的 不可以编译的,或者是未编译到我们resoures下面的都在res里面

必须要有的 java的 资源,清单 和META META是签名文件,这个里面包含签名文件,然后 如果你在这个地方如果有人改动了你的 是不是通过这个 META就可以知道? 所以说签名是必须的 整个app里面最少要有这样的一些文件👆 当然如果我们正常开发的话,一般可能会用到中间件 那么这个时候肯定会用到lever 会用到so 可能会在ass里面存放资源,清楚了之后,对我们的apk 比如说

插件化,才能有一个更深刻的认识,

app大了 占内存 app越小越好  几个方面着手 ?

apk 实际上就是一个压缩包,资源文件  压缩包变小,首先内容变小,内容变小 1.代码 2.资源 

资源 更占我们的apk大小 资源这一块我们从图片这一块着手

 图片资源

 

 大图片转webp 

svg转换成 vector 

 

 如果导入出现错误,让ui小姐姐修改一下就可以了

矢量图在首次加载的时候会消耗资源,但是加载完之后,他的性能和位图是差不多的

矢量图不要超过200*200dp

矢量图一般使用在这种小图标 

icon小图标 如果启动界面大图片就不建议使用这样的 如果是大图片 就用webp  webp 是Android专有的文件格式,如果把图片转成webp可能在ios上就不行了 是Android特有的 转换的时候 一张一张导入非常麻烦,

 

 5.0之后才支持svg的

他会在每一个适配文件,里面都会生成一个 自动把xml文件生成png文件

这样没有达到 我们的目的,没有去减少我们的apk  第一种是指定目录去生成 那么这样的话 跟我们这样的使用模式是一样的,因为我们不一定每一种模式都有,不断的去添加差不多的 这样的方式没有达到我们的目的

 

支持androidx 使用支持库 希望他不要生成png图片了,直接使用xml 这样的方式是不是最好的?

 

 

改颜色 

 上面的方式不合理,要用tint 着色器  矢量图都是使用黑色,需要改颜色就使用tint 着色器 修改 

选择器的实现: 颜色选择器

 国际化资源配置

resConfigs 有什么好处呢?

 abc实际上是我们的依赖库来的,也就是androidx,可以把他去掉,加上之后的情况

 resources为什么叫资源映射表 我们平时在使用的时候,实际上是导这里面的id

activity_main如果打开在反编译的话,那么你看的是一串数字,这样的一串数字,就是通过资源映射表你就可以找到

 动态库打包

 

如果是java层 你可以把so理解为jar包, c/c++不跨平台,所以在不同的平台上面对应的平台上生成对应的so文件 因为现在的Android基本上都是arm了,微信只有arm-v7a 除非你的用户量比微信广

如果是定制机,问一下底层开发人员 越是优秀的程序 lib下面的so应该越多 放在so里面好处,还可以加密

 如果虚拟机最好加x86 上线的话就不用加x86

 移除无用资源

 

 

 

 java代码压缩 true

混淆就是压缩

 

 资源压缩 一定要混淆代码为true的时候才能够使用

可以明确的知道哪些资源没有用

把里面的内容删了

 严格模式

 只要是activitymain1开头的文件都保留

 

 保留和删除同时使用  删除 会覆盖保留

 

一般换肤会用到getresources

 

apk瘦身

移除没有用到的资源, 

 删除所有,删除单个的,添加单个的添加进来

通过这种形式使用main1 实际上, 你再去看的时候,这个main1 他依然会让你直接去删除,把项目保存一份,然后再删除,然后跑一下 测试一下 发现没问题, 有问题,再复制进来,但是这样的形式肯定不是我们希望的,现在不用,以后要用这个main1 这样 肯定也不行,这样的删除是物理删除 ,还有一种非物理删除, 删除备份

java这一块可以使用代码压缩,代码压缩

 

 一般说是混淆,为什么说是代码压缩呢? 混淆侧面来说就是压缩,

1.类名 方法名 缩短, 相对而言 进行压缩 ,

2.删除无用代码

他删除的是备份,他删除的是apk的 如果你写的方法没有被调用的话,他不会变色,他实际上就是我们的R8 他会把我们这个在编译的时候生成一个 ba树 图,哪一些代码用到 哪一些代码没用到 他会生成这样的一个图片,然后 这个里面他就会知道哪一些代码是没有用到的 那么在你编译的时候,他就会把这些没有用到的方法他会把他进行一个删除  但是这个删除实际上只删除我们apk里面的 而我们源码里面根本就没有被删除,平时在做调试的时候一定要把他关掉,如果没有关的时候,你在编译的时候他会非常的慢,消耗大量的时间 混淆 移除无用的代码,会把我们所有的类进行遍历 会多次遍历, 

 资源 压缩 

 使用的时候注意,资源压缩,一定在代码压缩的前提为true的时候才能去使用,为什么要设置成这样?为什么代码压缩 为true 才能够打开资源压缩? google为什么要这么设置?

可以明确的知道哪些资源没有用 资源压缩  默认是非严格模式,物理删除 一个是想要备份的删除了,第二个是项目里这样使用的话👇

 照样会把main1删除,

shrinkResources true的时候,main1没有被删除

没有删除,不是把文件删除。而是把文件里的内容删了,只删除内容,文件留下

非严格模式  也有严格模式 

严格模式就需要我们设置了 ,

严格模式, 

非严格模式👆 

非严格模式是👇这样使用的main1*

 以activit_main1开头的这样的文件,他都保留 都认为你有使用,

discard 指定删除  shrinkmode 是开启严格模式  keep是保留 

一般情况下非严格模式 discard  删除 这样删除的比较少

 当你保留和删除同时使用的话,那么这一个删除会覆盖保留

这样写1123会被删除的 

换肤也是这样实现的

 

webp图片 --针对大图片 很好看,颜色比较复杂的

png图片 图片压缩 png图片他是包括图片透明度的  1像素是 argb 三层  如果不适用透明度,你用jpg这样的格式 他就使用rgb  每一个像素就减少了一下 整张图片变小了  能用jpg的就不要去使用png 

压缩图片 微信图片压缩

 

 微信图片压缩 是ndk实现的

apk拆分  根据屏幕大小进行一个适配 针对so进行拆分  so需要使用多个,可以进行拆分 进行发布 这种方式用的比较少

资源混淆 ,资源名称 没有res目录 直接变成了r r下面呢? a a1 a2 a3 资源混淆怎么做的呢?我们的资源在代码编译后,直接会使用r.id这个id需要通过resources.arsc id layout 找到X7 03000C 找到资源映射表 找到路径是res/layout 结果这里根本没有res/layout

 这一个地方,也要进行编译

 假如我的a2 他就是layout 我去找的时候,id是没有变的映射的目录本来原有的是res/layout 我在资源混淆的时候,我是不是把这res/layout 进行一个从新编译,我要把这个地方改成一个 r/a2/l.png 只有改成这样一个以后,在代码里面通过这个id才能真正的找到这张图片 在资源混淆的时候你还要把这个resources.arsc文件进行一个解析,要把它进行解析后,把他res/layout进行一个修改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值