ANDROID重启服务(Android重启服务)

访客2024-03-15 18:55:0368

大家好,感谢邀请,今天来为大家分享一下ANDROID重启服务的问题,以及和Android重启服务的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

Android手机软重启adb命令是什么

运行设备的shell(命令行)。

管理模拟器或设备的端口映射。

计算机和设备之间上传/下载文件。

将本地apk软件安装至模拟器或android设备。

ADB一个客户端-服务器端程序,其中客户端是用来操作的电脑,服务器端是android设备。

扩展资料

1、查看设备*adbdevices。这个命令是查看当前连接的设备,连接到计算机的android设备或者模拟器将会列出显示。

2、安装软件:adbinstall<apk文件路径>。

这个命令将指定的apk文件安装到设备上。

3、卸载软件

adbuninstall<软件名>。

adbuninstall-k<软件名>。

如果加-k参数,为卸载软件但是保留配置和缓存文件。

参考资料来源:百度百科-ADB

Android如何通过代码重启应用程序

楼上的方法是重启activity,不过也只能这样,代码是在应用程序内部执行的,应用程序都关了,还怎么运行重启的代码,你还是慢慢自己微调,达到类似重启的效果吧

android 关机重启流程

https://developer.android.com/intl/zh-CN/reference/android/os/PowerManager.html

在PowerManager的API文档中,给出了一个关机/重启接口:

publicvoidreboot(Stringreason)

对于这个接口的描述很简单,就是几句话。

接口的作用就是重启设备,而且,就算重启成功了也没有返回值。

需要包含REBOOT权限,也就是android.permission.REBOOT

唯一参数reason代表需要的特定重启模式,比如recovery,当然也可以为null。

1.frameworks/base/core/java/android/os/PowerManager.java

2.frameworks/base/core/java/android/os/IPowerManager.aidl

3.frameworks/base/services/java/com/android/server/PowerManagerService.java

4.frameworks/base/services/java/com/android/server/pm/ShutdownThread.java

5.frameworks/base/services/jni/com_android_server_PowerManagerService.cpp

---------------------》

6.system/core/libcutils/android_reboot.c

7.bionic/libc/unistd/reboot.c

8.__reboot通过syscall来到内核

9.kernel/sys.c

frameworks/base/core/java/android/os/PowerManager.java

mService为IPowerManagerBinder接口服务。

frameworks/base/core/java/android/os/IPowerManager.aidl

frameworks/base/services/java/com/android/server/PowerManagerService.java

frameworks/base/services/java/com/android/server/pm/ShutdownThread.java

这里说明是需要重启,且不是安全模式,重启参数为传递下来的reason,shutdownInner的confirm参数是用来设置是否有确认提示框的,通过reboot接口调用重启是没有的,为false。

重启的实现在run()中,因为ShutdownThread是Thread的扩展,所以run会自动运行。

frameworks/base/services/java/com/android/server/pm/ShutdownThread.java

在重启前会将重启原因写入sys.shutdown.requested,如果没有则为空,如果是安全模式还会将persist.sys.safemode置1,之后会进行一些关机前的预处理,关闭ActivityManager以及MountService,最终调用rebootOrShutdown进行关机操作。

如果确认重启,则调用PowerManagerService的lowLevelReboot函数,参数就是传递下来的reason,稍后分析。如果不是重启,即mReboot=false,那就是需要关机了,在shutdown函数中就能够知道。

frameworks/base/services/java/com/android/server/PowerManagerService.java

frameworks/base/services/jni/com_android_server_PowerManagerService.cpp

可以看到无论是关机还是重启,都是调用android_reboot来实现的,只是参数不一样而已。

system/core/libcutils/android_reboot.c

以rebootrecovery为例,arg即为recovery,所在在第五步的时候会传入ANDROID_RB_RESTART2。到了android_reboot函数中,会看到这样的定义#ifdefRECOVERY_PRE_COMMAND,即属于重启前会执行的命令,如果定义了就会执行。

下面也是做了一些关机重启前的预处理工作,sync()作用是将缓存中的信息写入磁盘,以免程序异常结束导致文件被损坏,linux系统关机前会做几次这样的动作;而remount_ro()作用是通过调用emergency_remount()强制将文件系统挂载为只读,不再允许任何写入操作,同时会通过检查/proc/mounts的设备状态来确认是否当前的所有写入工作已经完成,这个检查过程是阻塞操作。

接下来才是对参数的解析处理:

1)普通重启ANDROID_RB_RESTART,reason=RB_AUTOBOOT;

2)关机ANDROID_RB_POWEROFF,无需reason,直接调用reboot进行关机;

3)带参数的特殊重启ANDROID_RB_RESTART2,reason将为默认值-1

这里又出现一个#ifdefRECOVERY_PRE_COMMAND_CLEAR_REASON,如果定义了它,则无论上层传下来的参数是什么样的,最终都只是普通重启而已。定义它的方式是在BoardConfig.mk中加入TARGET_RECOVERY_PRE_COMMAND_CLEAR_REASON:=true,应该有厂商会喜欢这么做的,毕竟除了普通重启,都可能带给用户一定的风险。

最后会对reason进行一个检测,那么通过上边的分析,其实只有带参数的特殊重启才会为-1,而不等于-1的情况中有普通重启和关机,而关机已经自行解决了……所以,不等于-1的情况到了这里也只有普通重启了。最终这里就是区分普通重启与特殊重启的地方了。这里再插入一个问题,其他的几个cmd都是什么值呢?答案在bionic/libc/include/sys/reboot.h中:

reboot(reason)->reboot(RB_AUTOBOOT)->__reboot(LINUX_REBOOT_MAGIC1,LINUX_REBOOT_MAGIC2,LINUX_REBOOT_CMD_RESTART,NULL)

__reboot通过syscall来到内核bionic/libc/arch-arm/syscalls/__reboot.S

其被指定了一个固定的偏移量,在被调用的时候就是通过这个偏移量去内核中寻找对应的入口的,由此可见,内核中一定有着相同的定义,否则将不能成功调用。内核中对syscall偏移量的定义在内核源码中的arch/arm/include/asm/unistd.h,相关信息完全一致。

已经找到了内核中的对应映射,那么下一步就要去找寻真正的实现函数了,在include/asm-generic/unistd.h中可以找到内核对__NR_reboot的syscall函数映射,即

同时,能够发现如此温馨的一幕,内核已经指引我们下一步该去哪里寻找sys_reboot,即kernel/sys.c。

include/linux/syscalls.h

与__reboot的调用参数一致。

进入sys.c文件后,并没有找到名为sys_reboot的函数,而通过仔细查找,发现一个很有趣的函数,其定义为SYSCALL_DEFINE4(reboot,int,magic1,int,magic2,unsignedint,cmd,void__user*,arg),对比__reboot的参数,能够符合。究竟是不是这个函数?

同样在include/linux/syscalls.h文件中,能够找到这样几个定义:

而pm_power_off为空的话,就把用户的关机命令转换为挂起:

arch/arm/kernel/process.c

pm_power_off=msm_pm_power_off;

SYSCALL_DEFINE4(reboot,int,magic1,int,magic2,unsignedint,cmd,void__user*,arg)

这个过程是用reboot_mutex互斥锁来进行保护的,以保证同一时间只可能有一个解析过程,避免冲突。

bionic/libc/include/sys/reboot.h中可以看到android定义的启动方式

RESTART

POWER_OFF

RESTART2

对框架进行赋值,qcom平台845上已经不是这函数,自己查找

arm_pm_restart=msm_pm_restart;

下面是qcom实现,每个平台不同

可以在跟踪这个流程的过程中会发现,确实是有存在关机的相关接口的。那么关机该怎么用呢?

frameworks/base/services/java/com/android/serverBatteryService.java

重启方式:最后就是设定寄存器,Uboot解析不同寄存器的值进入不同的启动模式

recovery如果传下来的字符串是recovery那么,就在RTC寄存器里设置某个特定值,当uboot里读取RTC寄存器的时候如果获取了这个特定值,那就可以起recovery这个动作了。

Ref:https://blog.csdn.net/leerobin83/article/details/7162751

上面主要讲到流程,在实际开发中,主动调用系统开机关机如何做

(Ref:https://blog.csdn.net/luzhenrong45/article/details/42092007)

一.发送系统广播方式

二.通过init.rc启动系统服务来运行sh文件

三.Runtime调用Linux-shell

四.PowerManagerreboot以及反射调用PowerManagerServiceshutdown

五.使用ShutdownThread(尝试不成功,但想法觉得可行)

Intent.java位于源码/frameworks/base/core/java/android/content/Intent.java下面

脚本方式,实际都是基于指令的

使用PowerManager或ShutdownThread都是基于关机流程

ANDROID重启服务和Android重启服务的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

控制面板

您好,欢迎到访网站!
  查看权限

最新留言