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)) {