Question ActivityManager: exception levée lors du lancement des activités java.lang.IllegalArgumentException: val.length> 91


Lors du lancement de MainActivity of Application, il se bloque instantanément. Lorsque j'ai consulté les journaux d'AdB, j'ai pu trouver seulement ceci,

Exception thrown when launching activities in ProcessRecord
  java.lang.IllegalArgumentException: val.length > 91
  at SystemProperties.set

Quand j'ai cherché le code source d'android, j'ai trouvé que cela pouvait être la racine du problème Code source Android de SystemProperties.java. Il contient une limite maximale 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); 
    } 

Quand je pense, j'ai trouvé que mon application le nom du paquet est de 108 caractères longue. Et quand j'ai changé les applications nom du paquet à 60 caractères, cela a fonctionné sans aucun problème.

Quel pourrait être le problème? Cela ne se produit que sur Asus Zenfone 2 (Lolipop 5.0) modèle.

Il n'y a pas de problème dans d'autres appareils. Nous recevons beaucoup de notes négatives en raison de ce problème.

Notre application dispose déjà de 15 000 téléchargements dans le magasin de jeux. donc changer le   Le nom du package de l'application n'est pas une option pour moi. S'il vous plaît aider

Mettre à jour

Pour être plus précis, il y a

aucun problème dans tous les téléphones Android que nous avons testés autre que Asus Zenfone Series

Comme mentionné par @ViswanathLekshmanan dans les commentaires, j'ai changé l'emplacement du fichier MainAcitivity.java sur un chemin inférieur.

c'est-à-dire que le nom de fichier d'origine était: - "com.fourbigbrothers.malayalam_troll_greetings_maker_edit_movie_images_font_seasonal_photo_comments.activities.MainActivity"

Je l'ai changé pour: - "com.fourbigbrothers.mtm.activities.MainActivity"

Ne fonctionne toujours pas. J'ai mis des bûches dans onCréer de la MainActivity, mais l'exécution du code n'y parvient pas du tout. Je ne sais donc pas où placer un bloc try / catch comme mentionné dans certaines réponses.

Y aurait-il une solution utilisant le ndk Android? Et désolé si c'est une question stupide, je suis complètement perdu.

Ceci est la partie pertinente du manifeste

<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>

26
2018-04-24 06:51


origine


Réponses:


Pour le premier regard

Système de propriété est une fonctionnalité importante sur Android. Il fonctionne en tant que service et gère les configurations et le statut du système. Toutes ces configurations et cet état sont des propriétés. Une propriété est une paire clé / valeur, toutes deux de type chaîne. Du point de vue de la fonction, il est très similaire au registre Windows. De nombreuses applications et bibliothèques Android utilisent directement ou indirectement cette fonctionnalité pour déterminer leur comportement d'exécution. Par exemple, le processus adbd interroge le service de propriétés pour vérifier s'il est exécuté dans un émulateur. Un autre exemple est le java.io.File.pathSeparator renvoie la valeur stockée dans le service de propriétés.

Comment fonctionne le système de propriété

L'architecture de haut niveau du système de propriété est présentée ci-dessous.

enter image description here

En ce qui concerne votre problème.

Je vous recommande fortement de marcher le proposé répondre. Pourquoi?

Regarde le property_service.h. Ceci est une classe qui appellera que vous exécutez SystemProperties.set méthode en natif. Si vous essayez de définir native_set (key, val), vous n'obtiendrez pas de résultat positif en raison de is_legal_property_name méthode, qui vérifie les règles de propriété au niveau natif.

Lorsque je suppose, j'ai trouvé que le nom du package de mon application comporte 108 caractères. Et lorsque j'ai changé le nom du package de mon application en 60 caractères, cela a fonctionné sans aucun problème.

Juste une supposition. Regarder à SystemProperties comme un analogue de SharedPreference dans Android. Vous n'avez pas besoin d'un chemin complet pour votre activité key. Il suffit de mettre un nom. Ou avec prefex ou quelque chose comme ça.

Mettre à jour

Après plusieurs recherches, j'ai trouvé un la source du fichier natif SystemProperties. Il définit également 92 comme longueur maximale de valeur, et 32 comme une longueur maximale de clé. C'est donc une restriction sur le bas niveau Linux. Vous pouvez résoudre ce problème uniquement en coupant votre key valeur (<package_name>.MainActivity dans votre cas)

Pour les recherches futures:

http://rxwen.blogspot.com/2010/01/android-property-system.html


3
2018-04-26 19:48



Une application tierce n'est pas autorisée à définir une propriété système. Par conséquent, la cause la plus probable de la panne est que le système définit le nom du package comme une valeur pour une propriété système.

Les autres réponses sont correctes en ce sens que la valeur maximale d'une propriété système est de 92 caractères et la clé maximale de 32 caractères. Toutefois, votre application ne définit pas la propriété système.

Vous ne pouvez pas faire grand chose pour résoudre ce problème de votre côté. Je voudrais ouvrir un problème avec Asus et envisager de changer votre nom de paquet (peut-être seulement pour le Asus Zenfone 2). Malheureusement, comme vous le savez déjà, vous devez publier une nouvelle application si vous modifiez le nom du package. Espérons que Asus pousse une mise à jour pour résoudre ce problème. Aussi, une bonne raison de considérer la longueur d'un nom de paquet avant de le lancer en production :)


2
2018-04-27 15:52



Problème épineux ... la prochaine fois des noms de paquets plus courts :)

Avez-vous essayé de changer uniquement le paquet d'activités.MainActivity?

comme:

com.fourbigbrothers.malayalam_troll_greetings_maker_edit_movie_images_font_seas‌​onal_photo_comments.a.MA

Si cela résout le problème, vous pouvez créer un outil (en gradle, java, python ou whatver) pour renommer toutes les classes / packages de votre projet en utilisant Base64 pour utiliser le nombre minimum de caractères possible avant de construire le projet.


0
2018-04-26 19:43



Pour le premier système lookProperty est une fonctionnalité importante sur Android. Il fonctionne en tant que service et gère les configurations et le statut du système. Toutes ces configurations et cet état sont des propriétés. Une propriété est une paire clé / valeur, toutes deux de type chaîne. Du point de vue de la fonction, elle est très similaire au registre Windows. De nombreuses applications et bibliothèques Android utilisent directement ou indirectement cette fonctionnalité pour déterminer leur comportement d'exécution.

Par exemple, le processus adbd interroge le service de propriétés pour vérifier s'il est exécuté dans un émulateur. Un autre exemple est le fichier java.io.File.pathSeparator qui retourne la valeur stockée dans la propriété service.Comment le système de propriété fonctionne-t-il? Pourquoi? Regardez le property_service.h. C'est une classe qui appellera l'exécution de la méthode SystemProperties.set en natif. Si vous essayez de définir le paramètre native_set (key, val), vous n'obtiendrez pas de résultat positif en raison de la méthode is_legal_property_name, qui vérifie les règles de propriété au niveau natif. longue. Et quand j'ai changé le nom du paquet de mon application à 60 caractères, cela a fonctionné sans aucun problème.

Regardez SystemProperties comme un analogue de SharedPreference sous Android. Vous n'avez pas besoin d'un chemin d'accès complet à votre activité en tant que clé. Il suffit de mettre un nom. Ou avec prefex ou quelque chose comme ça.UpdateAprès plusieurs recherches, j'ai trouvé une source de fichier Native SystemProperties. Il définit également 92 comme longueur maximale de la valeur et 32 ​​comme longueur maximale de la clé. C'est donc une restriction sur le bas niveau Linux. Vous pouvez résoudre ce problème uniquement en coupant votre valeur de clé (.

MainActivity dans votre cas) Pour les recherches futures: http://rxwen.blogspot.com/2010/01/android-property-system.html


0
2018-05-03 13:07



Comme vous ne voulez pas changer le nom du paquet dont la longueur est de 108 caractères supérieure à 91. Vous devez donc ignorer l'exception. Si cette erreur se produit, elle sera contournée pour votre section de codage.

Analyse de la cause originelle:

Vous avez manqué la section où l'erreur se produit. Comme il a dit val.length> 91

java.lang.IllegalArgumentException: val.length > 91

Donc, l'erreur est générée à partir de la partie bloquée.

/**
 * 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); 
} 

Solution:

Si vous vérifiez la méthode on, vous obtiendrez qu'elle vérifie d'abord la longueur de la clé, puis vérifie la longueur de la valeur. Après cela, définissez la clé et la valeur.

Donc, pour notre cas, notre objectif est de définir la clé et la valeur. Si la longueur de la valeur dépasse 91 caractères, cela donne IllegalArgumentException. J'ai donc besoin de contourner selon value pas de clé.

Dans MainActivity, Je recherche d'abord qui appelle cette partie et génère une erreur, puis nous devons la contourner. Le code de contournement est donné ci-dessous. Je n'ai pas testé le code mais ce sera comme ci-dessous. Si vous ne fournissez pas de code exemple, je donne simplement le mécanisme. J'espère que vous allez y faire face avec votre code.

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;
        }
    }
}

N.B: Si vous fournissez un code d’échantillon minimum et un journal de trace complet,   il vaudra mieux donner une réponse appropriée.


METTRE À JOUR:

Une autre façon de mettre en œuvre. Vous pouvez remplacer MainActivity par SecondMainActivity. Ensuite, vous allez créer une nouvelle MainActivity (activité de lancement) avec un nom de package réduit. Ensuite, cette nouvelle MainActivity appellera SecondMainActivity.

S'il vous plaît essayer et me tenir au courant.


-2
2018-04-26 19:18