* Rethrow this exception when we know it came from the system server. This
* gives us an opportunity to throw a nice clean
* {@link DeadSystemException} signal to avoid spamming logs with
* misleading stack traces.
* Apps making calls into the system server may end up persisting internal
* state or making security decisions based on the perceived success or
* failure of a call, or any default values returned. For this reason, we
* want to strongly throw when there was trouble with the transaction.
* @throws RuntimeException
@NonNull
public RuntimeException rethrowFromSystemServer() {
if (this instanceof DeadObjectException) {
throw new RuntimeException(new DeadSystemException());
} else {
throw new RuntimeException(this);
在整个app的执行过程中,生命周期,显示view等都需要跟system_server提供的service(activity,window,package)通信,如果系统binder调用出现问题,你在分析log是可能纳闷,system_server从log看运行的很正常,但是app居然给你报告system已经death。
到这儿binder几个常见异常已经算是告一段落。接下来,我们聊聊,在遇到binder问题是如何去调试问题;找到问题root cause。
都看到这儿了,辛苦一下,给点个赞呗。。。。
在平常程序运行过程中,可能碰到最多跟binder相关的异常是RemoteException,但本文只分析跟binder机制相关的异常,而RemoteException是server端逻辑导致的其它异常在client端的表现。跟binder机制相关的异常有:android.app.RemoteServiceException: can't deliver broadcast,JavaBinder: !!! FAILED BINDER TRANSACTION !!!,TransactionTooLargeEx
Binder是一种进程间通信机制,基于开源的OpenBinder实现;OpenBinder起初由BeInc.开发,后由PlamInc.接手。从字面上来解释Binder有胶水、粘合剂的意思,顾名思义就是粘和不同的进程,使之实现通信。一般Android应用开发很少直接用到跨进程信通信(IPC),但如果你想知道:1.App是如何启动并初始化的?2.Activity的启动过程是怎样的?3.进程间是如何通信的?4.AIDL的具体原理是什么?5.众多插件化框架的设计原理等等这些问题的背后都与Binder有莫大的关系,要弄懂上面这些问题理解Bidner通信机制是必须的。我们知道Android应用程序是由Ac
发现app出现crash,具体看到堆栈:
android.app.RemoteServiceException: can't deliver broadcast
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2047)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:2
碰到一个异常,具有随机性:
android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died
at android.os.BinderProxy.transactNative(Native Method)
at android.o...
Binder机制是android中实现的进程间通信的架构,它采用的是c/s架构,client通过代理完成对server的调用。既然这里提到了server,那么我们有必要先了解下在android中是怎么来管理server的。先来看一个重要的Native进程:ServiceManager,从名字可以看出来,这个是用来管理所有server的。在init进程启动之后,会启动另外两个重要的进程,一个是我们上一篇讲的Zygote进程,另外一个就是这个ServiceManager进程了,这两个进程启动之后就建立了android的运行环境和server的管理环境。ServiceManager进程启动之后其他s
Talking Kotlin Android App
Hi there! This is an android app for TalkingKotlin.com, a podcast about all the Kotlin things.
Goodies
Kotlin
MVPVM
Android Architecture Components (LiveData, ViewModel, etc.)
Deep linking to directly access episodes from urls
Feature Wish List
Add extra data posted on the website of talkingkotlin but can't be added through SoundCloud
Make the app more social (shares, likes, etc.)
A detail screen for each episode
Mea culpa
Not enough tests (WIP)
No DI (Dagger2?
RemoteServiceException: Bad notification posted from package *
过去有一个奇异的Crash,出现概率比较低,后来Huawei 8.0机器出来后突然暴增,统计了一下大概5%左右的概率会出现
首先确定这不是因为Notification数据填充问题(使用了非@RemoteView修饰的View……)
这个Crash有如下特征
Huawei 8.0高频出现 (以往系统版本也会出现,但概率很小,系统实现机制存在这种概率)
只在更新后一段时间内出现
06-23 11:02:35.482 E/AndroidRuntime(19470): FATAL EXCEPTION: main
06-23 11:02:35.482 E/AndroidRuntime(19470): Process: com.tencent.android.qqdown
DeadObjectException:
Binder 为CS架构,我们无法确保Client端的生命周期,如被forcestop或被卸载等等。如果server端提供了接口回调的方式,一旦Client被停用,那么就会出现DeadObjectException的异常,原因是在Server进行Callback时,Client端已经死亡。
安卓本身提供了一些检测方法,拿com.android.se
Android进程间通信(Inter-process Communication, IPC)是指在不同进程之间进行数据交互和通信的方法。Android提供了多种方式实现进程间通信,以下是常用的几种方式:
1. Binder机制:Binder是一种跨进程通信技术,它基于Linux内核提供的Binder驱动。通过Binder,我们可以将一个Service注册为Binder服务,其他进程可以通过Binder进行远程调用,实现进程间的通信。
2. 文件共享:进程可以通过共享文件的方式实现通信。一个进程将数据写入文件,其他进程读取该文件数据,从而实现进程间的信息传递。
3. Socket通信:可以使用Socket套接字进行进程间通信。一个进程作为服务器,另一个进程作为客户端,通过Socket建立连接进行数据交互。
4. ContentProvider:ContentProvider是Android中用于实现进程间共享数据的一种组件。通过ContentProvider,一个进程可以提供数据给其他进程进行读写操作。
5. BroadcastReceiver:广播是一种常见的进程间通信方式。一个进程发送广播消息,其他进程通过注册相应的广播接收器来接收并处理广播消息。
6. Messenger:Messenger是一种轻量级的进程间通信方式。通过Messenger,一个进程可以发送消息给另一个进程,实现进程间的通信。
以上是常用的几种Android进程间通信方式,开发者可以根据具体需求选择合适的方式来实现进程间通信。
353 if (mDriverFD >= 0) {
354 // mmap the binder, providing a chunk of virtual address space to receive transactions.
355 mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0); //BINDER_VM_SIZE设置buffer size;
45#define BINDER_VM_SIZE ((1*1024*1024) - (4096 *2)) //具体大小
46#define DEFAULT_MAX_BINDER_THREADS 15
可以在aospxref.com这个网站在线查看Android源码