2020年4月的学习内容和工作内容总结
Java
内存模型
内存模型是jvm的一种抽象规范,用来屏蔽不同硬件和操作系统的内存访问差异, 简称JMM (java memory model)
主内存
简单理解为计算机中真实的内存或者内存的抽象。
工作内存:
每一个线程都拥有自己的工作内存, 对于共享变量来说, 工作内存上储存的是主内存中的副本。
这样做的原因是 效率高。
当线程修改共享变量,实际上内存模型的操作是 取主内存的值到工作内存, 然后修改工作内存的值再到主内存。
问题是 如果高并发情况下可能 两个线程通知取了值 同时修改 然后覆盖了主内存。
volatile
保证了共享变量在所有线程中的可见性, 可以解决以上问题。
volatile虽然解决了可见性, 但是不能解决原子性
指令重排
虚拟机 会在编译java代码的时候,对字节码进行优化 ,进行执行顺序的重排。
解决指令重排:
内存屏障(Memory Barrier) 是一种CPU指令, 包括:
- LoadLoad指令
- StoreStore指令
- LoadStore指令
- StoreLoad指令
volatile的原理就是 利用内存屏障:
- 在写操作之前进行 StoreStore,保证其上面的写指令完成,
- 在写操作之后StoreLoad , 保证下面的指令读之前 写操作完成。
- 在读操作之前插入 LoadLoad , 保证上面的读操作能完成再读取
- 在读操作之后插入LoadStore , 保证下面的写操作之前 读操作能完成
关于读写
java读写文件时 选择的buffer大小 ,根据BufferedReader有的默认,选择8192
其他
- 四种线程池 等待所有线程关闭 corePoolSize
- arraylist linkedlist 线程安全
- 关于 String.format 中的 locale
- lombok 中的 accessors 注解
BlueWhale
- 重构startTest部分
- 测试时断线重连后,检查krill,如果krill异常,则重启。
- 启动应用超时失败的处理
- 上传obb文件
- upload文件带进度显示
- support库整体迁移AndroidX
- 后台运行 销毁activity 问题
- 默认关闭 录像 启动应用失败问题 还有一个崩溃问题
- proxy status
- app select 连跳两页问题
- 修改上传apkname 从 back.apk 改为 processname_version.apk
- endtest 添加tm 字段
- 修改upload 两个api 都设置正确的apk名称
- performance test页面长时间失效时 ,回到login页面
- downloadmanager下载版本时如果失败,下次新建 会 有一个 后缀-1
Android
Service
startservice 生命周期:
1 | oncreate -> onStartCommand -> onStop-> onDestroy |
其中onStartCommand 可以被调用多次。
bindService生命周期:
1 | oncreate->onBind->unBind->onDestroy |
其中需要创建一个 IBind 实例并通过 onBind返回
bindService的activity需要创建一个ServiceConnction实例, 然后通过bindService作为参数传入。
一个service 可以被bind多次
jenkins 远程编译报错
1 | Failed to install the following Android SDK packages as some licences have not been accepted. |
Http
从android 9.0 开始 android应用内不能使用http请求,解决方式是把 target api 改到27 以下, 但是Google Play 目前已经强制把target api升到28 才能上传应用商店。
View
设置属性动画
可以设置属性动画 view.animate(),达到讲view旋转等操作
RecylcerView
四级缓存
- 一级缓存:mAttachedScrap
- 二级缓存:mCacheViews
- 三级缓存:mViewCacheExtension
- 四级缓存:mRecyclerPool
WebView
webview 加载URL 时,如果证书出错,会在webviewclient的接口中报错,如果想继续进行,在 onReceivedSslError 中调用方法handler.proceed 。
进程的内存
dalvik 虚拟机中内存的限制通过getprop获得 :dalvik.vm.heapgrowthlimit , android10 为256
native层 没有限制 ,查看实时的内存占用情况:
1
dumpsys meminfo package
获取sn方法
- 8.0以下使用get props
- 8.0 使用 Build.serial. 属性
- 8.1 9.0 获取READ_PHONE_STATE 权限,执行 BUILD.getSerial() 获取
- 10.0以上获取不了 包括IMEI。
一般内存泄漏的方式
- 来回旋转手机屏幕多次查看是否有内存泄漏包括Activity View Context等。
- 把app在系统后台和前台之间来回切换
jetpack 简单了解
workmanger 可以在程序退出 或者 重启时 执行一段程序
Glide 框架
Glide 默认就存在 本地缓存 存在 /data/data/pkg/cache 中, 其中用到了 LRU算法
还可以设置 是否缓存、仅缓存 等
汽车类app 滑动旋转车身 实现原理
- 把动画切成36张图,加入数组,使用Glide 随着触摸更换图片,类似帧动画效果。
- 另一种实现方式是webview,前端页面中引入腾讯3D地图处理之类的api。
其他
oppo的手机部分 没有md5sum 命令 只有md5命令
Linux
xargs的使用方式
| 字符在linux中式管道的意思,可以承载前一个命令的结果,并将其转换成标准输入,有的命令只支持参数传入 不支持 标准输入 比如ls , 那么 使用 | ls 没有效果,所以需要使用 xargs 将标准输入转换成参数
yes命令:
使用 yes| xxx, 可以不断输出y 来调用yes/no 选项
head命令
head -n 10 file 查看前10行内容
设计模式
- 策略模式和工厂方法模式 代码上没什么区别 只是在思想上不太一样,工厂方法注重对象的创建, 策略是对象的行为的不同。
XFous 项目
解决了 Electron和nodobjc的兼容问题,选择了 node v8版本.
使用Vue-cli构建项目
其他
英语
单词1100词
阅读
- 图解HTTP