2011-07-05 20 views
5

ここに初めて投稿します。私はこれがこの質問をする適切な場所であるかどうかはわかりませんが、私は他のより適切な場所を見つけるようには思われません。とにかく私の質問です。タスクマネージャーのActivityManager.forceStopPackage()

私はAPI ActivityManager.forceStopPackage()が内部のものであり、システムプロセスからのみ呼び出すことができると私は理解します。しかし、それは私のモトローラのatrix携帯電話に内蔵のタスクマネージャーアプリ(パッケージ名com.motorola.PerformanceManager)がシステムプロセスではなく直接呼び出すことができます。私が確認したことは2つあります。

まず、それはpsコマンドから非システムプロセスです:

app_64 13681 1379 170788 29820 ffffffff 00000000 S com.motorola.PerformanceManager 

第二に、それは確かにそのODEXファイル(その後、DEXに、smaliに逆コンパイルして、Javaの中)からActivityManager.forceStopPackage() APIを呼び出します。 smaliコードから、このAPIを呼び出すことはすでに明らかです。

また、私にとって特別なものではないようなAndroidManifest.xmlファイルも確認しました(このフォーラムは誤ってコンテンツをURLとして認識し、投稿できないようにしています)。

マニフェストファイルには、システムとして想定されているandroid.permission.FORCE_STOP_PACKAGES権限が含まれています。システム以外のアプリでも、この権限でも権限拒否エラーが発生します。私はandroid.permission.FORCE_STOP_PACKAGES権限でこのAPIにアクセスするためにリフレクションを使用しようとしましたが、ランタイムエラーが発生します。

ここで、ビルトインのタスクマネージャーアプリケーションは、システムプロセスではなく内部APIをどのように呼び出すことができますか。 アプリが同じプラットフォーム秘密鍵で署名されている可能性があります。しかし、私はそれをどのように確認できるか分かりません。さらに、それはまだマニフェストファイルに追加の記述があるシステムプロセスであると考えられます。

誰かが私の質問に答えることを願っています。ありがとう。

+0

私のような同じ問題があります:java.lang.SecurityException:許可拒否: \t \t forceStopPackageを()のpid = 20914から、UID = 10073 Android要件.permission.FORCE_STOP_PACKAGES ,,,この問題を解決するために私を助けてください –

答えて

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" 
... 

あなたは、その保護レベルは署名である見ることができ、その後、について説明用の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 
... 

よろしく

Ziteng陳

+0

ありがとう、私はこれが正しい答えだと思います。しかし、私はまだアプリが実際にプラットフォームキーで署名されていることをどのように確認できるかわからない。アプリケーションのマニフェストファイルによれば、パーミッションは単純に(マニフェストファイルに記載されているprotectionLevelはありません)と書かれています。これはわたしたちが理解していることと幾分矛盾していますか? – zack

+0

すべての.apkファイルは署名されていますが、Eclipse ADTがそれを行っているため、あなたはそれを認識していないかもしれません。ガイドに従って自分のキーでapkに署名してください: http://developer.android.com/guide/publishing/app-signing.html#ExportWizard Androidソースをお持ちの場合は、Androidのデバッグ証明書in/build/target/product/securityフォルダには含まれていませんが、携帯電話メーカーは通常、自分の証明書で証明書を置き換えます。これは機密であり、決してあなたと私には公開されませんので、モトローラ電話の証明書。 –

+0

もう一度ありがとうございます。私がこれを正しく理解しているかどうかを再確認するだけです。すべての.apkファイルが証明書で署名されていることを理解しています。しかし、仕様によれば、マニフェストファイルに "android:protectionLevel =" signature "という行があるはずのFORCE_STOP_PACKAGES権限ではないのですか?これは本当に必要ではないということですか(組み込みタスクマネージャあなたが私の理解を確認した後、あなたの回答を答えにします。 – zack

関連する問題