0%

04-总结月报

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

  1. 重构startTest部分
  2. 测试时断线重连后,检查krill,如果krill异常,则重启。
  3. 启动应用超时失败的处理
  4. 上传obb文件
  5. upload文件带进度显示
  6. support库整体迁移AndroidX
  7. 后台运行 销毁activity 问题
  8. 默认关闭 录像 启动应用失败问题 还有一个崩溃问题
  9. proxy status
  10. app select 连跳两页问题
  11. 修改上传apkname 从 back.apk 改为 processname_version.apk
  12. endtest 添加tm 字段
  13. 修改upload 两个api 都设置正确的apk名称
  14. performance test页面长时间失效时 ,回到login页面
  15. 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
2
3
4
Failed to install the following Android SDK packages as some licences have not been accepted.
修改gradlew:
yes | $ANDROID_HOME/tools/bin/sdkmanager "platforms;android-28"
yes | $ANDROID_HOME/tools/bin/sdkmanager "build-tools;28.0.3"

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。

一般内存泄漏的方式

  1. 来回旋转手机屏幕多次查看是否有内存泄漏包括Activity View Context等。
  2. 把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