Small icon indicating copy to clipboard operation
Small copied to clipboard

android7.0 兼容问题:android:configChanges属性activity横竖屏切换时获取资源崩溃

Open hcanyz opened this issue 9 years ago • 14 comments

  • [x] 我已阅读并理解 贡献指南,严格遵循其约定。

错误报告

你做了什么?

已下现象基于:Simple工程,安卓7.0系统测试机 Demo地址:https://github.com/kongyan4696/Small/tree/master/Android/Sample Demo变更文件见 2016.11.16提交记录。

1.将PickerActivity 从app.mine AndroidManifest.xml 去除。 2.将PickerActivity 注册到宿主app AndroidManifest.xml 中,并添加属性 android:configChanges="orientation|keyboardHidden|screenSize"

在app.mine模块PickerActivity中 ,使用了

getString(R.string.pick)。 getString(R.string.lib_style_hello)。

R.string.pick为app.mine中的一个资源。. R.string.lib_style_hello 为lib.style中的一个资源。.

使用 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 切换到横屏。

你期望的结果是什么?

安卓7.0系统, 横竖屏切换后,能正常app.xxx能正常使用 lib.xxx 和 自身的资源。

实际结果是什么?

getString(R.string.pick)。闪退。 getString(R.string.lib_style_hello)。闪退。

Small发送运行报错,报错信息如下:

 FATAL EXCEPTION: main
                  Process: net.wequick.example.small, PID: 13346
                  android.content.res.Resources$NotFoundException: String resource ID #0x16040003
                      at android.content.res.Resources.getText(Resources.java:331)
                      at android.content.res.Resources.getString(Resources.java:377)
                      at android.content.Context.getString(Context.java:476)
                      at net.wequick.example.small.app.mine.PickerActivity$1.onClick(PickerActivity.java:41)
                      at android.view.View.performClick(View.java:5609)
                      at android.view.View$PerformClick.run(View.java:22259)
                      at android.os.Handler.handleCallback(Handler.java:751)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6077)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

Small环境

Compile-time

  gradle-small plugin : 1.1.0-beta3 (maven)
            small aar : 1.1.0-beta8 (maven)
          gradle core : 2.14.1
       android plugin : 2.2.2
                   OS : Windows 7 6.1 (amd64)

Bundles

type name PP sdk aapt support file(armeabi) size
host app 23 23.0.3 23.4.0
stub app+stub 23 23.0.3 23.4.0
app app.main 0x77 23 23.0.3 23.4.0 *_main.so 11.8 KB
app app.mine 0x16 23 23.0.3 *_mine.so 36.4 KB
app app.ok-if-stub 0x6a 23 23.0.3 *_stub.so 18.5 KB
app app.detail 0x67 23 23.0.3 23.4.0 *_detail.so 7.5 KB
app app.home 0x70 23 23.0.3 *_home.so 11.3 KB
lib lib.analytics 0x76 23 23.0.3 *_analytics.so 126.8 KB
lib lib.utils 0x73 23 23.0.3 23.4.0 *_utils.so 6.7 KB
lib lib.style 0x79 23 23.0.3 23.4.0 *_style.so 5.6 KB
web web.about 23 23.0.3 23.4.0 *_about.so 24.3 KB

hcanyz avatar Nov 16 '16 08:11 hcanyz

@kongyan4696 android:configChanges属性暂未支持,需要把该Activity的manifest部分注册在宿主。

galenlin avatar Nov 16 '16 08:11 galenlin

@galenlin 是注册在宿主的。 可以看下demo

hcanyz avatar Nov 16 '16 08:11 hcanyz

好的,是否只在7.0以上出现问题?

galenlin avatar Nov 16 '16 08:11 galenlin

@galenlin 是的。 其他版本系统已经测试,暂时没有发现该问题。

hcanyz avatar Nov 16 '16 08:11 hcanyz

好,我看下

galenlin avatar Nov 16 '16 08:11 galenlin

@kongyan4696 我这试过是正常的,按钮文本能正常切换。你试下重新编译。

galenlin avatar Nov 17 '16 00:11 galenlin

@galenlin 只有7.0系统的手机才会有这个问题。

我更新了你早上提交的代码,还是有这个问题。

hcanyz avatar Nov 17 '16 01:11 hcanyz

我在模拟器上用API24是可以的

galenlin avatar Nov 17 '16 02:11 galenlin

@galenlin 我试了下模拟器,也是可以。 但是 真机(nexus 6p)上确实存在该问题。

hcanyz avatar Nov 17 '16 03:11 hcanyz

临时解决方案: 需要横竖屏切换的地方,对Context进行替换:

private Context getIfNeedV24HookContext() {
	if (Build.VERSION.SDK_INT > 23)
		return new ContextWrapper(getActivity()) {
			@Override
			public Resources getResources() {
				return ResourceUtil.getResources();
			}

			@Override
			public Object getSystemService(String name) {
                                //这个为全局的Application
				return ContextManager.getAppContext().getSystemService(name);
			}
		};
	else
		return getActivity();
}

引发该问题原因猜测:

可能是7.0系统,对含有configchanges属性的Activity 进行横竖屏切换时,替换了Activity的Resource,导致Small hook的Resouce无效。

hcanyz avatar Nov 21 '16 02:11 hcanyz

@kongyan4696 你在该系统上是否Activity被重建了呢,看下Resources什么时候被替换了

galenlin avatar Nov 21 '16 02:11 galenlin

@galenlin 这俩天比较忙,后续我在研究下。

hcanyz avatar Nov 21 '16 03:11 hcanyz

ok, tks.

galenlin avatar Nov 21 '16 03:11 galenlin

@kongyan4696 你好,我在获取应用名字和图标时遇到了和你类似的问题,你上面解决方案中的ResourceUtil.getResources()方法具体是怎么实现的呢?

wangsf1112 avatar Aug 29 '17 01:08 wangsf1112