为什么google apk 的adj为100
先说结论: 使用低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.unstableconsole:/ # 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相关推荐
- Google手机操作系统Android将100%开源
Google 最近宣称,他们未来的手机 操作系统"Android ",包含核心平台组件和开发设备所需的库,都将采用常用的开源协议来授权. 换句话说,Google Android将1 ...
- Google Chrome 75.0.3770.100 插件丰富且自带翻译的浏览器
Google Chrome 是爱奶酪找到的一款插件丰富且自带翻译的浏览器,它是一款专为现代互联网开发的网络浏览器,高速.简约而且安全. 应用预览 应用介绍 Chrome 浏览器是一款专为现代互联网开发 ...
- 下载正版的google apk 应用小技巧
1.在百度上搜索:google pay +应用名字 + google pay 2.搜索打此应用,在地址栏(网址栏)复制 此应用的包名. 3.打开此网页http://apps.evozi.com/apk ...
- Android 系统(248)---解读Android进程优先级ADJ算法
本文基于原生Android P源码来解读进程优先级原理,基于篇幅考虑会精炼部分代码 一.概述 1.1 进程 Android框架对进程创建与管理进行了封装,对于APP开发者只需知道Android四大组件 ...
- 如何从Google Play下载应用到电脑
Google Play作为全球最大的Android应用商店,拥有国内外最优秀的第三方应用程序,其海量的应用库不得不说是一大亮点.据去年统计,Google Play应用数量超过100万款,相比国内同平台 ...
- 机器学习:使用scikit-learn的线性回归预测Google股票
这是机器学习系列的第一篇文章. 本文将使用Python及scikit-learn的线性回归预测Google的股票走势.请千万别期望这个示例能够让你成为股票高手.下面按逐步介绍如何进行实践. 准备数据 ...
- Cocos Creator实现Google Play obb 分包
背景 Google Play 对 APK 大小限制是 100 M,但是游戏稍微重度一点,资源就会很多,包体很容易就超过了这个限制:Google Play 提供了 obb 分包方案,来解决包体问题. O ...
- Google创始人公开信:AI暖春和黑暗面
整理 | Just 出品 | AI科技大本营(公众号ID:rgznai100) 自 2004 年以来,Google 创始人每年都要对外发布一份公开信,可以说这已经成了佩奇和布林两位创始人的一个传统 ...
- Chrome 100发布:启用全新图标,修复28个安全漏洞
整理 | 于轩 出品 | CSDN(ID:CSDNnews) 自谷歌于2008年9月发布Chrome浏览器首个测试版以来,十三年后,Chrome版本终于达到了三位数. 十多年来,谷歌每隔六周就会发布重 ...
最新文章
- WPF中ControlTemplate和DataTemplate的区别
- php并发访问排队_php解决高并发问题
- html子布局不超出父布局,详解flex布局中保持内容不超出容器的解决办法
- java 数字的位数_Java判断数字位数的方法总结
- java gc 可以对方法区进行回收_浅谈 Java 之 GC
- 代码复杂度降级的几个实例
- 加权最小二乘法的原理讲解
- Jerry Wang 2014年1月3日top liked SCN博客
- 【渝粤教育】 广东开放大学 21秋期末考试物业经营管理实务10123k2
- kotlin 字符串_Kotlin程序确定字符串是否具有所有唯一字符
- android.view.WindowManager$BadTokenException
- c语言24点游戏代码回法,C语言解24点游戏程序
- mxnet导入图像数据
- 系统学习机器学习之随机场(二)--MEMM
- java Comparable 和 Cloneable接口
- 面色红润从滋补五脏开始
- Linux监控工具vmstat命令详解
- 最优化方法:三、线性规划
- html5 3d 图片动画制作软件,9款令人惊叹的HTML5 3D动画应用
- 合并excel单元格的两种方法