最近项目的bugly报了一个错finalize() timed out after 10 seconds。最初遇到这个问题,本人一脸懵逼。没写过这个方法怎么会在这里面报错的?查阅了网上的资料才发现,通常这个错误发生在 java.lang.Daemons$FinalizerDaemon.doFinalize的方法中,直接原因是对象的 finalize() 方法执行超时。接下来就有必要看一下Daemons的方法。
没有代码,就没有bug。程序员在编码时,总会比不避免的出现bug。倒不是因为我们热爱制造bug,创造机会和测试妹子频繁沟通。而是现实情况很复杂,存在着很多不确定性。尤其是那些崩溃从stacktrace上来看,完全想象不到和项目代码之间的直接联系。
Java Finalizer 机制提供了一个在对象被回收之前释放占用资源的时机,但是都说 Finalizer 机制是不稳定且危险的,不推荐使用,这是为什么呢?今天我们来深入理解这个问题。
自己找到的问题地址: http://stackoverflow.com/questions/27232275/java-util-concurrent-timeoutexception-android-view-threadedrenderer-finalize/
Java 引用是 Java 虚拟机为了实现更加灵活的对象生命周期管理而设计的对象包装类,一共有四种引用类型,分别是强引用、软引用、弱引用和虚引用。我将它们的区别概括为 3 个维度:
ADB 即 Android Debug Bridge,Android调试桥。ADB工作方式比较特殊,采用监听Socket TCP 端口的方式让IDE和Qemu通讯,默认情况下adb会daemon相关的网络端口。熟练使用 ADB 命令将会大大提升开发效率。 ADB 的命令有很多,今天就来总结下我在TV开发常用到的一些 ADB 命令。
ADB 即 Android Debug Bridge,Android调试桥。ADB工作方式比较特殊,采用监听Socket TCP
Flutter 分为两个部分,上层是函数响应式的Framework(开源),下层是Engine,可以这样理解,基于Framework开发App,在Engine里运行。
由于Android Hook技术底层原理其实说白了就是java的反射和动态代理,所以这里我们先来讲一下代理模式。
前几天遇到了一共个ANR问题,线程阻塞问题,下面分享一下分析解决思路。 从log中可以看出是System_server超时ANR问题,在一个循环中等待。
我们知道,Android基于linux,linux的第一个进程为init,它启动别的进程,在Android中,它启动了zygote:
Android MediaPlayer基础。 在线音频播放,使用MediaPlayer。 下载在线音频到本地,使用URLConnection。
从问题的深入程度而言,kernel exception已经深入到linux kernel底层,并且和芯片层有交互,这一块直接和驱动交互,问题比较复杂,不像JE和NE可以直接抓一些Exception log,KE的log也能抓上来一些,但是不全,解决的问题依赖的方面太多:kernel层、芯片层、驱动层等等,考虑的因素比较多,不像软件层面的单一化。 本文我们不过多讨论KE的问题,从Exception的抓取调用是如何实现的来分析一下Android源码这方面是如何做的。
之前一直习惯用json进行数据的传输,觉得很方便。来到新公司后发现同事们用的更多的的协议都不是json,而是Protocol buffer。这个东西之前没有听说过,不明白同事们为什么放弃好好的json不用,用这个。后来了解到经常是设备与设备之间进行通信,而不是设备与服务器做通信。很多设备是linux下c语言做核心服务,c来解析json比较麻烦。于是决定花些时间来学习这个陌生的协议。
最近在Debug or Run Android Eclipse工程时,发现真机直接崩溃闪退,但闪退后断开数据线,重新在真机直接run则没问题,debug闪退日志报错:Dumping all threads without appropriate locks held: thread list lock mutator lock,之前调试还是好好的,为什么突然就不行了呢?
上一篇文章,我们知道在AndroidRuntime.cpp的start()函数里面是调用的Zygoteinit类的main()函数,那我们就继续研究
一个应用App的启动速度能够影响用户的首次体验,启动速度较慢(感官上)的应用可能导致用户再次开启App的意图下降,或者卸载放弃该应用程序。
领取专属 10元无门槛券
手把手带您无忧上云