vvLavida / TechNotes

Issuses for coding summarize.
GNU General Public License v3.0
6 stars 3 forks source link

Android进程守护 #22

Open vvLavida opened 8 years ago

vvLavida commented 8 years ago

洗洗睡吧。 如果实在要做,建议引导用户添加白名单。

设备未ROOT情况下,大致的解决方案如下:

当系统内存非常紧张并且轮到 Service 进程被杀的时候,这时候在非 root 的 Android 手机/平板 都是无力回天的。一般来说系统杀掉 Service,过 5 - 10 秒会再次启动 Service(如果有应急机制)。

其实问题的实质就是:系统重启Service 后,如何保持与重启前一样?

设置 onStartCommand() 的返回值(这里牵扯到 Service 的启动方式)。onStartCommand() 有其中两个返回值: START_STICKY:kill 后会被重启,但重启后调用 onStartCommand(Intent,int,int),但是传进来的 Intent这个参数为 null; START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。

  • ​通过 startForeground将进程设置为前台进程,做前台服务,优先级和前台应用一个级别​,除非在系统内存非常缺,否则此进程不会被 kill

是的,用户能看见你。

  • 双进程Service:守护进程和主进程之间相互监视,其中一个Service被清理后,另外没被清理的进程可以立即重启进程

清理工具清理后无效。

  • QQ黑科技:在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死

仅能保护自己不被清理工具清理后台时杀死。

  • Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。鉴于目前提到的在Android-Service层做双守护都会失败,我们可以fork出c进程,多进程守护。死循环在那检查是否还存在:
  1. 用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。
  2. 在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。
  3. 主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。

    开源方案:NativeSubprocess 注意: Android 5.0上采用fork的方式是无法起作用的,当父进程被杀死的时候,对应fork出来的子进程会被系统主动调用waitpid将其停止并回收.在fork进程这个调用上,iOS也可以调用fork,但是只要你设备没有越狱,fork是直接返回错误的。

    • 联系厂商,加入白名单
vvLavida commented 8 years ago

微信Android客户端后台保活经验分享

Android进程保活招式大全

Android端外推送到底有多烦?

vvLavida commented 8 years ago

To Android Developer

Don't be evil. Android生态需要每个人的一份力。

如果老板问:『别人微信为什么可以?』的时候..

我们摆事实讲道理..举个栗子:

  • 我们的包名改成微信的包名,就可以了..