framework保持第三方app常驻


前言

1、在系统中去判断当前service是否还存在,如果已经不存在就再去通过startServiceAsUser 或startService 去启动自己的服务。
2、Framework根据包名来修改自己app的adj 让它的等级和优先级提高来保活。
3、在AMS的kill逻辑代码中根据包名把它过滤。
4、开机启动:service自启动大多数做法都是去监听开机广播:android.intent.action.BOOT_COMPLETED
但是有时候发现开机广播在开机后十几秒后才能收到,或者有时都不能收到开机播。达不到自己预期的效果。
下面是另一种实现方式,让自己的app成为persistent App,这种方式可以实现开机自启动和进程保活,它的启动时间是在开机广播(BOOT_COMPLETED)之前,用户可可以根据自己的需求选择适当的方式实现。


一、把app转为系统app,增加persistent属性

1、在自己的app源码中写好自己需要开机启动和保活的的service ;
2、在AndroidManifest.xml 配置application 的各个属性:
(1)coreApp=“true” //定义为coreApp
表示拥有该属性的app是核心app,并不表示其拥有系统权限;
作用:当开机检测到加密时,也会被解析启动。
如果不需要加密时也启动可以忽略。
(2)android:sharedUserId=“android.uid.system” //用系统签名的sytem app
(3)application android:name=“MyGpsApp” // application要有个名字,AS上自己生成默认是没有的。
(4)android:persistent=“true” //定义persistent属性
(5)android:directBootAware=“true” //可以直接启动
(6)android:process=“system” //让它跑在system进程
(7)<service……… //自己需要启动的service

二、framework修改

1.杀进程的时候过滤

代码如下(示例):

--- a/frameworks/base/services/core/java/com/android/server/am/ProcessList.java
+++ b/frameworks/base/services/core/java/com/android/server/am/ProcessList.java
@@ -2205,6 +2205,10 @@ public final class ProcessList {
                     // we don't kill persistent processes
                     continue;
                 }
+                if(packageName.equals("com.xxx.xxx")){
+                    Slog.i("xxx", "don't kill com.xxx.xxx " );
+                    continue;
+                }
                 if (app.removed) {
                     if (doit) {
                         procs.add(app);

2.在AMS中锁定

代码如下(示例):

--- a/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -7746,6 +7746,9 @@ public class ActivityManagerService extends IActivityManager.Stub
             try {
                 final List<ApplicationInfo> apps = AppGlobals.getPackageManager()
                         .getPersistentApplications(STOCK_PM_FLAGS | matchFlags).getList();
+
+                try{
+                    ApplicationInfo xxxapp= mContext.getPackageManager().getApplicationInfo("com.xxx.xxx", 0);
+                    apps.add(xxxapp);  
+                }catch (Exception ex) {
+                }       
                 for (ApplicationInfo app : apps) {
                     if (!"android".equals(app.packageName)) {

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuyewen288

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值