Android llama a las clases y métodos ocultos del sistema.

1. Clases y métodos ocultos del sistema Android

Al leer el código fuente de Android, encontrará muchos métodos anotados por @UnsupportedAppUsage, a los que no se puede acceder mediante aplicaciones externas.

Por ejemplo, la clase PackageParser en Android, esta clase está bajo el paquete android.content.pm:

0d41f917553b4ea0a837b6e1cb012067.png

Puede ver que esta clase está oculta (@hide) y no proporciona llamadas externas al SDK, por lo que no se puede crear una instancia directamente.

Hay un método estático parsePackageLite en esta clase:

c70522b8cf094f05ba6f791955c9e2e6.png

Este método se anota con @UnsupportedAppUsage, lo que indica que el método no es compatible con la aplicación de usuario para llamar.

 

2. Llame a las clases y métodos ocultos del sistema

① por reflexión

testReflect de vacío privado () {

    intentar {

        Class<?> cls=Class.forName( "android.content.pm.PackageParser");

        Método[] métodos=cls.getMethods();

        for (int i = 0; i < métodos.longitud; i++) {

            Log.i("RR",métodos[i].getName());

        }

    } captura (ClassNotFoundException e) {

        e.printStackTrace();

    }

}

0993a440524a4d09a276a919e9f49905.pngSe puede ver en el registro que se puede obtener este método.

② Declarar la clase del sistema, implementación vacía, lanzar una excepción

Al mirar la clase, a menudo puede ver el siguiente código. Esto se compila y pasa. Cuando finalmente se llama, encontrará la clase de implementación del sistema final.

cf5bc56f0de0432abb53999ac4e26678.png

Así que trata de referirte al método de escritura del sistema.

c6523821ba18476baec4d7b23346b893.png

Para garantizar que la clase creada tenga el mismo nombre de paquete que el sistema, también se deben declarar y escribir otras clases a las que se debe hacer referencia en él.

PackageParser.java:

paquete android.content.pm;

importar java.io.Archivo;

importar java.seguridad.cert.Certificado;

importar java.util.List;

Paquete de clase pública {

    public static PackageLite parsePackageLite(File packageFile, int flags) lanza PackageParserException {

        lanzar una nueva RuntimeException("Stub!");

    }

    clase estática pública PackageLite {

        Nombre del paquete de cadena final pública;

       ...todos los atributos se copian directamente

        public PackageLite(String codePath, ApkLite baseApk, String[] splitNames, String[] splitCodePaths, int[] splitRevisionCodes) {

            this.packageName = baseApk.packageName;

           ...todas las asignaciones de atributos se copian directamente

        }

        lista pública<String> getAllCodePaths() {

          lanzar una nueva RuntimeException("Stub!");

        }

    }

    clase estática pública ApkLite {

        ruta de código de cadena final pública;

       ... todos los atributos se copian

        public ApkLite(String codePath, String packageName, String splitName, int versionCode, int revisionCode, int installLocation, List<VerifierInfo> verificadores, Signature[] firmas, Certificate[][] certificados, boolean coreApp, boolean multiArch, boolean use32bitAbi, boolean extractNativeLibs ) {

         lanzar una nueva RuntimeException("Stub!");

        }

    }

    La clase estática pública PackageParserException extiende la excepción {

        error int final público;

        PackageParserException pública (error int, mensaje de detalle de cadena) {

            super(mensajedetalle);

         lanzar una nueva RuntimeException("Stub!");

        }

        public PackageParserException(int error, String detailMessage, Throwable throwable) {

            super(detalleMensaje, arrojable);

         lanzar una nueva RuntimeException("Stub!");

        }

    }

}

Como puede ver, la parte de implementación se reemplaza por throw new RuntimeException("Stub!");

Nota: Todos los atributos deben escribirse (si hay una anotación UnsupportedAppUsage, elimine la anotación), puede copiar el código fuente y luego reemplazar la implementación con throw new RuntimeException("Stub!");

VerifierInfo.java:

paquete android.content.pm;

importar android.os.Parcel;

importar android.os.Parcelable;

importar java.seguridad.PublicKey;

public class VerifierInfo implementa Parcelable {

    Nombre del paquete de cadena final pública;

    clave pública final pública clave pública;

    public VerifierInfo(String nombre del paquete, PublicKey publicKey) {

        lanzar una nueva RuntimeException("Stub!");

    }

    VerifierInfo privado (fuente del paquete) {

        lanzar una nueva RuntimeException("Stub!");

    }

    @Anular

    public int describirContenido() {

        lanzar una nueva RuntimeException("Stub!");

    }

    @Anular

    public void writeToParcel(Parcel dest, int flags) {

        lanzar una nueva RuntimeException("Stub!");

    }

    public static final Parcelable.Creator<VerifierInfo> CREADOR = new Parcelable.Creator<VerifierInfo>() {

        public VerifierInfo createFromParcel (fuente del paquete) {

         lanzar una nueva RuntimeException("Stub!");

        }

        public VerifierInfo[] newArray(tamaño int) {

         lanzar una nueva RuntimeException("Stub!");

        }

    };

}

Luego puede llamar al método oculto en la aplicación:

testRuntimeExp vacío privado () {

    Archivo archivo=nuevo archivo( Environment.getExternalStorageDirectory().getPath()+"/mm/app-debug.apk");

    si (!archivo.existe()) {

        Toast.makeText(esto, "el archivo no existe", Toast.LENGTH_SHORT).show();

        devolver;

    }

    intentar {

       PackageParser.PackageLite packageLite= PackageParser.parsePackageLite(archivo,0);

       Log.i("RR","nombrePaquete:" + paqueteLite.nombrePaquete);

       Log.i("RR","versionCode:" + packageLite.versionCode);

       Log.i("RR","instalaciónUbicación:" + paqueteLite.instalaciónUbicación);

       Log.i("RR","codePath:" + paqueteLite.codePath);

       Log.i("RR","baseCodePath:" + paqueteLite.baseCodePath);

       Log.i("RR","coreApp:" + paqueteLite.coreApp);

        Cadena s="";

    } catch (PackageParser.PackageParserExc eption e) {

        e.printStackTrace();

    }

}

resultado:

9eb01c4a2e68489eaada4bf516c5953e.png

Ver que el resultado es correcto da información.

Supongo que te gusta

Origin blog.csdn.net/zenmela2011/article/details/131010937
Recomendado
Clasificación