jQuery鼠标指针特效

Android 11.0 Framework AMS服务

Android 11.0 Framework

ActivityManagerService.java == AMS 服务 它是Android系统的核心,
它管理了系统的四大组件:Activity、Service、ContentProvider、Broadcast。
它除了管理四大组件外,同时也负责管理和调度所有的进程。
参考链接AMS

AMS 进程部分知识1

进程在AMS中由一个ProcessRecord来表示,该对象记录了一个进程的所有信息.

//启动Activity的时候,如果当前Activity的宿主进程尚未创建,则需要先创建对应的进程
ActivityStackSupervisor::startSpecificActivity()

//realStartActivityLocked,正如方法名字面上的意义,该方法是真正开启Activity的地方
ActivityStackSupervisor::realStartActivityLocked()

//启动一个Service组件的时候,Service组件的宿主进程尚未创建,需要先创建对应的进程
ActiveServices::startServiceInnerLocked() --> ActiveServices::bringUpServiceLocked()

//停止某个服务进程
ActiveServices::stopServiceLocked(ServiceRecord service)
{
    // not kill a service (ServiceRecord.java -->final ComponentName name; (// service component.))
    if(service.name.getPackageName().equals("com.xxx.vito")){
            return;
        }
}

AMS 进程部分知识2

AMS自己会根据一些逻辑来杀死部分进程, App也会主动调用ActivityManager的接口来杀死指定进程,
当进程侥幸逃脱AMS或者应用的屠刀后,就会被保存到内存中。
此时这些进程就会交由LowMemoryKiller来监控了,这些进程的生死就转移到了LMK的手上.
Android 进程分为6个等级,每个等级对应不同的内存阀值。
当lmkd监控的系统内存小于某一个阀值的时候,就会开始查杀小于或等于对应优先级的进程,当释放的内存达到最大阀值之后就停止查杀!

前台进程 FOREGROUND_APP_ADJ (0)
可感知进程 PERCEPTIBLE_APP_ADJ (200) 

//仅启动支持加密的持久应用程序 == 添加开机启动的app
systemReady() ---> startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE)--->ProcessRecord addAppLocked(...)
{

if ((info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) {
            app.setPersistent(true);
            app.maxAdj = ProcessList.PERSISTENT_PROC_ADJ;
        }
        
 //添加开机启动的前台app       
if((info.packageName).contains("com.xxx.vito")){
            app.setPersistent(false);
            app.maxAdj = ProcessList.FOREGROUND_APP_ADJ;
        }

}

Android进程的优先级 值越小优先级越高,小于0的优先级的进程基本上不会被杀死的,这些都是系统的重要进程!

NATIVE_ADJ(-1000):是由init进程fork出来的Native进程,并不受system管控;

SYSTEM_ADJ(-900):是指system_server进程;

PERSISTENT_PROC_ADJ(-800): 是指在AndroidManifest.xml中申明android:persistent=”true”的系统(即带有FLAG_SYSTEM标记)进程,persistent进程一般情况并不会被杀,即便被杀或者发生Crash系统会立即重新拉起该进程。

PERSISTENT_SERVICE_ADJ(-700):是由startIsolatedProcess()方式启动的进程,或者是由system_server或者persistent进程所绑定(并且带有BIND_ABOVE_CLIENT或者BIND_IMPORTANT)的服务进程

前台进程 FOREGROUND_APP_ADJ (0)
前台进程是指存在有组件正和用户进行交互的app的进程,也称为Active进程)。
比如你打开某个app时,它的界面显示在前台,用户可以跟它进行交互,它就是前台进程。
和用户交互的进程,不到万不得已不能杀死。
如果一个进程满足以下任一条件,即视为前台进程:
(1)托管处于活动状态的Activity,也就是说,它们位于前台并对用户事件进行响应,此时的情形为响应了Activity中的onResume()生命周期方法,但没有响应onPause()。
(2)托管正在执行onReceive()方法处理事件程序的BroadcastReceiver。
(3)托管正在执行onStart()、onCreate()或onDestroy()事件处理程序的Service。
(4)托管正在运行且被标记为在前台运行的Service,即调用了该Service的startForeground()方法。
(5)托管某个Service,且该Service正绑定在用户正在交互的Activity的Service,即该Activity正处于活动状态。

可见进程 VISIBLE_APP_ADJ (100)
如果一个进程满足以下任一条件,即视为可见进程:
(1)托管不在前台、但仍对用户可见的Activity(已调用其onPause()方法)。
例如:如果前台Acitivty启动了一个对话框,或者启动了一个非全屏,亦或是一个透明的Activity,允许在其后显示上一个Activity,则可能会发生这种情况,这类Activity不在前台运行,也不能对用户事件作出反应。
(2)托管绑定到可见Activity的Service
可见进程被视为是极其重要的进程,这类进程的数量也很少,只有在资源极度匮乏的环境下,为保证前台进程继续执行时才会终止。

可感知进程 PERCEPTIBLE_APP_ADJ (200)
如后台播放音乐,视频的进程

备份进程 BACKUP_APP_ADJ (300)
处于备份过程中的进程

CACHED_APP_MIN (900)
缓存进程ADJ最小值

CACHED_APP_MAX (906)
缓存进程ADJ最大值

ActivityTaskManagerService.java
//Launcher  activity 启动流程-->
ActivityTaskManagerService :: startActivity(...) -->startActivityAsUser(...)-->ActivityStarter::execute()

//真正的开启Activity
ActivityStack::resumeTopActivityUncheckedLocked(...) --->ActivityStackSupervisor::startSpecificActivity()
AMS 常用函数范例
private String getTopActivityPackageName() {
        ActivityManager mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);
        if (rti.size() <= 0) return "";
        Log.d("tww", "getTopActivityPackageName: " + rti.get(0).topActivity.getPackageName());
        return rti.get(0).topActivity.getPackageName();
    }


private void PopBgAppFromStack(String packagename) {
        ActivityManager mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> rti = mActivityManager.getRunningTasks(20);
        int rtiSize = rti.size();
        int i = 0;
        for (i = 0; i < rtiSize; i++) {
            if (rti.get(i).baseActivity.getPackageName().contains(packagename)) {
                mActivityManager.moveTaskToFront(rti.get(i).id, 0, null);
                break;
            }
        }
    }
posted @ 2024-02-26 15:05  僵小七  阅读(51)  评论(0编辑  收藏  举报