Desinstalar la aplicación silenciosamente con priveleges del sistema

Mi aplicación tiene privilegios de sistema. Estará dentro del firmware, ahora se encuentra en / system / app

He podido instalar aplicaciones silenciosamente con esta publicación

Instalar / desinstalar APKs de forma programática (PackageManager vs Intents)

Ejemplo de aplicación que funciona

How to install an application in background on Android

Pero todavía no puedo desinstalar aplicaciones de la misma manera. Intenté usar reflecion como en el ejemplo de instalación.

public ApplicationManager(Context context) throws SecurityException, NoSuchMethodException { observer = new PackageInstallObserver(); pm = context.getPackageManager(); Class<?>[] types = new Class[] {Uri.class, IPackageInstallObserver.class, int.class, String.class}; Class<?>[] uninstalltypes = new Class[] {String.class, IPackageInstallObserver.class, int.class}; method = pm.getClass().getMethod("installPackage", types); uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes); } public void uninstallPackage(String packagename) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { uninstallmethod.invoke(pm, new Object[] {packagename, observer, 0}); } public void installPackage(Uri apkFile) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { method.invoke(pm, new Object[] {apkFile, observer, INSTALL_REPLACE_EXISTING, null}); } 

He agregado el método uninstallPackage y el método de ApplicationManager editado. Todavía no puedo conseguir este trabajo.

Cuando lo ejecuto consigo el método no encontrado (en la línea "deletePackage" de la invocación).

Aquí no funciona el proyecto con mis cambios: https://dl.dropbox.com/u/1928109/InstallInBackgroundSample.zip

Aquí está una descripción de la función: http://www.androidjavadoc.com/1.0_r1_src/android/content/pm/PackageManager.html#deletePackage(java.lang.String , android.content.pm.IPackageDeleteObserver, int)

Los parámetros son correctos. Parece que debería especificar la clase DeletePackageObserver en lugar de InstallPackageObserver. Pero no sé cómo hacerlo (no tengo tal clase).

Gracias

Aquí es cómo lo hice:

ApplicationManager.java (parte cambiada):

 private PackageInstallObserver observer; private PackageDeleteObserver observerdelete; private PackageManager pm; private Method method; private Method uninstallmethod; class PackageDeleteObserver extends IPackageDeleteObserver.Stub { public void packageDeleted(String packageName, int returnCode) throws RemoteException { /*if (onInstalledPackaged != null) { onInstalledPackaged.packageInstalled(packageName, returnCode); }*/ } } public ApplicationManager(Context context) throws SecurityException, NoSuchMethodException { observer = new PackageInstallObserver(); observerdelete = new PackageDeleteObserver(); pm = context.getPackageManager(); Class<?>[] types = new Class[] {Uri.class, IPackageInstallObserver.class, int.class, String.class}; Class<?>[] uninstalltypes = new Class[] {String.class, IPackageDeleteObserver.class, int.class}; method = pm.getClass().getMethod("installPackage", types); uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes); } public void uninstallPackage(String packagename) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { uninstallmethod.invoke(pm, new Object[] {packagename, observerdelete, 0}); } 

PackageDeleteObserver.java (en android.content.pm):

 package android.content.pm; public interface IPackageDeleteObserver extends android.os.IInterface { public abstract static class Stub extends android.os.Binder implements android.content.pm.IPackageDeleteObserver { public Stub() { throw new RuntimeException("Stub!"); } public static android.content.pm.IPackageDeleteObserver asInterface(android.os.IBinder obj) { throw new RuntimeException("Stub!"); } public android.os.IBinder asBinder() { throw new RuntimeException("Stub!"); } public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { throw new RuntimeException("Stub!"); } } public abstract void packageDeleted(java.lang.String packageName, int returnCode) throws android.os.RemoteException; } 

También no se olvide de agregar permiso para manifestar :

 <uses-permission android:name="android.permission.DELETE_PACKAGES"/> 

Proyecto de ejemplo de trabajo (apk debe colocarse en la ruta "/ system / app" en el dispositivo) : http://www.mediafire.com/file/no4buw54ed6vuzo/DeleteInBackgroundSample.zip

Así se define el método:

  public abstract void deletePackage( String packageName, IPackageDeleteObserver observer, int flags); 

Para llamarla usando la reflexión, necesitarías algo como:

 Class<?>[] uninstalltypes = new Class[] {String.class, IPackageDeleteObserver.class, int.class}; uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes); 

Observe el tipo de observador.

Si tiene su aplicación integrada en la imagen del sistema y está utilizando APIs internas, también podría dejar de fingir que es una aplicación de terceros y vincularla con el SDK. Construir contra la plataforma completa .jar y utilizar esas API directamente. Usted quiere hacer eso de todos modos, porque estas son APIs privadas, y por lo tanto pueden y cambian. Usted desea construir contra lo que realmente está declarándolos, así que si cambian, lo captará durante sus compilaciones.

En android 2.3.x, la interfaz IPackageDeleteObserver es diferente en el método packageDeleted.

  • Yahoo Cambio de divisas en Android 4
  • Cifrado del dispositivo Android ICS
  • BroadcastReceivers en ICS
  • Implementación del widget de la barra de herramientas de Android en ListFragment
  • ¿Existe una manera de ocultar la barra de navegación del sistema en Android ICS?
  • Cómo llamar a un método no estático de un método estático
  • Establecer desvanecimiento de texto en Android 4.0.3
  • HttpURLConnection realiza siempre una solicitud GET en lugar de una solicitud POST a pesar de setDoOutput (true) y setRequestMethod ("POST")
  • Haga clic en Eventos que no funcionan en Nexus S ICS (4.0.4) en Todos los navegadores
  • Emulador de Android 4.0 no se iniciará
  • ¿Cómo configuro el emulador de Android 4.0+ para que se comporte como una tableta?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.