Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ActivityManager:启动活动时引发异常java.lang.IllegalArgumentException:val.length>;91_Java_Android_Android Activity - Fatal编程技术网

ActivityManager:启动活动时引发异常java.lang.IllegalArgumentException:val.length>;91

ActivityManager:启动活动时引发异常java.lang.IllegalArgumentException:val.length>;91,java,android,android-activity,Java,Android,Android Activity,启动应用程序的MainActivity时,它会立即崩溃。当我查找adb日志时,我只能找到这个 Exception thrown when launching activities in ProcessRecord java.lang.IllegalArgumentException: val.length > 91 at SystemProperties.set 当我查找android的源代码时,我发现这可能是问题的根源。它的最大值限制为91 public static

启动应用程序的MainActivity时,它会立即崩溃。当我查找adb日志时,我只能找到这个

Exception thrown when launching activities in ProcessRecord
  java.lang.IllegalArgumentException: val.length > 91
  at SystemProperties.set
当我查找android的源代码时,我发现这可能是问题的根源。它的最大值限制为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个字符时,它运行起来没有任何问题

可能是什么问题? 这只发生在华硕Zenfone 2(Lolipop 5.0)
型号上

任何其他设备都没有问题。由于这个问题,我们收到了很多负面评价

我们的应用程序已在play store中下载了15K因此更改 我不能选择应用程序的程序包名称。请帮助

更新

更准确地说,是存在的

除了华硕Zenfone系列之外,我们测试的所有android手机都没有问题

正如@ViswanathLekshmanan在评论中提到的,我将MainAcitivity.java文件的位置更改为较低的路径

也就是说,最初的完整包装名称是:-“com.fourbigbrothers.malayalam\u troll\u问候语\u制作人\u编辑\u电影\u图像\u字体\u季节性\u照片\u评论.活动.MainActivity”

我把它改为:-“com.fourbigbrothers.mtm.activities.MainActivity”

仍然不起作用。我已经在创建main活动时将一些日志放到了,但是代码执行根本没有到达那里。所以我不知道在哪里放置一些答案中提到的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>

因为您不想更改长度超过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); 
    } 

解决方案: 如果您检查on方法,那么您将得到它首先检查键的长度,然后检查值长度。然后设置键和值

所以对于我们的案例,我们的目标是设定关键和价值。如果值的长度超过91个字符,则给出
IllegalArgumentException
。所以我需要根据
value
not键绕过

MainActivity
中,我首先搜索调用此部分并生成错误的部分,然后我们必须绕过它。旁路代码如下所示。我还没有测试代码,但它将如下所示。如果您没有提供示例代码,那么我只给出机制。希望你能用你的代码来处理它

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;
        }
    }
}
试试看{
....
//java调用该方法并导致错误的部分代码
....
}捕获(最终异常e){
e、 printStackTrace();
如果(IllegalArgumentException的e实例){//bypass IllegalArgumentException
.......
如果(key.length<32){//它检查是否导致key的IllegalArgumentException,然后抛出错误。它定义仅对val.length()绕过它
native_set(key,val);//调用native_set时不检查值的长度
}否则{
投掷e;
}
}
}
注意:如果你提供最小的样本代码和完整的stacktrace日志,那么 最好给出适当的答案


更新: 您可以实现的另一种方法。您可以将MainActivity更改为SecondMainActivity。然后,您将创建一个新的MainActivity(启动程序活动),其包名最小化。然后,这个新创建的MainActivity将调用SecondMainActivity


请尝试并保持更新。

棘手的问题…下次使用较短的软件包名称:)

您是否仅尝试更改activities.MainActivity的包

比如:

如果这解决了问题,您可以创建一个工具(gradle、java、python或whatver)来使用Base64重命名项目的所有类/包,以便在构建项目之前使用尽可能少的字符数。

第一次查看 属性系统是android上的一个重要功能。它作为服务运行,并管理系统配置和状态。所有这些配置和状态都是属性。属性是键/值对,两者都是字符串类型。 从功能上看,它与windows注册表非常相似。许多android应用程序和库直接或间接地依赖此功能来确定其运行时行为。例如,adbd进程查询属性服务以检查它是否在emulator中运行。另一个例子是
java.io.File.pathSeparator
返回存储在属性服务中的值

产权制度如何运作 物业系统的高层架构如下图所示

关于你的问题。
我强烈建议你仔细考虑一下提议的计划。 为什么?

看这张照片。这是一个在您执行
SystemProperties.set
本机方法时调用的类。如果您试图设置本机_set(key,val),您将不会得到一个积极的结果,因为方法在本机级别上检查属性规则

当我猜测时,我发现,我的应用程序的包名是108个字符长。当我将我的应用程序包名改为60个字符时,它工作起来没有任何问题

只是猜测而已。像模拟一样查看
SystemProperties
    native_set(key, val); 
} 
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;
        }
    }
}
com.fourbigbrothers.malayalam_troll_greetings_maker_edit_movie_images_font_seas‌​onal_photo_comments.a.MA