任务管理器中的ActivityManager.forceStopPackage()

zac*_*ack 5 android

这是我第一次在这里发帖.我不确定这是否是提出这个问题的正确位置,但我似乎没有找到其他更合适的地方.不管怎样,这是我的问题.

我知道API ActivityManager.forceStopPackage()是内部API ,只能从系统进程调用.但是,让我感到困惑的是com.motorola.PerformanceManager,我的motorola atrix手机上的内置任务管理器应用程序(包名称)可以直接调用它而不需要系统进程.我验证了两件事.

首先,它是来自ps命令的非系统进程:

app_64 13681 1379 170788 29820 ffffffff 00000000 S com.motorola.PerformanceManager
Run Code Online (Sandbox Code Playgroud)

其次,它确实ActivityManager.forceStopPackage()从其odex文件调用API(反编译为smali,然后转换为dex,然后转换为java).从smali代码中可以清楚地看到它调用了这个API.

我还检查了它对AndroidManifest.xml我来说没什么特别的文件(论坛错误地将内容识别为URL并阻止我发布它们).

清单文件确实包含android.permission.FORCE_STOP_PACKAGES应该是系统权限的权限.即使有此权限,非系统应用仍会获得权限拒绝错误.我尝试使用反射来获取android.permission.FORCE_STOP_PACKAGES权限,但仍然会收到运行时错误.

现在,内置的任务管理器应用程序如何在不作为系统进程的情况下调用内部API.一种可能性是应用程序使用相同的平台私钥进行签名.但是,我不确定如何验证这一点.此外,它仍然应该是清单文件中具有附加描述的系统进程.

希望有人能回答我的问题.谢谢.

Zit*_*hen 13

"android.permission.FORCE_STOP_PACKAGES"权限受平台签名保护.

如果您有Android源代码,请检查权限声明:

/frameworks/base/core/res/AndroidManifest.xml

...
    <permission android:name="android.permission.FORCE_STOP_PACKAGES"
        android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
        android:protectionLevel="signature"
...
Run Code Online (Sandbox Code Playgroud)

您可以看到它的保护级别是签名,然后检查SDK文档以获取解释:

"安卓的ProtectionLevel"

http://developer.android.com/guide/topics/manifest/permission-element.html#plevel

"签名...系统仅在请求的应用程序使用与声明权限的应用程序相同的证书进行签名时授予的权限.如果证书匹配,系统会自动授予权限,而不通知用户或要求用户明确批准"

该权限由framework-res声明,该权限由平台签名签署,因此要使用该权限的应用程序也应使用相同的签名进行签名.

/frameworks/base/core/res/Android.mk

...
     LOCAL_PACKAGE_NAME := framework-res
     LOCAL_CERTIFICATE := platform
...
Run Code Online (Sandbox Code Playgroud)

问候

陈子腾