美文网首页
上班第二周

上班第二周

作者: 寒冬_腊月 | 来源:发表于2020-05-16 23:19 被阅读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

    相关文章

      网友评论

          本文标题:上班第二周

          本文链接:https://www.haomeiwen.com/subject/nqbdohtx.html