Android2020年最新保活⽅案保活90%已适配
8.0,9.0,10.0(酷狗⾳乐)
因为公司app要保活。像酷狗⾳乐,⼀直在后台播放⾳乐。所以研究了下
系统如何杀死进程
内存阀值,不同进程优先级导致的不⼀样的阀值。
空进程:加快启动速度
郑子豪张碧晨
ADJ
红⾊部分是容易被回收的进程,属于android进程
绿⾊部分是较难被回收的进程,属于android进程
其他部分则不是android进程,也不会被系统回收,⼀般是ROM⾃带的app和服务才能拥有
如何查看某个进程的oom_adj数值呢?
oom_adj 存储在proc/PID/oom_adj⽂件中,其中PID是进程的id,直接 adb shell进⼊⼿机根⽬录查看这个⽂件即可。
演⽰⼀下:以我⾃⼰的项⽬为例,app中有两个进程,⼀个是主进程,另⼀个是运⾏service的进程取名为:remote。⾸先⽤android studio 查看每个进程的PID:
查看命令
如何在studio中,⼿动杀死某个进程?
logcat⾥⾯的红⾊按钮。
降低⾃⼰应⽤在退回后台时候的oom_adj值
oom_adj
表格:
查看adj的值:
【1】adb shell
【2】ps
【3】cat /proc/进程id/oom_adj
举例:cat /proc/20084/oom_adj
OOM_adj:在不同的前台和后台不⼀样
⽬前看
1.在前台是0,后台是3
oom_adj值:前台和后台不⼀样
===================================================
优化思路:
1. 提⾼进程的优先级,降低⾃⼰应⽤在退回后台时候的oom_adj值
2. 在进程被kill之后能够唤醒
3. 优化应⽤内存,正在进⾏中...
保活:1像素 ,后台播放⾳乐,前台进程
拉活:
保活分析:
1.通知栏(重点分析)
2.第三⽅推送(no)
不打包push模块。//include ':push'
3.TransferActivity(no)
4.友盟
分析⽅案:
1.先把yodo统⼀的⽂件,代码对⽐(ok)
2.⼀个⼀个注释掉。(ok)
3.看⽇志,是杀死的快?还是因为重新拉活了?
通过代码:发现yodo的锁屏
2.通知栏(ok)
3.⾃启动权限
通知栏
ServiceWakeKeepTicketProcess(ok)
ServiceWakeMainProcess(ok)
KeepAliveBlankVoice(ok)
KeepAliveTool
AlarmService
歌曲 曹操
CMainJobService
CSportJobService
RemoteKeepAlive
LocationMonitorService
RepeatWorker
Android 使⽤MarsDaemon进程常驻====DaemonConfigurations
⼴播AlarmStepReceiver
电量⼴播:
YODO保活办法:
1.AlarmManager ===[⽆⽤] =定时唤醒(它⽐Service和定时器更加节省资源)
AlarmReceiver
2.AlarmService==[⽆⽤](CMonitorSportService,CMonitorMainService<2个都不是service,⽤于绑定service>)===== (CSportJobService,CMainJobService,和前⾯对应)<JobService>======(JobScheduler拉活)
binderService()不⼀定是Activity
3.BatterReceiver(电量⼴播拉活)
4.GuardReceiver第三⽅的包活[⽆⽤]
同上SportGuardService
5.Worker--------WorkManager
6.StartSystemReceiver  开机⼴播[⽆⽤]
7.Rejoice ⾥⾯通知栏:keepAliveTime
锁屏:
startRunFromLockScreen()
Rejoice的⽅法moveToHome()
被回收:通过上报,数据库中跑步状态的保存
PhoneStateListener:
通知栏:
需要不停的刷新通知栏的ui,让系统以为你是前台进程,这样就不会杀掉你了
⽩⾊保活⽅案:
1.后台⾃启动
2.和加⼊“⼿机⽩名单”。
思路:
1.像素Activity
降低oom_adj的值。
当在后台的时候,⽤1像素
当在前台的时候,恢复
结果:在后台可以达到0
缺点:如果不是锁屏,不能达到这种效果
该⽅案适⽤场景: 本⽅案主要解决第三⽅应⽤及系统管理⼯具在检测到锁屏事件后⼀段时间内会杀死后台进程.适⽤于android所有版本。1像素Activity的特点: 需要设置该activity的style设置透明,在⼿机锁屏时start;在屏幕解锁时finish,主要作⽤就是在App退到后台之后且锁屏的时候启动⼀个看不见的Activity,造成⼀个该App没有回退到后台的假象,降低被杀的⼏率,伪代码如下:
protected void onCreate(Bundle savedInstanceState) {
protected void onCreate(Bundle savedInstanceState) {
/
/设定⼀像素的activity
//设定⼀像素的activity
Window window = getWindow();
Window window = getWindow();
window.setGravity(Gravity.START | Gravity.TOP);
window.setGravity(Gravity.START | Gravity.TOP);
WindowManager.LayoutParams params = Attributes(); WindowManager.LayoutParams params = Attributes();
params.x = 0;
params.x = 0;
params.y = 0;
params.y = 0;
params.height = 1;
params.height = 1;
params.width = 1;
params.width = 1;
最浪漫的事金志文
window.setAttributes(params);
window.setAttributes(params);
}
public void onReceive(final Context context, Intent intent) {
public void onReceive(final Context context, Intent intent) {
Log.i("ScreenStateReceiver", "---屏幕锁屏监听---");
贝多芬暴风雨
Log.i("ScreenStateReceiver", "---屏幕锁屏监听---");
if (action.equals(Intent.ACTION_SCREEN_OFF)) {
if (action.equals(Intent.ACTION_SCREEN_OFF)) {
//屏幕锁定,开启OnePixelActivity
//屏幕锁定,开启OnePixelActivity
} else if (action.equals(Intent.ACTION_SCREEN_ON)) {
else if (action.equals(Intent.ACTION_SCREEN_ON)) {
//屏幕解锁,finish OnePixelActivity
//屏幕解锁,finish OnePixelActivity
}
}
说起来很简单,但是还是有⼏个知识点需要注意下。
1、需要注册⼀个监听屏幕锁屏和截屏的BroadcastReceiver。
关于这⼀点有⼀个细节需要处理,为了放置⽤户快速 进⾏锁屏和截屏的切换操作,⽽导致OnePixelActivity频繁开关。需要⽤⼀个Handler 发送⼀个延迟消息处理最佳:香水有毒dj
private Handler mHandler;
private Handler mHandler;
private boolean isScreenOn = true;
李安 逝去的爱private boolean isScreenOn = true;
private PendingIntent  pendingIntent;
private PendingIntent  pendingIntent;
private List<ScreenStateListener> screenStateListeners = null;
private List<ScreenStateListener> screenStateListeners = null;
@Override
@Override
public void onReceive(final Context context, Intent intent) {
public void onReceive(final Context context, Intent intent) {
String action = Action();
String action = Action();
if (action.equals(Intent.ACTION_SCREEN_OFF)) {
if (action.equals(Intent.ACTION_SCREEN_OFF)) {