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.

  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> 

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.

Introduzca aquí la descripción de la imagen

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_seas‌​onal_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.

  • Box2D rotar un objeto, ¿cómo?
  • Android - Código fuente de phonegap cordova.jar
  • Escucha un shoutcast con Android
  • Subida de imagen amazon s3 android SDK 2.0
  • Asmack - recibir mensajes XML personalizados ||
  • Serializar objeto personalizado que contiene objetos JodaTime en JSON
  • Generar código java en Eclipse?
  • Implementación de Getextra () y Putextra
  • Principal java.lang.RuntimeException: No se puede iniciar la actividad ComponentInfo
  • Compruebe el tiempo de PendingIntent existente en AlarmManager
  • ¿Es posible instalar java fx en un teléfono android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.