<Excerpt in index | 首页摘要>
反射创建对象失败,提示没有权限访问
锤子ROM一启动app就crash
<The rest of contents | 余下全文>
反射创建对象失败,提示没有权限访问
平台:flyme、锤子
简单的说,当前项目是抽取ViewModel层,activity负责UI方面和传递相应数据给viewholder的工作
viewholder负责具体逻辑、类似网络请求等操作。
然后新版本测试的时候发现,两个界面进入显示空UI 没有具体的数据(消息、个人信息)
而且目前发现有这个问题的只有flyme、锤子等2个rom。通过logcat发现 日志提示内容是没有权限创建viewholder的对象(viewholder对象的创建是依赖反射来创建的)
最开始误以为是因为appcrash后rom提供的classloader不一致导致的。
后来发现是我想太多。
真实的原因是那两个界面的viewholderclass的访问修饰符是default的!
但是鬼知道flyme、锤子做了什么操作 activity和viewholder在一个包下的情况 它认为没有权限!而且奇葩的事情是 直接run上去的app没有问题,如果是利用apk安装出来的就有锅。
有一句mmp,不知当讲不当讲!
锤子ROM一启动app就crash
产品这两天一直反馈我提供的安装包安装完成的app一打开就crash
通过bugly统计日志发现错误信息如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| SIGSEGV(SEGV_MAPERR) #00 pc 000000000029d31c /system/lib64/libart.so (_ZN3art6mirror9ArtMethod7ToDexPcEmb+220) [arm64-v8a::8f291f51cb11a01a56d5cb19d9514401] 2 #01 pc 0000000000308e48 /system/lib64/libart.so (_ZN3art20CurrentMethodVisitor10VisitFrameEv+76) [arm64-v8a::8f291f51cb11a01a56d5cb19d9514401] 3 #02 pc 0000000000307bf0 /system/lib64/libart.so (_ZN3art12StackVisitor9WalkStackEb+180) [arm64-v8a::8f291f51cb11a01a56d5cb19d9514401] 4 #03 pc 0000000000311e50 /system/lib64/libart.so (_ZNK3art6Thread4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE+264) [arm64-v8a::8f291f51cb11a01a56d5cb19d9514401] 5 #04 pc 000000000031ab90 /system/lib64/libart.so (_ZN3art10ThreadList10DumpLockedERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE+100) [arm64-v8a::8f291f51cb11a01a56d5cb19d9514401] 6 #05 pc 00000000002fa69c /system/lib64/libart.so (_ZN3art7Runtime5AbortEv+572) [arm64-v8a::8f291f51cb11a01a56d5cb19d9514401] 7 #06 pc 00000000000cce90 /system/lib64/libart.so (_ZN3art10LogMessageD1Ev+2748) [arm64-v8a::8f291f51cb11a01a56d5cb19d9514401] 8 #07 pc 00000000000dc044 /system/lib64/libart.so (_ZN3artL8JniAbortEPKcS1_+2132) [arm64-v8a::8f291f51cb11a01a56d5cb19d9514401] 9 #08 pc 00000000000dc858 /system/lib64/libart.so (_ZN3art9JniAbortFEPKcS1_z+216) [arm64-v8a::8f291f51cb11a01a56d5cb19d9514401] 10 #09 pc 00000000000e178c /system/lib64/libart.so (_ZN3art11ScopedCheck5CheckEbPKcz.constprop.108+4924) [arm64-v8a::8f291f51cb11a01a56d5cb19d9514401] 11 #10 pc 00000000000ed814 /system/lib64/libart.so (_ZN3art8CheckJNI12NewStringUTFEP7_JNIEnvPKc+76) [arm64-v8a::8f291f51cb11a01a56d5cb19d9514401] 12 #11 pc 00000000000e39dc /system/lib64/libandroid_runtime.so [arm64-v8a::b8b55f744ba3a9d3a47b2cfdd3a2a6de] 13 #12 pc 000000000039c6f4 /data/dalvik-cache/arm64/system@[email protected] [::f3d88fb28fbfd84f03a796d2eea24c58] 14 java: 15 android.content.res.StringBlock.get(StringBlock.java:82) 16 android.content.res.XmlBlock$Parser.getPooledString(XmlBlock.java:458) 17 android.content.res.TypedArray.loadStringValueAt(TypedArray.java:991) 18 android.content.res.TypedArray.getText(TypedArray.java:144) 19 android.widget.TextView.<init>(TextView.java:956) 20 android.widget.TextView.<init>(TextView.java:666) 21 android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:75) 22 android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:71) 23 android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:103) 24 android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1024) 25 android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1081) 26 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:725) 27 android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 28 android.view.LayoutInflater.rInflate(LayoutInflater.java:809) 29 android.view.LayoutInflater.rInflate(LayoutInflater.java:809) 30 android.view.LayoutInflater.rInflate(LayoutInflater.java:809) 31 android.view.LayoutInflater.inflate(LayoutInflater.java:504) 32 android.view.LayoutInflater.inflate(LayoutInflater.java:414) 33 com.miaozan.xpro.base.BaseFragment.onCreateView(BaseFragment.java:44) 34 com.miaozan.xpro.base.MainFragment.onCreateView(MainFragment.java:36) 35 android.support.v4.app.Fragment.performCreateView(Fragment.java:2343) 36 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419) 37 android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740) 38 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809) 39 android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799) 40 android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580) 41 android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367) 42 android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322) 43 android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2199) 44 android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:651) 45 android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:145) 46 android.support.v4.view.ViewPager.populate(ViewPager.java:1236) 47 android.support.v4.view.ViewPager.populate(ViewPager.java:1084) 48 android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1614) 49 android.view.View.measure(View.java:17600) 50 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5589) 51 android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 52 android.view.View.measure(View.java:17600) 53 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5589) 54 android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 55 android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) 56 android.view.View.measure(View.java:17600) 57 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5589) 58 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 59 android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 60 android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 61 android.view.View.measure(View.java:17600) 62 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5589) 63 android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 64 android.view.View.measure(View.java:17600) 65 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5589) 66 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 67 android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 68 android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 69 android.view.View.measure(View.java:17600) 70 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5589) 71 android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 72 com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2800) 73 android.view.View.measure(View.java:176 74 [Java stack is truncated for it exceeds the max size.]
|
可以明确的发现是ndk方面出问题了。
并且排除了是当前项目中所有的so
最后定位在crash的本地在代码是在fragment创建view的代码
1 2 3 4 5 6
| @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return cententView = LayoutInflater.from(getContext()) .inflate(getLayoutId(), container, false); }
|
正常来说这句话是不会出问题的。
tmd,仔细观察了日志 发现是crateString方法抛了异常(native层)
然后去查了下 SIGSEGV(SEGV_MAPERR) 是操作系统认为进行了不安全的操作 抛的指令。
然后仔细想了想 产品前两天要求我在xml里面一个数据为空页面的图片更换成了emoji之后就一直反馈他的手机启动不了app了。
然后将在xml里面直接写死的emoji更换到代码里面去动态设置,果然就好了!
锤子不知道对art虚拟机做了什么奇葩的设定,导致认为在解析xml的时候 如果xml里面包含emoji表情 则认为是不安全的行为,然后对当进程进行了kill操作。
有一句mmp,不知当讲不当讲!,一定要讲!