android7.0 兼容问题:android:configChanges属性activity横竖屏切换时获取资源崩溃
- [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 |
@kongyan4696 android:configChanges属性暂未支持,需要把该Activity的manifest部分注册在宿主。
@galenlin 是注册在宿主的。 可以看下demo
好的,是否只在7.0以上出现问题?
@galenlin 是的。 其他版本系统已经测试,暂时没有发现该问题。
好,我看下
@kongyan4696 我这试过是正常的,按钮文本能正常切换。你试下重新编译。
@galenlin 只有7.0系统的手机才会有这个问题。
我更新了你早上提交的代码,还是有这个问题。
我在模拟器上用API24是可以的
@galenlin 我试了下模拟器,也是可以。 但是 真机(nexus 6p)上确实存在该问题。
临时解决方案: 需要横竖屏切换的地方,对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无效。
@kongyan4696 你在该系统上是否Activity被重建了呢,看下Resources什么时候被替换了
@galenlin 这俩天比较忙,后续我在研究下。
ok, tks.
@kongyan4696 你好,我在获取应用名字和图标时遇到了和你类似的问题,你上面解决方案中的ResourceUtil.getResources()方法具体是怎么实现的呢?