2012-06-05 30 views
12

Mi aplicación tiene privilegios del sistema. Será dentro del firmware, ahora se encuentra en/system/appdesinstalar la aplicación de forma silenciosa con privilegios del sistema

pude instalar aplicaciones en silencio con este post

install/uninstall APKs programmatically (PackageManager vs Intents)

ejemplo aplicación que funciona

http://paulononaka.wordpress.com/2011/07/02/how-to-install-a-application-in-background-on-android/

Pero todavía no puedo desinstalar aplicaciones de la misma manera. Intenté usar la reflexión 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 añadido el método uninstallPackage y el método editado ApplicationManager. Todavía no puedo hacer que esto funcione.

Cuando lo ejecuto obtengo el método no encontrado (en la línea invocar "deletePackage").

aquí no es proyecto de trabajar con mis cambios:https://dl.dropbox.com/u/1928109/InstallInBackgroundSample.zip

Aquí se presenta 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)

parámetros están bien. Parece que debería especificar la clase DeletePackageObserver en lugar de InstallPackageObserver. Pero no sé cómo hacer eso (no tengo esa clase).

Gracias

+0

Es posible que desee publicar un seguimiento de la pila y/o cualquier mensaje de error/advertencia que reciba en logcat. –

+0

Dice que no se encontró el método deletePackage – POMATu

+0

@POMATu es necesario tener acceso de root o teléfono rooteado para realizar una instalación o eliminación silenciosa usando el código que ha mencionado en la pregunta. – pyus13

Respuesta

16

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.h):

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 añadir permiso para manifestarse:

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

Trabajando proyecto de ejemplo (apk necesitan ser colocados en "/ system/app" camino en el dispositivo) : http://www.mediafire.com/file/no4buw54ed6vuzo/DeleteInBackgroundSample.zip

+0

¿funcionará también para dispositivos no rooteados? – pyus13

+0

@ pyus13: creo que funcionará solo para dispositivos rooteados; de lo contrario, observe este ejemplo: está trabajando en ambos dispositivos (rooteados y no rooteados): http://impressive-artworx.de/2011/uninstall- an-app-programmatically/ – Houcine

+0

@Houcine agradece pero pedirá una confirmación del usuario para eliminar la aplicación, pero estoy buscando algo que directamente desinstale la aplicación, todas las aplicaciones son desarrolladas por el mío solo generado con el mismo certificado, así que puedo desinstalar ¿Mi propia aplicación desarrollada desde mi otra aplicación desarrollada sin ninguna intervención del usuario? – pyus13

7

Esto es cómo se define el método:

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

llamarlo utilizando la reflexión, lo que se necesita algo como:

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

Nota del tipo de observador.

+0

Pero no tengo la clase packageDeleteObserver en el programa de ejemplo. El codificador del blog de wordpress solo proporciona el paqueteInstallObserver, y difiere del paqueteInstallObserver del sistema android. – POMATu

+0

Bueno, use su imaginación :) Agregue un stub 'IPackageDeleteObserver' clase a su proyecto, al igual que el blog describe que lo hicieron para' IPackageInstallObserver'. –

+0

mirar. Si bien esta línea está bien 'observer = new PackageInstallObserver();', tengo problemas al utilizar esta línea 'observerdelete = new PackageDeleteObserver();'. Dice que PackageDeleteObserver no se puede resolver a un tipo, pero existe en mi proyecto. Aquí está el proyecto con sus cambios que no compilan https://dl.dropbox.com/u/1928109/InstallInBackgroundSample2.zip – POMATu

4

Si su aplicación está integrada en la imagen del sistema y está utilizando API internas, también debería dejar de fingir que es una aplicación de terceros y enlazar con el SDK. Compila contra la plataforma completa .jar y usa esas API directamente. De todos modos, quiere hacer eso, porque se trata de API privadas, por lo que pueden cambiar y lo hacen. Desea construir en contra de lo que realmente los declara, de modo que si cambian, lo detectará durante sus compilaciones.

1

en 2.3.x androide, la interfaz IPackageDeleteObse rver es diferente en el método packageDeleted.

Cuestiones relacionadas