Подтвердить что ты не робот

ActivityManager: Исключение при запуске java.lang.IllegalArgumentException: val.length> 91

При запуске MainActivity приложения он мгновенно сбой. Когда я просмотрел журналы adb, я смог найти только это,

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

Когда я посмотрел исходный код android, я обнаружил, что это может быть корень проблемы Исходный код Android SystemProperties.java, Он содержит максимальное значение предела 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); 
    } 

Когда я догадываюсь, я обнаружил, что мое имя приложения имеет длину 108 символов. И когда я изменил имя приложения на 60 символов, он работал без проблем.

В чем может быть проблема? Это происходит только в модели Asus Zenfone 2 (Lolipop 5.0).

В других устройствах нет проблем. Из-за этой проблемы мы получаем много отрицательного рейтинга.

У нашего приложения уже есть 15K загрузок в игровом магазине. , поэтому изменение имя пакета приложения не является для меня вариантом. Пожалуйста, помогите

Обновление

Чтобы быть более точным, существует

нет проблем во всех телефонах Android, которые мы тестировали, кроме серии Asus Zenfone

Как упоминалось в комментариях @ViswanathLekshmanan, я изменил местоположение файла MainAcitivity.java на более низкий путь.

то есть исходное полное имя пакета: - "com.fourbigbrothers.malayalam_troll_greetings_maker_edit_movie_images_font_seasonal_photo_comments.activities.MainActivity"

Я изменил его на: - "com.fourbigbrothers.mtm.activities.MainActivity"

Все еще не работает. Я поместил несколько журналов в onCreate of MainActivity, но выполнение кода там вообще не доходит. Поэтому я не знаю, где поставить блок try/catch, как указано в некоторых ответах.

Будет ли какое-либо решение, использующее android ndk? И извините, если это тупой вопрос, я полностью потерял.

Это важная часть манифеста

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

Ответ 1

Для первого взгляда

Система собственности является важной особенностью в android. Он работает как служба и управляет конфигурациями и статусом системы. Все эти конфигурации и статус являются свойствами. Свойство представляет собой пару ключ/значение, оба из которых имеют тип строки. Из чувства функции он очень похож на реестр Windows. Многие приложения и библиотеки Android напрямую или косвенно полагаются на эту функцию, чтобы определить их поведение во время работы. Например, adbd обрабатывает запрос свойства, чтобы проверить, работает ли он в эмуляторе. Другой пример: java.io.File.pathSeparator возвращает значение, сохраненное в службе свойств.

Как работает система свойств

Архитектура системы свойств высокого уровня показана следующим образом.

введите описание изображения здесь

Относительно вашей проблемы.

Я настоятельно рекомендую вам выполнить предложенный ответ. Почему?

Посмотрите property_service.h. Это класс, который будет вызван тем, что вы выполняете метод SystemProperties.set в native. Если вы пытаетесь установить native_set (key, val), вы не получите положительного результата из-за метода is_legal_property_name, который проверяет правила свойств на родном уровень.

Когда я догадываюсь, я обнаружил, что мое имя пакета приложений составляет 108 символов. И когда я изменил имя своего приложения на 60 символов, он работал без проблем.

Просто догадаться. Посмотрите SystemProperties как аналог SharedPreference в Android. Вам не нужен полный путь к вашей деятельности как key. Просто введите имя. Или с prefex или что-то вроде этого.

Update

После нескольких поисков я обнаружил источник файла Native SystemProperties. Он также определяет 92 как максимальную длину значение и 32 как максимальную длину ключа. Таким образом, это ограничение на низком уровне Linux. Вы можете исправить это, только сократив значение key (<package_name>.MainActivity в вашем случае)

Для будущих поисков:

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

Ответ 2

У стороннего приложения нет разрешения на установку системного свойства. Поэтому наиболее вероятной причиной сбоя является то, что система устанавливает имя пакета как значение для системного свойства.

Другие ответы верны в том, что максимальное значение системного свойства составляет 92 символа, а максимальный - 32 символа. Однако ваше приложение не устанавливает системное свойство.

Вы не можете сделать это, чтобы решить эту проблему. Я бы открыл проблему с Asus и подумал об изменении своего имени пакета (возможно, только для Asus Zenfone 2). К сожалению, как вы уже знаете, вам нужно будет опубликовать новое приложение, если вы изменили имя пакета. Надеюсь, Asus подталкивает обновление, которое устраняет эту проблему. Кроме того, хорошая причина для рассмотрения длины имени пакета перед выпуском в производство:)

Ответ 3

Трудная проблема... в следующий раз более короткие имена пакетов:)

Вы пытались изменить только пакет действий. MainActivity?

как:

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

Если это решает проблему, вы можете создать инструмент (в gradle, java, python или whatver), чтобы переименовать все классы/пакеты вашего проекта, используя Base64, чтобы использовать минимальное количество символов, возможно, до создания проекта.

Ответ 4

Для первой системы lookProperty важная функция для Android. Он работает как служба и управляет конфигурациями и статусом системы. Все эти конфигурации и статус являются свойствами. Свойство - это пара ключей/значений, каждая из которых имеет тип string.С точки зрения функции, она очень похожа на реестр Windows. Многие приложения и библиотеки Android напрямую или косвенно полагаются на эту функцию, чтобы определить их поведение во время работы.

Например, adbd обрабатывает запрос свойства, чтобы проверить, работает ли он в эмуляторе. Другим примером является java.io.File.pathSeparator возвращает значение, хранящееся в службе свойств. Как работает система свойств. Архитектура системы свойств высокого уровня показана следующим образом. Относительно вашей проблемы. Я настоятельно рекомендую вам пройти предложенный ответ. Почему? Посмотрите на property_service.h. Это класс, который будет вызван тем, что вы выполняете метод SystemProperties.set в native. Если вы попытаетесь установить native_set (key, val), вы не получите положительного результата из-за метода is_legal_property_name, который проверяет правила свойств на собственном уровне. Когда я даю ему догадки, я обнаружил, что мое имя пакета приложений составляет 108 символов длинный. И когда я изменил имя своего приложения на 60 символов, он работал без каких-либо проблем. Просто догадайтесь.

Посмотрите на SystemProperties, как аналог SharedPreference в Android. Вам не нужен полный путь к вашей активности как к ключу. Просто введите имя. Или с prefex или что-то вроде этого .UpdateПосле нескольких поисков я нашел источник файла Native SystemProperties. Он также определяет 92 как максимальную длину значения, а 32 - максимальную длину ключа. Таким образом, это ограничение на низком уровне Linux. Вы можете исправить это, только сократив свое значение ключа (.

MainActivity в вашем случае) Для будущих поисков: http://rxwen.blogspot.com/2010/01/android-property-system.html

Ответ 5

Поскольку вы не хотите изменять имя пакета, длина которого составляет 108 символов больше 91. Таким образом, вы должны обойти исключение. Если эта ошибка возникает, она будет обойдена для вашего раздела кодирования.

Анализ корневой причины:

Вы пропустили раздел, в котором генерируется ошибка. Как сказано val.length > 91

java.lang.IllegalArgumentException: val.length > 91

Таким образом, ошибка генерируется из заблокированной части.

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

Решение:

Если вы проверите метод on, то вы получите, что он сначала проверяет длину ключа, а затем проверяет длину значения. После этого установите ключ и значение.

Итак, для нашего случая наша цель - установить ключ и значение. Если длина значения превышает 91 символ, он дает IllegalArgumentException. Поэтому мне нужно обходить в соответствии с value не ключом.

В MainActivity, я сначала ищу, который вызывает эту часть и генерирует ошибку, тогда мы должны ее обойти. Ниже приведен код обхода. Я не тестировал код, но он будет выглядеть ниже. Если вы не предоставляете образец кода, я просто даю механизм. Надеюсь, вы справитесь с этим кодом.

try {
....
// MainActivity.java 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: Если вы предоставили минимальный примерный код и полный файл stacktrace, тогда лучше дать соответствующий ответ.


UPDATE:

Другой способ, которым вы можете реализовать. Вы можете изменить MainActivity на SecondMainActivity. Затем вы создадите новую MainActivity (активность запуска) с минимальным именем пакета. Затем эта вновь созданная MainActivity вызовет SecondMainActivity.

Пожалуйста, попробуйте и сохраните меня.