gpt4 book ai didi

android - adb shell top 在前台显示我的应用程序,但实际上它在后台

转载 作者:太空狗 更新时间:2023-10-29 16:34:20 32 4
gpt4 key购买 nike

我的 Android 应用程序包含一些绑定(bind)到某个进程的服务。

我发现 adb shell top -n 1 返回:

PID PR CPU% S  #THR     VSS     RSS PCY UID      Name
31647 0 1% S 70 1733640K 98960K bg u0_a132 com.my.app.dev
31727 0 1% S 29 1523892K 62924K fg u0_a132 com.my.app.dev:myService

即使我的应用程序停留在后台,为什么 top PCY 告诉 'fg' a.e.前景?

有人可以阐明这个问题吗?

这是我的 Manifest.xml:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.app.dev"
android:versionName="4.0.1.6700000"
android:versionCode="5033" >

<uses-sdk android:minSdkVersion="10"
android:targetSdkVersion="16" />





<application android:icon="@drawable/icon"
android:label="@string/config_app_name"
android:theme="@style/Theme.NoActionBarAppCompat"
android:name="com.my.app.Mine" >

<!-- we would prefer the launchMode to be standard, but it causes a lot of problems. -->
<activity android:name="com.my.ui.main.MineApp"
android:label="@string/config_app_name"
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
android:theme="@style/Theme.Translucent.NoActionBarAppCompat" >

<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="mine.action.HomeActivity" />

<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>



<meta-data android:name="com.google.android.maps.v2.API_KEY"
android:value="xxxxxx" />

<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />



<uses-library android:name="com.google.android.maps" />




<service android:name="com.my.engine.logic.EngineService"
android:process=":myService">
<intent-filter>

<action android:name="com_my_RemoteService" />
<action android:name="com_my_EngineService" />
</intent-filter>
</service>





<receiver
android:name="com.my.engine.analytics.ReferrerReceiver"
android:exported="true" android:process=":myService">
<intent-filter>
<action
android:name="com.android.vending.INSTALL_REFERRER"/>
</intent-filter>
</receiver>

<receiver
android:name="com.my.engine.BootBroadcastReceiver"
android:process=":myService">
<intent-filter>
<action
android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>

<receiver
android:name="com.my.engine.util.MineWatcherReceiver"
android:process=":myServiceWatcher">
<intent-filter>
<action
android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action
android:name="android.intent.action.BATTERY_OKAY" />
<action
android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action
android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>

<receiver
android:name="com.my.engine.logic.InitServiceReceiver"
android:exported="true" android:process=":myService">
<intent-filter>
<action android:name="initServiceCheck"/>
</intent-filter>
</receiver>

<receiver
android:name="com.my.engine.logic.UpdateCounterReceiver"
android:exported="true" android:process=":myService">
<intent-filter>
<action android:name="updateCustomCounter"/>
</intent-filter>
</receiver>

<receiver
android:name="com.my.engine.logic.PackageChangeReceiver"
android:process=":myService">
<intent-filter>
<action
android:name="android.intent.action.PACKAGE_ADDED"/>
<action
android:name="android.intent.action.PACKAGE_REPLACED"/>
<action
android:name="android.intent.action.PACKAGE_REMOVED"/>
<action
android:name="android.intent.action.PACKAGE_INSTALL"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>

<!-- for notification try next action -->
<service android:name="com.my.notifications.actions.TryNextNotificationActionService" />

<receiver android:name="com.my.ui.base.EulaReminderReceiver">
<intent-filter>
<action android:name="eulaReminderAction" />
</intent-filter>
</receiver>

<receiver android:name="com.my.ui.base.MineGuiBroadcastReceiver">
<intent-filter>
<action android:name="finishStoppedActivities" />
</intent-filter>
</receiver>

<service android:name="com.my.infra.motion.ActivityRecognitionService"
android:label="ActivityRecognitionService"
android:exported="true"
android:enabled="true"
android:process=":myService">
</service>

</application>

</manifest>

编辑 1

我什至停止了来自设置的通知,但仍在前台 process=":myService

编辑2

来自 sources :

if (p == SP_BACKGROUND)
strcpy(proc->policy, "bg");
else if (p == SP_FOREGROUND)
strcpy(proc->policy, "fg");
else
strcpy(proc->policy, "er");

来自 Answer in other question :

Mostly-uneducated-somewhat-random-stab-in-the-dark for PCY --

PCY -- Policy -- Determines how an app should be treated by Android'smemory manager

FG -- Foreground -- Process is considered a foregroundprocess and should not be killed to free memory

BG -- Background --Process is considered a background process (not actively running inforeground and may be killed to free memory)

最佳答案

详细说明 Alex P. 的回答:

我相信 PCY 列指的是 cgroup该过程被分配给。 Android定义了两个cgroup团体,SP_FOREGROUNDSP_BACKGROUND .实际cgroup SP_BACKGROUND 的名称是bg_non_interactive .这些组在 top 中指出。缩写 fgbg , 分别。

您可以在整个框架中找到对这些内容的引用,尤其是在 Process.java 中。 , IPCThreadState.cppandroid_util_Process.cpp 中的 native 代码与 Linux 接口(interface) /proc文件系统来管理正在运行的进程的各个方面。根据这些文件中的源代码注释,似乎所有线程都在前台 cgroup安排了“正常”的 CPU 份额,而那些在后台 cgroup被安排为“减少”份额。

关于正常和减少的定义,this博客指出SP_BACKGROUND线程被限制为 5% 的 CPU 使用率。您可以通过查看 /dev/cpuctl/bg_non_interactive/cpu.shares 来确认这一点在您正在运行的设备上。在运行 AOSP 5.1 的 Nexus 5 上,我得到:

root@hammerhead:/ # cat /dev/cpuctl/bg_non_interactive/cpu.shares              
52
root@hammerhead:/ #

此处,52 指的是 cgroup 中线程允许的“CPU 份额”数量, 最多 1024 股。所以在这种情况下 bg_non_interactive对于组中的所有线程,线程确实允许最多 ~5% 的 CPU 使用率。

无论如何,很明显,此上下文中的前景和背景与 Android 的 Activity lifecycle 关系不大。以及前台和后台应用程序的想法。这只是 Android 利用 Linux 的 cgroups 的方式。设施。

关于android - adb shell top 在前台显示我的应用程序,但实际上它在后台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32701187/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com