Android资源getString的IndexOutOfBoundsException异常

7

注意:这是与Android系统相关的特定问题,而不仅仅是一些人所建议的越界异常。

我有一个调查异常原因的问题。 我试图获取字符串资源文本(其中包含HTML):

val string = getString(R.string.long_html_text)

这个HTML当然是有效的(可以在模拟器和其他真实设备上运行),但在真实设备LGE Nexus 5X API 27上不行。该HTML文本有40113个字符。

当我尝试获取上述字符串资源时,会出现以下异常:

   04-17 14:38:17.136 2847-2847/com.myapp.tmt.app.myapp E/AndroidRuntime: FATAL EXCEPTION: main
   Process: com.myapp.tmt.app.myapp, PID: 2847
   java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.tmt.app.myapp/com.myapp.tmt.app.myapp.ui.eula.EulaActivity}: java.lang.IndexOutOfBoundsException
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
       at android.app.ActivityThread.-wrap11(Unknown Source:0)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6494)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
    Caused by: java.lang.IndexOutOfBoundsException
       at android.content.res.StringBlock.nativeGetString(Native Method)
       at android.content.res.StringBlock.get(StringBlock.java:82)
       at android.content.res.AssetManager.getResourceValue(AssetManager.java:236)
       at android.content.res.AssetManager.getResourceText(AssetManager.java:164)
       at android.content.res.Resources.getText(Resources.java:335)
       at android.content.res.Resources.getString(Resources.java:433)
       at android.content.Context.getString(Context.java:556)
       at com.myapp.tmt.app.myapp.ui.eula.EulaActivity.prepareLicence(EulaActivity.kt:33)
       at com.myapp.tmt.app.myapp.ui.eula.EulaActivity.onCreate(EulaActivity.kt:28)
       at android.app.Activity.performCreate(Activity.java:6999)
       at android.app.Activity.performCreate(Activity.java:6990)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
       at android.app.ActivityThread.-wrap11(Unknown Source:0) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
       at android.os.Handler.dispatchMessage(Handler.java:106) 
       at android.os.Looper.loop(Looper.java:164) 
       at android.app.ActivityThread.main(ActivityThread.java:6494) 
       at java.lang.reflect.Method.invoke(Native Method) 
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807

有人遇到过这个问题吗?

你在 strings.xml 中添加 HTML 时是否使用了这个 <string name="html"><![CDATA[<p>Text<p>]]></string>? - Anonymous
1
@Konrad 是的,我也遇到了这个问题,最新的安卓安全更新似乎减少了字符串的最大长度,以应对安全漏洞。尝试“缩短”你的字符串长度,并检查错误是否会消失。如果你正在使用字符串资源来模拟数据,那么这将非常令人恼火,而且你可以想象,更长的字符串(例如新闻等)将会破坏你的应用程序。 - bko
1
@Konrad https://source.android.com/security/bulletin/2018-04-01,我很确定这个更新中有些改动,因为我的其他没有更新的手机可以正常使用特别“长”的XML资源字符串,但是我的Nexus却会抛出和你一样的异常。 - bko
@Selvin 正常。请查看 bko 的评论。 - K.Os
@Ruan_Lopes 我有90%的把握这只与Android Oreo有关——字符串资源有最大范围。我通过将我的非常长的字符串分成两部分来解决这个问题。 - K.Os
显示剩余6条评论
1个回答

3

由于这个问题只在Android Oreo设备上出现,我通过将我的非常长的HTML字符串分成两部分来解决这个问题。

我认为这个问题是由于新的Android安全限制引起的(正如一些人在这里建议的那样)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接