ActivityManager: Excepción lanzada al iniciar las actividades java.lang.IllegalArgumentException: val.length> 91
Al iniciar MainActivity de la aplicación, se bloquea al instante. Cuando busqué los registros de adb, pude encontrar sólo esto,
Exception thrown when launching activities in ProcessRecord java.lang.IllegalArgumentException: val.length > 91 at SystemProperties.set
Cuando busqué el código fuente de android, me di cuenta de que esto podría ser la raíz del código fuente Android de SystemProperties.java . Contiene un límite de valor máximo de 91.
- ¿Cómo hacer que un contador agregue sólo una vez al día (android)?
- ¿Cuál es la cantidad máxima de elementos que podemos almacenar en la matriz de bytes en Java?
- Detectar una excepción de entrada errónea
- Búsqueda / filtrado ListView por varios criterios
- ¿Cómo ORMlite gestiona la herencia entre clases Java?
public static final int PROP_VALUE_MAX = 91; public static String get(String key) { if (key.length() > PROP_NAME_MAX) { throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); } return native_get(key); }
Cuando le doy una conjetura, encontré que, el nombre del paquete de mi aplicación es de 108 caracteres . Y cuando cambié el nombre del paquete de mi aplicación a 60 caracteres , funcionó sin ningún problema.
¿Cual podría ser el problema? Esto ocurre sólo en el modelo Asus Zenfone 2 (Lolipop 5.0) .
No hay problema en ningún otro dispositivo. Estamos recibiendo una gran cantidad de calificación negativa debido a este problema.
Nuestra aplicación ya tiene 15K descargas en la tienda de juegos. Así que cambiar el nombre del paquete de la aplicación no es una opción para mí. Por favor ayuda
Actualizar
Para ser más precisos, hay
No hay problema en todos los teléfonos Android que hemos probado que no sean de Asus Zenfone Series
Como se mencionó por @ViswanathLekshmanan en los comentarios, cambié la ubicación del archivo MainAcitivity.java a una ruta inferior.
Es decir, el nombre de paquete completo original fue: – "com.fourbigbrothers.malayalam_troll_greetings_maker_edit_movie_images_font_seasonal_photo_comments.activities.MainActivity"
Lo cambié a: – "com.fourbigbrothers.mtm.activities.MainActivity"
Sigue sin funcionar. He puesto algunos registros en onCreate de MainActivity , pero la ejecución del código no está llegando allí en absoluto. Así que no tengo ni idea de dónde poner un bloque try / catch como se menciona en algunas respuestas.
¿Habría alguna solución usando el android ndk? Y lo siento si es una pregunta tonta, estoy completamente perdido.
Esta es la parte relevante del manifiesto
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.fourbigbrothers.malayalam_troll_greetings_maker_edit_movie_images_font_seasonal_photo_comments" > <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:name="com.fourbigbrothers.boilerplate.base.FbbApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.FbbApp" > <activity android:name="com.fourbigbrothers.malayalam_troll_greetings_maker_edit_movie_images_font_seasonal_photo_comments.activities.MainActivity" android:label="@string/launcherActivityName" android:screenOrientation="portrait" android:launchMode="singleTop" android:theme="@style/MainActivityTheme" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity> </application>
- Problemas con la importación de clases de plataformas Android
- ¿Por qué funcionan los parámetros de diseño en la programación de Android?
- El campo ADT no está configurado
- ¿Los hilos se eliminan automáticamente después de que el método run () sale en Java?
- Cómo comprobar y construir el código fuente UIAutomator en Windows
- android.util.Base64 codificar / decodificar indicadores parámetro
- Android: Creación de botones en fila
- Usando HttpUrlconnection en Rss Reader hace que Android cuelgue
Para el primer vistazo
El sistema de propiedad es una característica importante en android. Se ejecuta como un servicio y gestiona las configuraciones del sistema y el estado. Todas estas configuraciones y estado son propiedades. Una propiedad es un par clave / valor, ambos de tipo string. Desde el sentido de la función, es muy similar al registro de Windows. Muchas aplicaciones y bibliotecas de Android dependen directa o indirectamente de esta característica para determinar su comportamiento en tiempo de ejecución. Por ejemplo, el proceso de adbd consulta el servicio de propiedad para comprobar si se está ejecutando en el emulador. Otro ejemplo es java.io.File.pathSeparator
devuelve el valor almacenado en el servicio de propiedad.
Cómo funciona el sistema de propiedad
La arquitectura de alto nivel del sistema de propiedad se muestra a continuación.
Respecto a su problema.
Recomiendo encarecidamente que camine la respuesta propuesta. ¿Por qué?
Mira el property_service.h . Esta es una clase que llamará cuando ejecute el método SystemProperties.set
en nativo. Si intenta establecer native_set (key, val), no obtendrá un resultado positivo debido al método is_legal_property_name , que comprueba las reglas de propiedad en el nivel nativo.
Cuando le doy una conjetura, encontré que, el nombre del paquete de mi aplicación es de 108 caracteres. Y cuando cambié el nombre del paquete de mi aplicación a 60 caracteres, funcionó sin ningún problema.
Solo una suposición. Busque SystemProperties
como un análogo de SharedPreference en Android. No necesita una ruta completa establecida para su Actividad como key
. Sólo ponga un nombre. O con prefex o algo como esto.
Actualizar
Después de varias búsquedas encontré una fuente del archivo SystemProperties nativo. También define 92
como longitud máxima de valor y 32
como longitud máxima de clave . Así que esto es una restricción en el bajo nivel de Linux. Sólo puede corregirlo si corta su valor key
( <package_name>
.MainActivity en su caso)
Para futuras búsquedas:
http://rxwen.blogspot.com/2010/01/android-property-system.html
Una aplicación de terceros no tiene permiso para establecer una propiedad del sistema. Por lo tanto, la causa más probable del bloqueo es que el sistema está estableciendo el nombre del paquete como un valor para una propiedad del sistema.
Otras respuestas son correctas en que el valor máximo de una propiedad del sistema es 92 caracteres y la clave máxima es 32 caracteres. Sin embargo, su aplicación no está configurando la propiedad del sistema.
No hay mucho que puedas hacer para resolver este problema en tu final. Abriría un problema con Asus y consideraría cambiar su nombre de paquete (quizás sólo para el Asus Zenfone 2). Lamentablemente, como ya sabes, tendrías que publicar una nueva aplicación si cambiaste el nombre del paquete. Esperemos que Asus empuje una actualización que corrige este problema. Además, una buena razón para considerar la longitud de un nombre de paquete antes de lanzar a la producción 🙂
Problema complicado … la próxima vez que los nombres de paquetes más cortos 🙂
¿Trató de cambiar sólo el paquete de activities.MainActivity?
me gusta:
com.fourbigbrothers.malayalam_troll_greetings_maker_edit_movie_images_font_seasonal_photo_comments.a.MA
Si eso soluciona el problema, puede crear una herramienta (en gradle, java, python o whatver) para cambiar el nombre de todas las clases / paquetes de su proyecto usando Base64 para usar el número mínimo de caracteres posible antes de construir el proyecto.
Para el primer sistema lookProperty es una característica importante en android. Se ejecuta como un servicio y gestiona las configuraciones del sistema y el estado. Todas estas configuraciones y estado son propiedades. Una propiedad es un par clave / valor, los cuales son de tipo string. Desde el sentido de la función, es muy similar al registro de Windows. Muchas aplicaciones y bibliotecas de Android dependen directa o indirectamente de esta característica para determinar su comportamiento en tiempo de ejecución.
Por ejemplo, el proceso de adbd consulta el servicio de propiedad para comprobar si se está ejecutando en el emulador. Otro ejemplo es el archivo java.io.File.pathSeparator devuelve el valor almacenado en el servicio de propiedad. Cómo funciona el sistema de propiedad La arquitectura de alto nivel del sistema de propiedad se muestra como following.Regarding a su problem.I te recomiendo encarecidamente a pie la respuesta propuesta. ¿Por qué? Mire el property_service.h. Esta es una clase que llamará cuando ejecute el método SystemProperties.set en nativo. Si intenta establecer native_set (key, val) no obtendrá un resultado positivo debido al método is_legal_property_name, que comprueba las reglas de propiedad en el nivel nativo. Cuando le doy una conjetura, encontré que el nombre del paquete de mi aplicación es 108 caracteres largo. Y cuando cambié el nombre del paquete de mi aplicación a 60 caracteres, funcionó sin ningún problema. Sólo una suposición.
Busque SystemProperties como un análogo de SharedPreference en Android. No necesita una ruta completa establecida para su Actividad como clave. Sólo ponga un nombre. O con prefex o algo como this.UpdateAfter varias búsquedas encontré un origen de Native SystemProperties archivo. También define 92 como longitud máxima de valor y 32 como longitud máxima de clave. Así que esto es una restricción en el bajo nivel de Linux. Usted puede arreglar esto sólo por cortar su valor clave (.
MainActivity en su caso) Para futuras búsquedas: http://rxwen.blogspot.com/2010/01/android-property-system.html
Como no desea cambiar el nombre del paquete cuya longitud es 108 caracteres más de 91. Por lo tanto, tiene que omitir la excepción. Si se produce este error, se omitirá para su sección de codificación.
Análisis de Causa Raíz:
Ha perdido la sección donde se genera el error. Como dice val.length> 91
java.lang.IllegalArgumentException: val.length > 91
Por lo tanto, el error se genera desde la parte bloqueada.
/** * Set the value for the given key. * @throws IllegalArgumentException if the key exceeds 32 characters * @throws IllegalArgumentException if the value exceeds 92 characters */ public static void set(String key, String val) { if (key.length() > PROP_NAME_MAX) { throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); }
if (val != null && val.length() > PROP_VALUE_MAX) { throw new IllegalArgumentException("val.length > " + PROP_VALUE_MAX); // Error is generating from here }
native_set(key, val); }
Solución:
Si comprueba el método on, entonces obtendrá que comprueba primero la longitud de la clave y, a continuación, comprueba la longitud del valor. Después de que establecer la clave y el valor.
Así que para nuestro caso, nuestro objetivo es establecer la clave y el valor. Si la longitud del valor excede el carácter 91 entonces da IllegalArgumentException
. Así que necesito pasar por alto según el value
no la llave.
En MainActivity
, primero busco que llama a esta porción y genera error, entonces tenemos que evitarlo. Bypassing código se da a continuación. No he probado el código, pero se verá como a continuación. Si usted no está proporcionando el código de la muestra, apenas dé el mecanismo. Espero que lo haga frente con su código.
try { .... // MainActivity.java's portion code which calls the method and causes the error .... } catch (final Exception e) { e.printStackTrace(); if (e instanceof IllegalArgumentException) { // bypass IllegalArgumentException ....... if (key.length < 32) { // It checks that if the IllegalArgumentException is caused for key, then it throws error. It defines that it will be bypassed only for val.length() native_set(key, val); //native_set is called without checking length of value } else { throw e; } } }
Nota: Si proporciona un código de muestra mínimo y un registro de stacktrace completo, será mejor dar la respuesta apropiada.
ACTUALIZAR:
Otra forma de implementar. Puede cambiar MainActivity a SecondMainActivity. A continuación, creará una nueva MainActivity (Actividad de lanzador) con el nombre de paquete minimizado. Entonces esta MainActivity recién creada llamará a SecondMainActivity.
Por favor, tenga un intento y manténgame actualizado.
- Detalles técnicos de Android Garbage Collector
- ¿Qué pasó con windowContentOverlay en Android API 18?