1.Flutter的setState
2.dart的多线程
dart的多线程
3.java线程池
io密集型和Cpu密集型参数设置
CPU密集型和IO密集型
CPU密集型也是指计算密集型,大部分时间用来做计算逻辑判断等CPU动作的程序称为CPU密集型任务。该类型的任务需要进行大量的计算,主要消耗CPU资源。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。
IO密集型任务指任务需要执行大量的IO操作,涉及到网络、磁盘IO操作,对CPU消耗较少。
和线程池配置的关系
CPU密集型任务应配置尽可能小的线程,如配置CPU数目+1个线程的线程池。
由于IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程,如2*CPU数目。
activity的启动模式 与addFlag
双向链表的添加个修改
包体积优化。
1.Flutter 下发技术 https://tech.meituan.com/2020/09/18/flutter-in-meituan.html 大概减少5mb
2.lint pr的时候进行模拟打包进行applint 静态检查代码资源
3.proguard 混淆
压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性;
优化(Optimize):分析和优化相关方法字节码,移除无用的指令;
混淆(Obfuscate):使用随机的小写且无意义的名称对类、字段和方法进行重命名;
预校验(Preverify):在Java平台上对处理后的代码进行预校验,确保加载的class文件是可执行的。
原文链接:https://blog.csdn.net/AndrExpert/article/details/103483635
4.andResGuard
AndResGuard是微信团队开源的一个缩小APK大小的工具,它的原理类似于Proguard,但是只针对资源,它会把原本冗长的资源路径变短,比如讲res/drawable/wechat变为r/d/a。相比于Proguard,AndResGuard的优势在于它通过自己实现安装包解压和利用7z极限压缩进行打包,使得整个混淆打包过程不依赖源码和编译流程,只需输入一个APK文件(无论签名与否、debug版、release版),从而做到最大混淆,大大减少了安装包体积,同时也提升了APk被破解的难度 大概减少4mb
5.png图片压缩 使用webp
内存优化
使用sparryArray替代hashmap
oom监控 信息
android 启动优化
冷启动时间统计
application创建时间=splashOnCreate()-start()
Splash渲染时间=onWindowFocusChange()-onCreate()
Splash停留的时间=mainActivityOnCreate()-splashOnCreate()
MainActivity渲染时间=onWindowFocusChange()-onCreate()
冷启动时间=MainActivityonWindowFocusChange()-applicationOnCreate()
1.启动页主题背景设置成闪屏页图片
2.线程优化 使用合理的启动架构
微信内部使用的 mmkernel
阿里 Alpha
3.启动过程中减少系统调用
启动过程中不要启动子进程
启动过程中除了 Activity 之外的组件启动要谨慎
4.appStrart 合并ContentProvider的调用
5.提高主线程优先级
GC 优化
启动过程中减少 GC 的次数
避免进行大量的字符串操作,特别是序列化和反序列化
频繁创建的对象需要考虑复用
转移到 Native 实现
资源重排
Pagecache 机制可以减少启动过程中的真正 IO 的次数
使用reduex
主页面布局优化
闲时调用
使用ideHandler 获取Token信息
android 帧率检测
上传机制
oom 监控 监控上传机制
crash 率优化
在mainLoop中发生异常保障looper可以继续循环
在子线程的发生异常 保证主线程的looper继循环
由于布局 绘制 布局导致的织舞者产生的异常 关闭当前界面
在生命周期中发生异常时,对ActivityThread里面的 Instumentation 进行代理
1)aapt 为res目录下的资源生成R.java文件, 同时为AndroidMainfest.xml 生成Mainfest.java文件
2)aidl 把项目中自定义的aidl文件生成相应的Java代码文件
3)javac 把项目中所有Java代码编译成class 文件。 包括三部分java代码,自己写的业务逻辑代码,aapt 生成的Java文件,aidl生成的Java文件。
4)proguard 混淆同时生成proguardMapping.txt , 这一步是可选的。
5)dex 将所有的class 文件(包括第三方库的class文件) 转换为dex文件
6)aapt 打包,将res目录下的资源,assets目录下文件,打包成一个.ap_文件
7)apkbuilder , 将所有dex文件,ap_文件,AndroidMainfest.xml打包为.apk文件, 这是一个未签名的apk包
8)jarsigner 对apk 进行签名
9) zipalign 对要发布的apk文件进行对齐操作,以便运行时节省内存
家宴准备了西式菜
回答不好的地方
应该提升业务的主动性 模块化
应该思考业务方向
synchronized修饰(非静态)方法和synchronized(this)都是锁住自己本身的对象;synchronized修饰静态方法和synchronized(类名.class)都是锁住加载类对象;synchronized(object)是锁住object对象
12.1.ViewModel为什么不会随着Activity的屏幕旋转而销毁
主要是通过onRetainNonConfigurationInstance方法把ViewModelStore缓存在NonConfigurationInstances中,在getViewModelStore取出ViewModelStore。具体内容看第 11 节
12.2.为什么在对应的作用域内,保正只生产出对应的唯一实例
ViewModelStore的 get方法,是根据 key 来取值的,如果 key相同,那取出来的ViewModel就是一个。具体内容看第 9.2 小节
12.3.onCleared方法在什么调用
当 Activity 真正销毁的时候,而不是配置改变会调用ViewModelStore的 clear进而调用了ViewModel的onCleared,具体内容看第 9.2 小节