Cómo omitir la lista negra de API ocultas en Android 9+

En 2018, Google lanzó Android Pie. Entre los cambios de la interfaz de usuario y las nuevas funciones, también hubo algunos cambios del lado del desarrollador. Estos cambios incluyeron nuevas API, correcciones de errores para las API existentes, así como restricciones ocultas de acceso a las API.

Afortunadamente, hay formas de evitar estas restricciones. Antes de explicar cómo sortear las restricciones, debería explicar un poco qué son las API ocultas, por qué estaban restringidas en primer lugar y por qué es posible que desee acceder a ellas.

¿Qué son las API ocultas?

Las API ocultas son API de Android que los desarrolladores de aplicaciones normalmente no pueden ver. Si echas un vistazo al código AOSP, verás un montón de clases, variables y métodos que tienen un @hide anotación dentro de un bloque de comentarios encima de ellos.

Esta anotación le dice a la herramienta utilizada por Google al compilar el SDK que excluya el elemento a continuación. Luego, este SDK se distribuye a los desarrolladores en SDK descargados a través de Android Studio. A menos que esté utilizando un SDK modificado, Android Studio pensará que ninguna de estas cosas ocultas simplemente existe. Si intenta usar uno directamente, lo mostrará en rojo y se negará a compilar.

¿Por qué están ocultas las API?

Hay muchas razones por las que se puede ocultar una API. Algunas cosas solo están diseñadas para ser utilizadas por aplicaciones internas o del sistema y no funcionarán si las utiliza una aplicación de terceros. Otros son experimentales o inestables y pueden eliminarse o cambiarse en el futuro. Algunos incluso son solo API que Google simplemente no quiere pasar por el ciclo de depreciación normal si se eliminan.

¿Por qué utilizar API ocultas?

Si bien el SDK de Android estándar tiene una paquete o empaquetar en él, a veces no es suficiente. A veces, hay algo que desea hacer que ya existe en Android, pero que no se expone públicamente.

Por ejemplo, la mayoría de las aplicaciones que creo, incluidos SystemUI Tuner y Lockscreen Widgets, utilizan un montón de API ocultas diferentes. SystemUI Tuner necesita acceder a algunas opciones para rastrear, cambiar y restablecer correctamente las opciones. Lockscreen Widgets los usa para mostrar el fondo de pantalla, entre otras cosas.

Te puede interesar:  Chromecast con la suite de Google TV podría ser un modelo de gama baja

La mayoría de los desarrolladores no necesitan acceder a API ocultas, pero a veces pueden resultar muy útiles.

¿Cómo se restringen las API ocultas?

Con el lanzamiento de Android 9 (Pie), Google introdujo la lista negra de API ocultas. No se incluyeron todas las API ocultas y hubo diferentes niveles de listas. Cualquiera puede ver las API ocultas en la lista blanca. Cualquier aplicación puede ver las API ocultas en la lista gris claro, pero es posible que no se pueda acceder a ellas en futuras versiones de Android. Cualquier cosa en la lista gris oscuro solo era accesible para aplicaciones que apuntaban a niveles de API antes de Pie (es decir, antes del nivel de API 28). A las aplicaciones dirigidas a Pie y posteriores se les negaría el acceso. Finalmente, las API ocultas en la lista negra no pueden ser accedidas por ninguna aplicación que no sea del sistema (o que no esté en la lista blanca), independientemente de la API de destino.

Android 10 cambió la forma en que se organizaban las listas y las simplificó un poco, pero la idea siguió siendo la misma. Las aplicaciones podían ver algunas API ocultas, mientras que otras estaban bloqueadas. Android 11 ha aumentado la detección de acceso para bloquear un bypass utilizado para Pie y 10.

En todas las versiones de Android, siempre que una aplicación de terceros intente acceder a una API oculta en la lista negra, Android devolverá el error correspondiente "no encontrado".

Cómo omitir la lista negra de API ocultas

En realidad, hay varias formas de evitar la lista negra de API ocultas. Dependiendo de sus necesidades, puede elegir cuáles funcionan para todas las versiones de Android, cuáles solo funcionan para Android 9 y 10, cuáles usan código nativo C ++ y cuáles están completamente basadas en Java. Incluso hay una solución para el desarrollo con ADB.

Solución alternativa del BAfD

Si su dispositivo ejecuta Android Pie, ejecute los siguientes dos comandos ADB para habilitar el acceso oculto a la API.

adb shell settings put global hidden_api_policy_pre_p_apps  1
adb shell settings put global hidden_api_policy_p_apps 1

Si su dispositivo ejecuta Android 10 o posterior, ejecute el siguiente comando ADB para habilitar el acceso oculto a la API.

adb shell settings put global hidden_api_policy 1

Para volver al comportamiento predeterminado, simplemente reemplace put con delete y quitar el 1.

Obviamente, estos comandos no son realmente útiles para una aplicación de producción. Puedo decirte de primera mano que es increíblemente difícil instruir adecuadamente a los usuarios sobre cómo usar ADB. Pero pueden ser útiles si necesita actualizar una aplicación anterior para cumplir con las nuevas restricciones.

Te puede interesar:  La actualización principal de Pixel Launcher Mods agrega reemplazo de widgets de un vistazo, compatibilidad con Android 12 y más

Solución alternativa nativa / JNI

Hay dos formas de eludir la lista negra de API ocultas usando JNI en su aplicación de Android. Uno funciona para Android 9 y 10, y el otro funciona para Android 9 y versiones posteriores.

Android 9 y 10

Si ya tiene una parte nativa de su aplicación, será fácil de implementar. Solo usa el JNI_OnLoad() Una función.
arte estático :: Tiempo de ejecución * tiempo de ejecución = nullptr;

extern "C" jint JNI_OnLoad(JavaVM *vm, void *reserved) {
    ...
    runtime = reinterpret_cast<art::JavaVMExt*>(vm)->GetRuntime();
    runtime->SetHiddenApiEnforcementPolicy(art::hiddenapi::EnforcementPolicy::kNoChecks);
    ...
}

Tenga en cuenta que este método solo funciona en Android 9 y 10.

Android 9 y posterior

Para cualquier versión de Android, hay dos bibliotecas para elegir para evitar la restricción de API oculta: FreeReflection y RestrictionBypass.

Ambos son fáciles de configurar y usar.

Para implementar FreeReflection, agregue la dependencia a su build.gradle en el nivel del módulo.

implementation 'me.weishu:free_reflection:3.0.1'

luego reemplace attachBaseContext() en su clase de Aplicación.

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    Reflection.unseal(base);
}

Si no tiene una clase de aplicación, puede agregarla con bastante facilidad. Crea una nueva clase que se extienda Application luego apúntelo en su AndroidManifest.xml.

Ejemplo:

public class App extends Application {
    ...
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);

        Reflection.unseal(base);
    }
}
<manifest>
    ...
    <application
        ...
        name=".App">
        ...
    </application>
</manifest>

Para implementar RestrictionBypass, agregue el repositorio de JitPack a su build.gradle a nivel de proyecto.

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

Luego agregue la dependencia a su build.gradle en el nivel del módulo.

implementation 'com.github.ChickenHook:RestrictionBypass:2.2'

Y es todo. Esta biblioteca elimina automáticamente las restricciones de la lista negra.

Te puede interesar:  Chromebooks, Windows y cómo Mediatek planea ganar TI

Bypass de Java

Aunque las soluciones JNI son efectivas, puede haber ocasiones en las que no desee utilizar código nativo. Si aún no está haciendo cosas en C ++, puede agregar un tamaño innecesario, así como restricciones de plataforma, a su aplicación. Afortunadamente, hay formas de evitar la lista negra de API ocultas utilizando solo Java.

Android 9 y 10

En Android 9 y 10, puede usar lo que podría llamar doble reflexión o meta-reflexión para evitar la lista negra oculta de la API. Dado que el sistema solo verifica lo que llaman las aplicaciones de terceros, la doble reflexión hace creer que el sistema está haciendo las llamadas API ocultas.

Este truco se puede utilizar para llamar a un método para dar a su aplicación exenciones de API ocultas y con un nombre adecuado. setHiddenApiExemptions(). Simplemente agregue el siguiente código en algún lugar temprano en el ciclo de vida de su aplicación (como app onCreate() método), y manejará la omisión de la lista negra.

Method forName = Class.class.getDeclaredMethod("forName", String.class);
Method getDeclaredMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class);

Class vmRuntimeClass = (Class) forName.invoke(null, "dalvik.system.VMRuntime");
Method getRuntime = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "getRuntime", null);
Method setHiddenApiExemptions = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "setHiddenApiExemptions", new Class[] { String[].class} );

Object vmRuntime = getRuntime.invoke(null);
setHiddenApiExemptions.invoke(vmRuntime, new String[][] { new String[] { "L" } });

Si su aplicación es compatible con versiones de Android por debajo de la 9, no olvide incluirla en una verificación de versión.

Android 9 y posterior

Para omitir la lista negra de API ocultas en Android 9 y cualquier versión posterior, puede usar la biblioteca de LSPosed. Esta biblioteca utiliza la API insegura de Java, por lo que es poco probable que se bloquee.

Para implementarlo, simplemente agregue la dependencia a su build.gradle en el nivel del módulo.

implementation 'org.lsposed.hiddenapibypass:hiddenapibypass:2.0'

Luego utilícelo para omitir la lista negra.

HiddenApiBypass.addHiddenApiExemptions("L");

Si su aplicación es compatible con versiones de Android por debajo de la 9, no olvide incluirla en una verificación de versión.

Conclusión y más información

Hay muchas opciones para eludir la lista negra de API ocultas en Android sin importar la versión de la plataforma a la que se dirija o utilice. Si tiene curiosidad por saber más sobre cómo funcionan estos métodos y bibliotecas, asegúrese de consultar los siguientes enlaces.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Usamos cookies para mejorar la experiencia del usuario. Selecciona aceptar para continuar navegando. Más información

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad