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

2022-09-01 16:16:40

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

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

当我查找Android的源代码时,我发现这可能是Android源代码系统属性问题的根源.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个字符时,它可以正常工作,没有任何问题。

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

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

我们的应用程序已经在Play商店中下载了15K。因此,更改应用程序的包名称对我来说不是一个选项。请帮忙

更新

更准确地说,有

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

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

即,原始的完整软件包名称是:- “com.fourbigbrothers.malayalam_troll_greetings_maker_edit_movie_images_font_seasonal_photo_comments.activities.MainActivity”

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

仍然无法正常工作。我已经在创建MainActivity上放置了一些日志,但是代码执行根本没有到达那里。所以我不知道在哪里放置一个尝试/捕获块,如一些答案中提到的。

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

答案 1

第一眼

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

属性系统的工作原理

属性系统的高级体系结构如下所示。

enter image description here

关于你的问题。

我强烈建议您跳过建议的答案。为什么?

看看property_service.h。这是一个类,它将调用 whe you 在本机中执行方法。如果您尝试设置native_set(key,val),则不会由于is_legal_property_name方法而获得正结果,该方法在本机级别检查属性规则。SystemProperties.set

当我给它一个猜测时,我发现,我的应用程序的包名称是108个字符长。当我将应用程序的包名称更改为60个字符时,它可以正常工作,没有任何问题。

只是一个猜测。看起来像Android中SharedPreference的类似物。您不需要将活动的完整路径设置为 。只需输入一个名称。或者使用prefex或类似的东西。SystemPropertieskey

更新

经过几次搜索,我找到了本机系统属性文件的来源。他还将的最大长度定义为密钥的最大长度。所以这是对Linux低级的限制。您只能通过削减值(.主要活动在你的情况下)9232key<package_name>

对于将来的搜索:

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


答案 2

第三方应用程序没有设置系统属性的权限。因此,崩溃的最可能原因是系统将包名称设置为系统属性的值。

其他答案是正确的,因为系统属性的最大值为 92 个字符,最大键为 32 个字符。但是,你的应用未设置系统属性。

您无法做很多事情来解决此问题。我会向华硕提出一个问题,并考虑更改您的软件包名称(也许仅适用于华硕Zenfone 2)。不幸的是,正如您已经知道的那样,如果您更改了包名称,则需要发布新应用程序。希望华硕推出一个修复此问题的更新。此外,在发布到生产环境之前,考虑包名称长度的一个很好的理由:)


推荐