任务
- 升级调试热修复框架
- 还是解决项目的ANR问题
热修复框架
目前公司项目有用到两套热修复框架:阿里的Sophix和腾讯的TinkerPatch
tinkerPatch是基于tinker开源的,提供了下发和管理补丁包
考虑到tinkerpatch免费版本不支持灰度,而且tinkerpatch配制要繁琐一些,所以直接使用sophix
继续解决ANR问题
测试小伙伴反馈,当项目群成员达到10000个时候,先进显示群成员列表,然后再返回的时候就会出现ANR,解决思路:
第一步
使用adb获取anr报告
$ adb bugreport .
打开anr日记,搜索关键字 "main", 查到主线程的信息,这里我没有发现有用的信息
第二步
使用Android Studio cpu profile, 分析主线程上方法的调用情况,看是哪个方法执行耗时操作了
分析得到结果:当返回的时候在Activity的onResume方法中执行了从数据库查到数据的操作,后面分析数据库相关操作问题,原来在群成员列表界面直接了很耗时的数据库操作,虽然是在子线程里面跑的,但是打印了一下方法执行的时间差不多要5s,所有当主线程也要访问数据库的时候就造成ANR了
我们项目是使用ormlite来操作数据库,而且ormlite获取的数据库对象的时候会加一个同步锁,为了解决多线程访问的问题
解决
一开始在onResume方法中执行的数据库访问操作也放在子线程中,发现子线程执行完成后要回调通知主线程,这样代码逻辑改动很大,就放弃这个方案
后面想在群成员列表界面子线程执行耗时操作的时候加个判断,如果Activity已经退出的时候就退出循环,不向下执行,这就就可以数据库对象一直被子线程占用引用的这个ANR的问题
如果要完美解决的话,还是要把所有的数据库操作都放在子线程里面,而且当Acitivty退出的时候,Activity所使用的子线程来操作数据库的方法也要退出一下
ps: 这个上线了一个新的版本,虽然改了一些ANR的问题,发出是没有再报出来了,但是还是有一些ANR的问题报出来,后面继续努力了,争取把所有的ANR问题都解决掉
遇到的问题
- Fragment执行runonUiThread遇到下面问题
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.runOnUiThread(java.lang.Runnable)' on a null object reference
解决:
if (getActivity() == null)
return;
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
_updateBanners(bannerItems, bannerImages);
}
});
- gradlew 命令不可用
在Android studio中的Terminal中输入./gradlew commond
-bash: ./gradlew: Permission denied
解决:
chmod +x gradlew
- sophix配制的问题
"org.jf.util.ExceptionWithContext: Exception occurred while writing code_item for method Activity路径;->init()V"
"\tat org.jf.dexlib2.writer.DexWriter.writeDebugAndCodeItems(DexWriter.java:825)"
"\tat org.jf.dexlib2.writer.DexWriter.writeTo(DexWriter.java:268)"
"\tat org.jf.dexlib2.writer.DexWriter.writeTo(DexWriter.java:246)"
"\tat org.jf.smali.Smali.assemble(Smali.java:130)"
"\tat com.taobao.sophix.impl.PatchCommand.start(PatchCommand.java:373)"
"\tat com.taobao.sophix.Main.main(Main.java:34)"
"Caused by: org.jf.util.ExceptionWithContext: Error while writing instruction at code offset 0x12"
"\tat org.jf.dexlib2.writer.DexWriter.writeCodeItem(DexWriter.java:1098)"
"\tat org.jf.dexlib2.writer.DexWriter.writeDebugAndCodeItems(DexWriter.java:821)"
"\t... 5 more"
"Caused by: org.jf.util.ExceptionWithContext: Unsigned short value out of range: 143796"
"\tat org.jf.dexlib2.writer.DexDataWriter.writeUshort(DexDataWriter.java:116)"
"\tat org.jf.dexlib2.writer.InstructionWriter.write(InstructionWriter.java:236)"
"\tat org.jf.dexlib2.writer.DexWriter.writeCodeItem(DexWriter.java:1025)"
"\t... 6 more"
暂时还没有想到怎么去解决
- Android Studio 打包报错
> Task :compileKotlin FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':compileKotlin'.
> Kotlin could not find the required JDK tools in the Java installation '/usr/lib/jvm/java-8-openjdk-amd64/jre' used by Gradle. Make sure Gradle is running on a JDK, not JRE.
解决:重新安装openjdk
sudo apt-get install openjdk-8-jdk
总结
- 项目用到的即时通讯是通过WebSocket协议建立长连接来实现
- 事务表示在数据库管理系统(或类似的系统)中对数据库执行的工作单元,
事务有几个特性, 简写就是ACID,即Atomic,Consistency,Isolation,Durability 其中最重要的就是原子性
数据库环境中的事务有两个主要目的:
- 提供可靠的工作单元,允许从故障中进行正确的恢复,并在系统故障、执行停止(全部或部分停止)和许多操作时保持数据库一致
- 在并发访问数据库的程序之间提供隔离
-
ormlite框架
Android中有很多操作SQLite数据库的框架,现在最常见、最常用的是ORMLite和GreenDAO。ORMLite相比与GreenDAO来说是一个轻量级的框架 -
Vollery网络请求
Google官方出的网络请求框架,包小(100多k),非常适合进行数据量不大,但通信频繁的网络操作,可以取消请求,不适合下载大量内容的操作,使用DownloadManager替换,后台要花时候研究一下这里面具体是怎么实现的
网友评论