在Android程序中,引起崩溃的多属于运行时异常或者错误,对于这些异常我们很难做到类似Checked Exception那样显式捕获,因而最终导致了程序崩溃。...本文讲介绍一些如何处理崩溃的实践,比如收集崩溃的stacktrace,甚至如何避免出现程序已停止的对话框。 如何收集崩溃信息 收集崩溃信息,可以更好的修复问题,增强程序的稳定性。...然而,实际上有些情况下是不需要展示这个对话框的,一个常用的例子,我的程序中一个不太重要的推送服务采用了单独的进程,当这个进程崩溃时,实际上是可以允许不让用户感知的。...首先需要获得Android默认的异常处理,在设置自定的异常处理之前,将Android默认处理保存起来。...uncaughtException中调用如下方法 1 mDefaultExceptionHandler.uncaughtException(thread, ex); 注意,如果你的应用崩溃后,不调用Android
遇到这种异常,Java Runtime会停止线程,打印异常,并且会停止程序运行,也就是我们常说的程序崩溃。 非运行时异常。...ok,也就是说我们抛出一个RuntimeException异常之后,所在的线程会被停止。如果主线程中抛出这个异常,那么主线程就会被停止,所以APP就会卡住无法正常操作,时间久了就会ANR。...这就要从APP的启动流程说起了,之前也说过,所有的Android进程都是由zygote进程fork而来的,在一个新进程被启动的时候就会调用zygoteInit方法,这个方法里会进行一些应用的初始化工作:...在uncaughtException回调方法中,会执行一个handleApplicationCrash方法进行异常处理,并且最后都会走到finally中进行进程销毁,Try everything to...另外有的朋友可能发现了构造方法中,传入了一个LoggingHandler,并且在uncaughtException回调方法中还调用了这个LoggingHandler的uncaughtException方法
然后在重写的uncaughtException(t: Thread, e: Throwable)中收集日志信息。 为什么出现异常了,程序会停止运行呢?...应该是系统结束了整个程序进程吧 那出现异常了,程序一定会停止运行么? 嗯...应该会.....吧 在未知异常的情况下,有办法让程序不崩溃么? 嗯...应该可以吧......这个问题需要了解下Android 的异常处理机制,在我们未设置Thread.UncaughtExceptionHandler之前,系统会默认设置一个,具体我们参考下ZygoteInit.zygoteInit...,也就导致了程序停止运行。...这里我先要普及个小知识点,Android系统为啥能响应来自各种(人为/非人为)的事件?
我想大多数人应该知道这样的道理:我可以在系统刚刚启动的时候,设置一个监听器啊,监听所有的进程,一旦某一个进程发生了Exception问题,这个监听器就能监听到,然后触发一个回调调上来,上层就会知道发生了什么问题...1.2 Exception接收器初始化 既然是在系统启动的时候,那么肯定在刚开始的时候就启动了这个收集器了,我们从分析Android系统启动的流程着手。...1.2.1 系统启动 我们知道Android系统是init进程启动的,通过解析init.zygote64.rc(看你机器是32位还是64位的)中的信息,启动一个zygote进程。...进程也被认为是android的第一个进程。...在system_server进程启动之后,开始了接下来了注册器回调的过程。
在明确了目标之后,我们才能正确认识我们的工作到底有什么作用。...Android 8.0 的系统上。...2.2.2 崩溃日志的记录 在KillApplicationHandler类中的uncaughtException方法 可以看到ActivityManager.getService().handleApplicationCrash...,而应用进程在创建过程调用attachApplicationLocked(),从而attach到system_server进程,在system_server进程内有一个ApplicationThreadProxy...3.4 JVM处理异常入口 思考一下:JVM拿到异常之后是如何将捕获的异常回调到java层的uncaughtException方法。
从Android 3.1(HoneyComb) 也就是API 12开始,Android引入了一套新的启动控制,这就是程序的停止状态.那让我们看一下Google对于程序的停止状态的描述....从Android 3.1开始,系统的包管理器开始跟踪处理停止状态的程序.并且提供了方法来控制从后台进程或者其他程序对它们的启动....如何变为停止状态 在设置应用管理中的应用详情页点击强制停止 使用adb shell adb shell am force-stop package-name 使用ActivityManager的隐藏方法...如果是上面所述的情况,该应用在安装之后不是处于停止状态,因为它没有任何用户可以直接点击的行为去将它移除停止状态.你可以正常接收广播intent,除非你人为地将它强制停止....,从3.1之后,是在程序安装后第一次打开时发送.
1)避免在activity里面做耗时操作,oncreate & onresume 2)避免在onReceiver里面做过多操作 3)避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面...每一个android app都会独立占用一个dvm虚拟机,运行在linux系统中。 所以dalvik进程和linux进程是可以理解为一个概念。...进程间的通信:bind机制(IPC->AIDL),linux级共享内存,boradcast, Activity 之间,activity & serview之间的通信,无论他们是否在一个进程内。...20.Android 中的动画有哪几类,它们的特点和区别是什么 视图动画,或者说补间动画。只是视觉上的一个效果,实际view属性没有变化,性能好,但是支持方式少。...来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
} // Bring up crash dialog, wait for it to be dismissed ActivityManager.getService...System.exit(10) ;这个方法就会直接干掉当前进程,也就是所谓的 App crash 了。...所以我们一旦抛出异常,并且没有捕捉的话,程序就会被强制干掉。...既然如此,那有没有其他办法可以保证 App 在抛出异常不 crash 的情况下,又能保证不会卡死呢?...一旦抛出异常,跳出 loop 循环以后,我们也可以在 loop 外层套一层 while 循环,让自己的 loop 再次工作。
本文继续Android安全话题,继续说道第四篇,继续对具体安全漏洞做具体的防止实践。本篇介绍组件劫持攻防。本文让你明白手机QQ强制登录提示功能的原理。 ?.../android/app/ActivityManager.html, activity的启动模式(四大启动模式自行找文看)决定了安全存在风险。...Service 本地服务(Local) 该服务依附在主进程上,不是独立的进程。本地服务在一定程度上节约了资源,由于是在同一进程因此不需要IPC,也不需要AIDL。相应bindService会方便很多。...主进程被Kill后,服务便会终止。 远程服务(Remote) 该服务是独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。...由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务具有较高的灵活性。
前沿 上一篇整体介绍了crash崩溃库崩溃重启,崩溃记录记录,查看以及分享日志等功能。...来自所有线程中的Exception在抛出并且未捕获的情况下,都会从此路过。进程fork的时候设置的就是这个静态的defaultUncaughtExceptionHandler,管辖范围为整个进程。...中线程处理异常分析 在Android平台中,应用进程fork出来后会为虚拟机设置一个未截获异常处理器, 即在程序运行时,如果有任何一个线程抛出了未被截获的异常, 那么该异常最终会抛给未截获异常处理器处理...所以在Android中子线程死亡是允许的。主线程死亡就会导致ANR。...对于这种情况,在设置默认 hander 之前,可以先通过 getDefaultUncaughtExceptionHandler() 方法获取并保留旧的 hander,然后在默认 handler 的uncaughtException
通过跨进程服务(AIDL)可以实现不同进程之间的通信,这也是服务的重要的用途之一。 ---- Service并没有实际界面,而是一直在Android系统的后台运行。...如果返回START_STICKY,表示Service运行的进程被Android系统强制杀掉之后,Android系统会将该Service依然设置为started状态(即运行状态),但是不再保存onStartCommand...2、 START_NOT_STICKY 在运行onStartCommand后service进程被kill后,并且没有新的intent传递给它。...如果返回START_NOT_STICKY,表示当Service运行的进程被Android系统强制杀掉之后,不会重新创建该Service,当然如果在其被杀掉之后一段时间又调用了startService,那么该...如果返回START_REDELIVER_INTENT,表示Service运行的进程被Android系统强制杀掉之后,与返回START_STICKY的情况类似,Android系统会将再次重新创建该Service
各版本 Android 的 ActivityManager 获取方式, finishActivity的参数, mToken(binder对象)的获取不一样,我们可以去每个版本的 Activity 的 finish...拦截主线程的其他异常 上文说过 Android 主线程所有的消息都是在 Looper.loop()方法中调用的,只要能 try catch 住这个 loop 方法就能实现拦截主线程的所有异常,我们可以在...uncaughtException方法中执行如下代码。...建议通过黑白名单控制拦截到的异常是直接忽略还是杀进程。可以在 APP 启动时,或者 crash 后下次重启时请求接口更新黑白名单。 什么样的异常可以不杀进程?...Bandage可以最大程度保证 APP 可用,有人说这种拦截方式很暴力,但 Android 默认的异常杀进程逻辑不是更暴力吗,杀进程并不能解决问题,杀进程后再自动恢复 Activity 反而会导致更多的问题
,来监视APP是否运行,如果有3个页面都不运行了就说明这个APP已经挂掉了,否则说明APP在运行状态,不做处理,挂掉之后,我们需要重新启动App来让它继续处理运行状态,对外暴露一个来停止监控服务的广播,...这样我们想停止监控服务时,发送一个广播即可。...思路:实现一个双进程的监控服务,服务中写一个定时器 Timer 来重复进行检测是否正在运行,如果否就直接重新启动APP。...= null) { timer.cancel(); } } } 2.注册双进程Service <service android..."); startService(intent); 5.停止监控服务 发送一个杀死进程广播即可,action值如下 Intent intent = new Intent(); intent.setAction
Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务。...配置android:persistent="true" 3. setForeground(true); 4. android:process=”com.xxx.xxxservice”配置到单独的进程中...要么像第四种单独的进程运行service在360老的版本是可以的,但是在360的比较新的版本中仍然会被杀死.... manager = (ActivityManager)AppApplication.getContext().getSystemService(Context.ACTIVITY_SERVICE); ...但是这种方式比较消耗电量,并且由于不同手机系统定制的改变,当应用被强制停止时,父进程并不一定被真正杀死,因此在一些特定机型上是无法通过此方式进行判断.
06.ANR是如何监控的 07.回过头看addErrorToDropBox 前沿 上一篇整体介绍了crash崩溃库崩溃重启,崩溃记录记录,查看以及分享日志等功能。...03.Looper停止App就退出吗 looper如果停止了,那么app会退出吗,先做个实验看一下。代码如下所示 可以发现调用这句话,是会让app退出的。...无论是调用了quit方法还是quitSafely方法只会,Looper就不再接收新的消息。...04.handleApplicationCrash 在KillApplicationHandler类中的uncaughtException方法,可以看到ActivityManager.getService...= null) { observer.stopWatching(); } } } ``` 看完之后,应该可以很清楚地的明白。
一、获取进程名的常规方法,通过ActivityManager 在多进程的APP中,常常需要知道当前进程是主进程还是后台进程?还是什么进程。...拿到RunningAppProcessInfo的列表之后,还需要遍历一遍找到与当前进程的信息。 显然额外的循环也会增加耗时; 当然这个耗时影响很小。...但是这个方法只有在android9【也就是aip28】之后的系统才能调用。...image.png 大叔发现这个方法在android4.3.1上就已经有了这个方法了。 在android4.0.4上没有找到currentProcessName()方法。...; } /** * 通过Application新的API获取进程名,无需反射,无需IPC,效率最高。
Android中Java层的ActivityManager类中封装了很多API,可以供我们查询当前系统的很多信息,包括:内存、进程(Process)、任务栈(Task)、服务(Service)等的相关信息...//RunningAppProcessInfo重要属性 // importance:进程在系统中的优先级,值越低进程越不容易被杀死 // importanceReasonCode:进程的重要原因代码...以下为Android常见的优先级对应值,值越低,对应的优先级越高,进程就越不容易被系统杀死: * ActivityManager.RunningAppProcessInfo...,任务中运行中的Activity数量,不包含已停止的 ListActivityManager.RunningTaskInfo> taskInfoList = mActivityManager.getRunningTasks...* 以下为Android常见的优先级对应值,值越低,对应的优先级越高,进程就越不容易被系统杀死: * ActivityManager.RunningAppProcessInfo. *
领取专属 10元无门槛券
手把手带您无忧上云