上班第二周

2020-05-16  本文已影响0人  寒冬_腊月

任务

  1. 升级调试热修复框架
  2. 还是解决项目的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问题都解决掉

遇到的问题

  1. 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);  
    }  
});  
  1. gradlew 命令不可用
    在Android studio中的Terminal中输入./gradlew commond
-bash: ./gradlew: Permission denied

解决:

chmod +x gradlew
  1. 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"

暂时还没有想到怎么去解决

  1. 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

总结

  1. 项目用到的即时通讯是通过WebSocket协议建立长连接来实现
  2. 事务表示在数据库管理系统(或类似的系统)中对数据库执行的工作单元,
    事务有几个特性, 简写就是ACID,即Atomic,Consistency,Isolation,Durability 其中最重要的就是原子性

数据库环境中的事务有两个主要目的:

  1. ormlite框架
    Android中有很多操作SQLite数据库的框架,现在最常见、最常用的是ORMLite和GreenDAO。ORMLite相比与GreenDAO来说是一个轻量级的框架

  2. Vollery网络请求
    Google官方出的网络请求框架,包小(100多k),非常适合进行数据量不大,但通信频繁的网络操作,可以取消请求,不适合下载大量内容的操作,使用DownloadManager替换,后台要花时候研究一下这里面具体是怎么实现的

参考

volley

上一篇 下一篇

猜你喜欢

热点阅读