2011-07-05 7 views
5

To jest mój pierwszy wpis tutaj. Nie jestem pewien, czy to właściwe miejsce, aby zadać to pytanie, ale nie wydaje mi się, żebym znalazł inne, bardziej odpowiednie miejsca. Oto moje pytanie.ActivityManager.forceStopPackage() od Task Manager

Rozumiem, że interfejs API ActivityManager.forceStopPackage() jest wewnętrznym i można go wywołać tylko z procesu systemowego. Jednak zastanawia mnie, że wbudowana aplikacja Task Manager (o nazwie pakietowej com.motorola.PerformanceManager) na moim telefonie może wywoływać ją bezpośrednio, nie będąc procesem systemowym. Są dwie rzeczy, które zweryfikowałem.

Po pierwsze, jest to proces niesystemowym z poleceniem ps:

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

drugie, rzeczywiście wywołuje ActivityManager.forceStopPackage() API z jego ODEX pliku (dekompilowana do maĹ,ych, a następnie do dex, a następnie w Javie). Z kodu smali jest już jasne, że nazywa ten API.

Sprawdziłem również jego plik AndroidManifest.xml, który wydaje mi się niczym szczególnym (forum błędnie rozpoznaje treść jako adresy URL i uniemożliwia mi ich opublikowanie).

Plik manifestu zawiera uprawnienie android.permission.FORCE_STOP_PACKAGES, które ma być systemowe. Aplikacja niesystemowa nadal będzie otrzymywała błąd odmowy przyznania pozwolenia, nawet jeśli otrzyma to uprawnienie. Próbowałem użyć odbicia, aby uzyskać dostęp do tego interfejsu API z uprawnieniem android.permission.FORCE_STOP_PACKAGES, ale nadal pojawia się błąd środowiska wykonawczego.

Teraz, w jaki sposób wbudowana aplikacja Menedżer zadań może wywoływać wewnętrzny interfejs API, nie będąc procesem systemowym. Jedna z możliwości polega na tym, że aplikacja jest podpisana tym samym kluczem prywatnym platformy. Jednak nie jestem pewien, jak mogę to zweryfikować. Co więcej, nadal jest to proces systemowy z dodatkowymi opisami w pliku manifestu.

Mam nadzieję, że ktoś może odpowiedzieć na moje pytanie. Dzięki.

+0

Mam ten sam problem jak: java.lang.SecurityException: Permission Denial: \t \t forceStopPackage() z pid = 20914, uid = 10073 Wymaga Androida .permission.FORCE_STOP_PACKAGES ,,, czy możesz mi pomóc rozwiązać ten problem? –

Odpowiedz

13

Uprawnienie "android.permission.FORCE_STOP_PACKAGES" chronione jest podpisem platformy.

Jeśli masz kod źródłowy Androida następnie sprawdzić deklarację zgody:

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

... 
    <permission android:name="android.permission.FORCE_STOP_PACKAGES" 
     android:permissionGroup="android.permission-group.SYSTEM_TOOLS" 
     android:protectionLevel="signature" 
... 

Można zobaczyć jego poziom ochrony jest podpis, następnie sprawdzić w dokumentacji SDK dla wyjaśnieniu:

"android: ProtectionLevel"

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

"Podpis ... Uprawnienie, które system przyznaje tylko wtedy, gdy wnioskujący wniosek jest podpisany tym samym certyfikatem, co aplikacja, która zadeklarowała to uprawnienie. Jeśli certyfikaty są zgodne, system automatycznie udziela pozwolenia bez powiadamiania użytkownika lub proszenia użytkownika o wyraźną zgodę "

Zezwolenie jest zadeklarowane przez framework-res, który jest podpisany przez podpis platformy, więc aplikacja, która chce użyj pozwolenia również zostanie podpisane z tym samym podpisem.

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

... 
    LOCAL_PACKAGE_NAME := framework-res 
    LOCAL_CERTIFICATE := platform 
... 

Pozdrowienia

Ziteng Chen

+0

Dzięki, myślę, że to jest właściwa odpowiedź. Jednak nadal nie jestem pewien, w jaki sposób mogę zweryfikować, czy aplikacja rzeczywiście została podpisana kluczem platformy. Zgodnie z plikiem manifestu aplikacji, pozwolenie jest po prostu napisane jako (nigdzie w pliku manifestu nie wymieniono protectionLevel). Jest to nieco sprzeczne z tym, co rozumiemy? – zack

+0

Wszystkie pliki .apk muszą być podpisane, ale możesz nie wiedzieć o tym, ponieważ Eclipse ADT zrobił to za Ciebie. Postępuj zgodnie z instrukcjami, aby podpisać APK własnymi kluczami: http://developer.android.com/guide/publishing/app-signing.html#ExportWizard Jeśli masz źródło Androida, możesz znaleźć certyfikaty debugowania systemu Android w folderze/build/target/product/security, ale producenci telefonów zwykle zastępują certyfikaty własnymi certyfikatami na żywo, które są poufne i nigdy nie zostaną ujawnione tobie i mnie, więc obawiam się, że nie możesz uzyskać na przykład platformy certyfikat telefonu Motorola. –

+0

Jeszcze raz dziękuję. Wystarczy dwukrotnie sprawdzić, czy rozumiem to poprawnie. Rozumiem, że każdy plik .apk jest podpisany certyfikatem. Ale chodzi o to, że zgodnie z specyfikacją, nie ma zgody FORCE_STOP_PACKAGES, która ma w pliku manifestu linię "android: protectionLevel =" signature ", czy nie jest to naprawdę konieczne (wbudowany menedżer zadań aplikacja nie ma tego wiersza) Zaznaczę twoją odpowiedź jako odpowiedź po potwierdzeniu mojego zrozumienia – zack