先说结论: 使用低adj的apk使用bindService的方式启动新的apk,就可以使新apk的adj值实现100。

1 google gms的apk adj是100

console:/ # ps -A | grep gms
u0_a40        1276   382 1251444  58220 do_epoll_wait       0 S com.google.android.gms.persistent
u0_a40        1438   382 1366508  67448 do_epoll_wait       0 S com.google.android.gms
u0_a40        3309   382 1217588  36128 do_epoll_wait       0 S com.google.android.gms.unstable

console:/ # cat /proc/1276/oom_score_adj
100
console:/ # cat /proc/1438/oom_score_adj
100
console:/ # cat /proc/3309/oom_score_adj
100

2 当kill掉1276 process, ams会自动启动新persistent进程,其adj也是100

是因为一个service(PersistentBoundBrokerService) 启动的这个process

D Zygote  : Forked child process 4919
 I ActivityManager: Start proc 4919:com.google.android.gms.persistent/u0a40 for service {com.google.android.gms/com.google.android.gms.chimera.PersistentBoundBrokerService}

130|console:/ # cat /proc/4919/oom_score_adj
100

3  通过dumpsys activity p  查找到com.google.android.gms.persistent

显示其oom adj为100

oom adj: max=1001 curRaw=100 setRaw=100 cur=100 set=100,

看到有PersistentBoundBrokerService,是一个servicerecord

*APP* UID 10040 ProcessRecord{1221e37 4919:com.google.android.gms.persistent/u0a40}
    user #0 uid=10040 gids={2001, 1005, 3002, 3003, 3001, 3007, 1007, 3006, 50040, 20040, 9997}
    mRequiredAbi=armeabi-v7a instructionSet=arm
    class=co.g.App
    manageSpaceActivityName=co.g.Space
    dir=/data/app/~~OVDie3juakjbdsqvQZe_3Q==/com.google.android.gms-nQid-e3R-a4baq8BQGab8Q==/base.apk publicDir=/data/app/~~OVDie3juakjbdsqvQZe_3Q==/com.google.android.gms-nQid-e3R-a4baq8BQGab8Q==/base.apk data=/data/user/0/com.google.android.gms
    packageList={com.google.android.gms}
    compat={320dpi always-compat}
    thread=android.app.IApplicationThread$Stub$Proxy@167737e
    pid=4919
    lastActivityTime=-7s450ms
    startSeq=86
    mountMode=DEFAULT
    lastPssTime=-7s510ms pssProcState=3 pssStatType=0 nextPssTime=+33m37s435ms
    lastPss=51MB lastSwapPss=570KB lastCachedPss=0.00 lastCachedSwapPss=0.00 lastRss=115MB
    trimMemoryLevel=0
    procStateMemTracker: best=2 (2=2 5.0625x)
    lastRequestedGc=-39m30s39ms lastLowMemory=-39m30s39ms reportLowMemory=false
    reportedInteraction=true time=-7s565ms
    adjSeq=4212 lruSeq=1425
    oom adj: max=1001 curRaw=100 setRaw=100 cur=100 set=100
    mCurSchedGroup=2 setSchedGroup=2 systemNoUi=false
    curProcState=3 mRepProcState=3 setProcState=3 lastStateTime=-22m48s588ms
    curCapability=---N setCapability=---N
    allowStartFgsState=5
    cached=false empty=true
    hasStartedServices=true
    Services:
      ......
      - ServiceRecord{df148bc u0 com.google.android.gms/.chimera.PersistentBoundBrokerService}
      ......
    mConnections:
      - ConnectionRecord{d763b9a u0 CR WACT CAPS com.google.android.gms/com.google.android.location.internal.GoogleLocationManagerService:@31d8845}
      ......
    lastProviderTime=-3m11s647ms
    Published Providers:
      - com.google.android.gms.auth.account.be.accountstate.AccountStateContentProvider
        -> ContentProviderRecord{fb0c0df u0 com.google.android.gms/.auth.account.be.accountstate.AccountStateContentProvider}
      ......
    Connected Providers:
      - 3ea4a4d/com.android.providers.settings/.SettingsProvider->4919:com.google.android.gms.persistent/u0a40 s1/1 u0/0 +39m29s753ms
    mReceivers:
      - ReceiverList{164aa11 4919 com.google.android.gms.persistent/10040/u0 remote:5955a38}
      ......
    lastCompactTime=0 lastCompactAction=0
    isFreezeExempt=false isPendingFreeze=false isFrozen=false
    BoundClientUids:[10041, 10040, 10039, 1000]
     Configuration={1.0 ?mcc?mnc [en_US] ldltr sw540dp w960dp h540dp 320dpi lrg long land television night -touch -keyb/v/h dpad/v winConfig={ mBounds=Rect(0, 0 - 1920, 1080) mAppBounds=Rect(0, 0 - 1920, 1080) mMaxBounds=Rect(0, 0 - 1920, 1080) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} s.6 fontWeightAdjustment=0}
     OverrideConfiguration={0.0 ?mcc?mnc ?localeList ?layoutDir ?swdp ?wdp ?hdp ?density ?lsize ?long ?ldr ?wideColorGamut ?orien ?uimode ?night ?touch ?keyb/?/? ?nav/? winConfig={ mBounds=Rect(0, 0 - 0, 0) mAppBounds=null mMaxBounds=Rect(0, 0 - 0, 0) mWindowingMode=undefined mDisplayWindowingMode=undefined mActivityType=undefined mAlwaysOnTop=undefined mRotation=undefined} ?fontWeightAdjustment}
     mLastReportedConfiguration={1.0 ?mcc?mnc [en_US] ldltr sw540dp w960dp h540dp 320dpi lrg long land television night -touch -keyb/v/h dpad/v winConfig={ mBounds=Rect(0, 0 - 1920, 1080) mAppBounds=Rect(0, 0 - 1920, 1080) mMaxBounds=Rect(0, 0 - 1920, 1080) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} s.6 fontWeightAdjustment=0}

4  然后查找这个PersistentBoundBrokerService  service是谁使用或者绑定的呢

同样命令  dumpsys activity p, 看到是system process 与PersistentBoundBrokerService有serviceConnection。

*PERS* UID 1000 ProcessRecord{8489dca 742:system/1000}
    user #0 uid=1000 gids={}
    mRequiredAbi=null instructionSet=null
    dir=/system/framework/framework-res.apk publicDir=/system/framework/framework-res.apk data=/data/system
    packageList={com.android.networkstack.inprocess, android, com.android.providers.settings, com.android.networkstack.tethering.inprocess, com.android.location.fused}
    compat=null
    thread=android.app.ActivityThread$ApplicationThread@a111319
    pid=742
    lastActivityTime=-3m27s765ms
    persistent=true removed=false
    startSeq=0
    mountMode=NONE
    lastPssTime=-22m41s81ms pssProcState=0 pssStatType=1 nextPssTime=+27m55s995ms
    lastPss=87MB lastSwapPss=12MB lastCachedPss=0.00 lastCachedSwapPss=0.00 lastRss=123MB
    trimMemoryLevel=0
    procStateMemTracker: best=0 (0=0 7.59375x)
    lastRequestedGc=-- lastLowMemory=-- reportLowMemory=false
    reportedInteraction=true time=-6m54s951ms
    adjSeq=4212 lruSeq=1
    oom adj: max=-900 curRaw=-900 setRaw=-900 cur=-900 set=-900
    mCurSchedGroup=2 setSchedGroup=2 systemNoUi=true
    curProcState=0 mRepProcState=0 setProcState=0 lastStateTime=-1h3m44s670ms
    curCapability=LCMN setCapability=LCMN
    allowStartFgsState=0
    cached=false empty=false
    Services:
      - ServiceRecord{154c252 u0 com.android.networkstack.tethering.inprocess/com.android.networkstack.tethering.TetheringService}
      - ServiceRecord{c8f2fab u0 com.android.networkstack.inprocess/com.android.server.NetworkStackService}
    mConnections:
      ......
      - ConnectionRecord{249ecaf u0 CR FGS com.google.android.gms/.chimera.PersistentBoundBrokerService:@c5dac8e}
      ......

5 ConnectionRecord的参数  CR 和FGS

ConnectionRecord{249ecaf u0 CR FGS com.google.android.gms/.chimera.PersistentBoundBrokerService:@c5dac8e}

if ((flags&Context.BIND_AUTO_CREATE) != 0) {
            sb.append("CR ");
        }

if ((flags&Context.BIND_FOREGROUND_SERVICE) != 0) {
            sb.append("FGS ");
        }

6 所以AMS 设置一个apk的adj时会check service对应的serviceConnection, 比较serviceConnection对端的adj,给新apk设置一个合适的adj。

根据serviceConnection设置新apk的adj值的code在OomAdjuster.java,原理OomAdjuster.md中有介绍

frameworks/base/services/core/java/com/android/server/am/OomAdjuster.md

frameworks/base/services/core/java/com/android/server/am/OomAdjuster.java

    @GuardedBy({"mService", "mProcLock"})private boolean computeOomAdjLSP(ProcessRecord app, int cachedAdj,ProcessRecord topApp, boolean doingAll, long now, boolean cycleReEval,boolean computeClients) {......ArrayMap<IBinder, ArrayList<ConnectionRecord>> serviceConnections = s.getConnections();for (int conni = serviceConnections.size() - 1;conni >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ|| schedGroup == ProcessList.SCHED_GROUP_BACKGROUND|| procState > PROCESS_STATE_TOP);conni--) {......}......}

为什么google apk 的adj为100相关推荐

  1. Google手机操作系统Android将100%开源

    Google 最近宣称,他们未来的手机 操作系统"Android ",包含核心平台组件和开发设备所需的库,都将采用常用的开源协议来授权. 换句话说,Google Android将1 ...

  2. Google Chrome 75.0.3770.100 插件丰富且自带翻译的浏览器

    Google Chrome 是爱奶酪找到的一款插件丰富且自带翻译的浏览器,它是一款专为现代互联网开发的网络浏览器,高速.简约而且安全. 应用预览 应用介绍 Chrome 浏览器是一款专为现代互联网开发 ...

  3. 下载正版的google apk 应用小技巧

    1.在百度上搜索:google pay +应用名字 + google pay 2.搜索打此应用,在地址栏(网址栏)复制 此应用的包名. 3.打开此网页http://apps.evozi.com/apk ...

  4. Android 系统(248)---解读Android进程优先级ADJ算法

    本文基于原生Android P源码来解读进程优先级原理,基于篇幅考虑会精炼部分代码 一.概述 1.1 进程 Android框架对进程创建与管理进行了封装,对于APP开发者只需知道Android四大组件 ...

  5. 如何从Google Play下载应用到电脑

    Google Play作为全球最大的Android应用商店,拥有国内外最优秀的第三方应用程序,其海量的应用库不得不说是一大亮点.据去年统计,Google Play应用数量超过100万款,相比国内同平台 ...

  6. 机器学习:使用scikit-learn的线性回归预测Google股票

    这是机器学习系列的第一篇文章. 本文将使用Python及scikit-learn的线性回归预测Google的股票走势.请千万别期望这个示例能够让你成为股票高手.下面按逐步介绍如何进行实践. 准备数据 ...

  7. Cocos Creator实现Google Play obb 分包

    背景 Google Play 对 APK 大小限制是 100 M,但是游戏稍微重度一点,资源就会很多,包体很容易就超过了这个限制:Google Play 提供了 obb 分包方案,来解决包体问题. O ...

  8. Google创始人公开信:AI暖春和黑暗面

     整理 | Just 出品 | AI科技大本营(公众号ID:rgznai100) 自 2004 年以来,Google 创始人每年都要对外发布一份公开信,可以说这已经成了佩奇和布林两位创始人的一个传统 ...

  9. Chrome 100发布:启用全新图标,修复28个安全漏洞

    整理 | 于轩 出品 | CSDN(ID:CSDNnews) 自谷歌于2008年9月发布Chrome浏览器首个测试版以来,十三年后,Chrome版本终于达到了三位数. 十多年来,谷歌每隔六周就会发布重 ...

最新文章

  1. WPF中ControlTemplate和DataTemplate的区别
  2. php并发访问排队_php解决高并发问题
  3. html子布局不超出父布局,详解flex布局中保持内容不超出容器的解决办法
  4. java 数字的位数_Java判断数字位数的方法总结
  5. java gc 可以对方法区进行回收_浅谈 Java 之 GC
  6. 代码复杂度降级的几个实例
  7. 加权最小二乘法的原理讲解
  8. Jerry Wang 2014年1月3日top liked SCN博客
  9. 【渝粤教育】 广东开放大学 21秋期末考试物业经营管理实务10123k2
  10. kotlin 字符串_Kotlin程序确定字符串是否具有所有唯一字符
  11. android.view.WindowManager$BadTokenException
  12. c语言24点游戏代码回法,C语言解24点游戏程序
  13. mxnet导入图像数据
  14. 系统学习机器学习之随机场(二)--MEMM
  15. java Comparable 和 Cloneable接口
  16. 面色红润从滋补五脏开始
  17. Linux监控工具vmstat命令详解
  18. 最优化方法:三、线性规划
  19. html5 3d 图片动画制作软件,9款令人惊叹的HTML5 3D动画应用
  20. 合并excel单元格的两种方法

热门文章

  1. 蔡文胜创业周末演讲实录
  2. 嵌入式:人机交互接口设计详解
  3. canvas清除画布方法
  4. 关于我在字节跳动青训营做了个抖音这件事
  5. 新扬新材冲刺科创板:年营收6.6亿 李俊家族控制49%股权
  6. 【cocos2d-x从c++到js】注册函数
  7. 阵列天线副瓣电平matlab,MATLAB阵列天线之切比雪夫低副瓣阵列设计
  8. 华丽成长为IT高富帅、IT白富美(十一)
  9. 在n个球中,任意取出m个(不放回),求有多少种不同取法。(递归学习)
  10. 影刀RPA——重新定义我们的工作方式