您的位置:首页 > 移动开发 > Android开发

开机自启动和多进程守护

2016-03-15 20:36 549 查看
开机自启动和多进程守护

开机自启动

基本原理

Android系统在开机的时候会发出一个广播(BOOT_COMPLETED)。应用程序可以接收这个广播,然后启动应用的相关服务。广播接收器必须静态注册,设置在Manifest的xml配置中,因为xml里面配置的广播接收器不随应用的退出而退出的。

实现方式

l  设置广播接收器

        publicclass BootCompletedReceiverextends
BroadcastReceiver{
               publicvoid
onReceive(Context context, Intent intent) {
                    //TODO complete the logic of the program

                }
               }
 

l  在Manifest中注册监听

在AndroidManifest.xml中设置监听

<receiver android:name=".BootCompletedReceiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

<intent-filter>

    <action android:name="android.intent.action.BOOT_COMPLETED"/>
    <category android:name="android.intent.category.HOME"/>
</intent-filter>

</receiver>
 

l  设置接收权限

在AndroidManifest.xml中设置接收自启动广播的权限。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

 

 

 

 

 

 

多进程守护

基本原理

Android系统中防杀技术主要包括:

1.     Service设置成START_STICKY,kill 后会被重启(等待5秒左右)

2.     通过 startForeground将进程设置为前台进程,做前台服务,优先级和前台应用相同。

3.     双进程Service:让2个进程互相保护,其中一个Service被清理后,另外没被清理的进程可以立即重启进程

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

5.     通过系统漏洞获取ROOT权限,然后设置应用程序为系统应用。

上述方式都存在一定问题,Android service的双守护基本会失败,其他技术只能提高不被杀死的概率,在程序进程被杀死后,很难恢复。另一个较好的思路是多进程守护。

 

Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。可以通过JNI编程,fork出c进程,实现多进程守护。

l  具体的思路如下:
用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。

l  在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。

l  主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。

 

可以参考:

http://coolerfall.com/android/android-app-daemon/

https://github.com/Coolerfall/Android-AppDaemon

http://www.zhihu.com/question/29826231


 


 
 

实现方式

l  将library程序绑定到需要进行进程守护的程序中;

 

 


 

 

 


 

 

       通过File->New->Import Module,导入Library

l  编写守护服务,并通过Daemon.run(this, DaemonService.class, Daemon.INTERVAL_ONE_MINUTE);启动守护。

public class DaemonServiceextends
Service {

    @Override

    public void onCreate() {

        super.onCreate();

        Log.e("DaemonService","DaemonServiceonCreate");

        Daemon.run(this, DaemonService.class, Daemon.INTERVAL_ONE_MINUTE);}
}
 

l  进行测试

 

 


<
4000
br />

下载链接:
http://download.csdn.net/detail/liumangshan1234/9462467
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息