【发布时间】:2016-08-31 07:45:53
【问题描述】:
在android 4.4及以下,谁在启动时加载了一个原生应用(/system/bin/*),我认为文件init.rc负责,对吗?
那么如果原生应用程序崩溃(例如/system/bin/mediaserver)它会自动重启,那么问题是:谁负责应用程序的重启?有文件吗?
【问题讨论】:
在android 4.4及以下,谁在启动时加载了一个原生应用(/system/bin/*),我认为文件init.rc负责,对吗?
那么如果原生应用程序崩溃(例如/system/bin/mediaserver)它会自动重启,那么问题是:谁负责应用程序的重启?有文件吗?
【问题讨论】:
ActivityManagerService 重启原生应用。
当应用程序被activity manager service 重新启动时,在正常日志和/或事件日志中,logcat 中通常会出现一些喋喋不休
(logcat -b events).
更多信息:
如果您看到ActivityManagerService.finishForceStopPackageLocked() 方法的代码,则此方法会触发带有动作Intent.ACTION_PACKAGE_RESTARTED 的Intent。
它是通过各种方法调用的,例如:
ActivityManagerService.forceStopPackage()
IPackageDataObserveronRemoveCompleted.onRemoveCompleted()
所以在内部有一个在ActivityManagerService 中实现的PackageDataObserver,它会观察是否删除了任何包,如果需要重新启动它,则会使用Intent.ACTION_PACKAGE_RESTARTED 操作触发意图
每个包都使用ActivityManagerService.forceStopPackage()强制关闭,它知道要重新启动哪个包。
希望它能消除疑虑。
【讨论】: