ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

兼容性低概率系统问题记录性能/体验问题

兼容性低概率系统问题记录性能/体验问题 鸿蒙使用弹窗报错class constructor cannot called without new解决办法把EntryComponent改成CustomDialog并加上controller: CustomDialogController;安卓dialog设置高度MATCH_PARENT全屏后三星机型和好像是一加会带出顶部状态栏设置隐藏状态栏属性无效。解决方法高度不设置为MATCH_PARENT通过windowmanager.getdefaultdisplay来获取并设置高度再设置dialog的窗口属性使状态栏不占位window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);折叠屏适配比较多的是折叠展开后宽度没适配view展示不全一般是在onconfigchange回调里面监听宽度变化然后去重新刷一下ui。八特有的机型比如好像是vivo需要在AndroidManifest.xml里面加screensize有的时候会收不到监听比如dialog里面的onconfigchange在息屏时收不到这个时候如果业务过于复杂还拿不到activity可以context.registerconfigchange这样dialog的onconfigchange就能收到了。还有如果这个时候直接去拿屏幕宽度也可能拿不准的最好用onconfigchange回调的宽度这个回调的是px单位的宽度。荣耀机型繁体字的逗号会自动居中。已知问题无需解决。连续出来2个dialog有个dialog会多出一截白色view。解决方法只弹一个业务bug01想使用drawerlayout但是发现在页面上无法侧滑出来因为drawerlayout有个长按屏幕编译可以出来抽屉然后可拖拽出抽屉的属性尝试修改它的感知区域修改后发现drawerlayout拦截的是整个页面的事件。。。尝试页面diapatch处拦截事件给drawerlayout失败因为无法判断页面内部是否有其他滚动的子view安卓的apid不中啊。后面尝试使用viewpager实现drawerlayout的效果因为层级放得不对切到有的业务后那些业务直接把左右滑事件吃掉以后没有恢复导致侧滑功能再失效。后面从业务角度换了一个层级解决。业务bug02-超低概率页面上可见的appid与系统最高的appid不一致导致startactivity出问题业务bug。未解决。业务bug03-超低概率使用fragment时使用commitAllowingStateLoss去创建替换fragment正常是oncreate-ui创建与加载-ondestroy。出问题的时候是oncreate-ondestroy-ui创建与加载view创建时通过context拿不到资源或者view.xxx失败闪退然后被线上检测到异常闪退。推测是commitAllowingStateLoss导致可以尝试使用commit修复。该问题未解决。业务bug04-特定场景必现bug空传参导致程序崩溃该场景正好是退出一个进程的页面加上又被try catch住了所以事情发生的没有闪退或其他异常表现只是再进页面的时候是空白的一个页面再次进页面的时候进程重启页面重新创建所以没看出什么问题只能看到页面没创建出来然后发生问题的地方出现在一个线程池里面。。。线程池链接到了下一个进程的页面创建的地方出现整个页面渲染不出来的问题。解决方法缓存时给个默认值减少空值发生再加个判空概率低了很多不过还是有超超超低概率出现页面渲染失败空白的问题。ViewPager2。常用的无限循环一般处理方式就是getItemNumber的时候返回一个Integer.MAX达到无限循环的目的如果是一页一页翻过去的那没啥问题如果是scrollto某一页中间跨度很大很大比如差了几十个item那么就会肉眼可见的卡顿原因scrollto的时候会拿总列表数去生成东西这个时候会造成内存抖动解决方法不使用Integer.MAXgetItemNumber设置成比较大的数字即可比如10000啥的。其他ios os16以下识别链接时汉字为黑色方块。解决方法直接干掉链接中的汉字。或者尝试编码后再识别链接。uniappurl跳转失败链接过长导致干掉一些携参。古早问题不知道现在还有问题没。鸿蒙。 不能instanceof接口。解决方法使用父类或者判断这个接口的特定方法是否存在。依然鸿蒙如果静态方法里面裹静态方法静态方法里面用到了子类这个时候会报父类没有构造然后运行白屏。解决方法这段代码变成普通方法不要用static修饰。依然鸿蒙listdatasource数据改变时通过for循环数据通知到ui渲染但是比如有一个length5的数组循环到了index2、3就没有继续循环下去了无异常发生列表view展示不全只能展示1、2、3个view后面发现是重复渲染应该是循环上了再ondisappear的时候把该业务标志位置为默认值即可。依然鸿蒙grid拖拽补位组件如果用了lazyforeach拖拽回调的接口index是乱的导致删除的不是预期的item。不用lazyforeach列表数量太大时比如超过80个item拖拽明显卡顿。解决方法根据官网lazyforeach的计算算法反推出正常的index但是我没试哈。后面应该是限定了展示数据最多不超过多少个。未解决公司跨端组件动态计算css样式的动画如果反复进退页面展示这个动画安卓端会明显的这个动画越来越卡最后闪退可能是框架的动画或者native没有反注册该跨端组件导致的内存泄漏未解决。影响体验的性能问题内存泄露/内存抖动/OOM、启动首帧耗时、卡顿、包体积、fps、兼容性问题、保活1.耗时操作有哪些耗时操作1)rpc、网络请求、数据库操作、文件读写、IO、file、进程间通信、编解码2)sp(commit同步耗时apply异步大数据频繁读取耗时)、图片加载、嵌套布局、复杂布局、动态计算也有可能、线程切换、加锁卡顿、解析大型数据、AB开关、注册kmp、短时间生成大量对象解决方法不同问题有不同的解决方式一般是放子线程/异步调用动画铺平框架解mkkv减少一次内存切换减少页面布局层级或者xml的布局写到java代码里面放首帧后有一点点耗时但是不是很耗时的更改调用时机放首帧后之前遇到过主线程new file。低端车机煲机多媒体应用8小时视频播放卡顿严重音视频不同步。一个是性能带不起来一个是时间戳的差异越来越大网络请求弱网应用启动的时候切线程去用bitmapfactory加载了一次image导致冷启时用户肉眼可见的空白了几百毫秒还是高端机。其实这里放主线程比较好因为这里不是大图加载切线程对用户的影响可能更大一些。AB开关组件化的时候在类似于应用启动时高性能静态加载资源的地方使用了AB开关下游业务使用kmp注册下游业务的时候启动耗时又增加了拎到首帧后线上又出来anr因为kmp链接到了tecal给xml里面多加了一层布局首帧耗时增加几十ms。。。为了实现复杂动画动态计算css导致安卓大部分中/低端机动画掉帧非常严重。公司的跨端组件跑不起来复杂动画。为什么要动态计算而不是帧动画当然是动画太复杂只能根据业务规则来计算。。。跟手滑的时候使用translateX整个页面掉帧。。。日志打印一些常调用遍历调用的地方加日志多了容易卡。2.包大小怎么优化在不影响用户体验的情况下进行优化压缩。图片、资源压缩。图片可以使用ImageOptim压缩、安卓使用webp压缩、内置lottie资源找视觉压缩基本能压很多。代码绘制样式图片、动效。以便减少内置图片大小和减少图片加载时的空白时间。资源改成线上资源。画不出来再尝试线上资源图片、lottie、字体、视频压缩xml文件。删除无用/已下线功能代码优化日志打印代码裁剪。裁剪一些so库的代码只留有用到的资源比如:ffmpeg。一些app没那么多动态化需求就没有必要引入跨端组件或者小程序的一些库了。3.Fps1一般是大列表有这个问题解决方法滑动时列表停止add数据等列表滑动停止再add数据分页加载、懒加载、差分更新2背地里偷偷做微耗时操作或者每个item去做微耗时操作。微耗时参考耗时操作3频繁生成对象gc4频繁重绘ondraw这个会引起屏幕频繁刷新每次都是软件到硬件的一次刷新5内存泄露、越来越严重、gpu带不起来6view层级太多。滑动时超重如translateX啥的。view层级太多也会导致首帧耗时慢的问题。7动画掉帧改大fps4.保活双进程守护、service守护5.内存泄露1内存泄漏的情况单例模式。静态变量持有的引用导致的内存泄露。非静态内部类包括匿名内部类默认就会持有外部类的引用当非静态内部类对象的生命周期比外部类对象生命周期长时就会内存泄露比如常见的HandlerThreadAsyncTask创建一个线程去作网络请求。未取消注册或回调导致的内存泄漏。集合中的对象未清理造成内存泄漏。资源未关闭或未释放导致内存泄漏比如流对象、流式RPC、WebView、地图等使用完后要及时关闭。Handler造成的内存泄漏线程造成的内存泄漏地图、视频播放器、图片加载、webview、流式数据停止使用或者退出页面的时候没有反注册。也不一定是页面如果一个列表每个item都去注册一次webview但是item不可见或者销毁的时候没有反注册也可能会导致后面的数据渲染不出来。2表现程序异常(case by case)程序越使用内存占用越大且内存占用增长较快频繁GC但是内存得不到有效的释放因为频繁的GC和生成对象和内存碎片化界面响应越来越慢界面渲染卡顿、滑动卡顿或者view组件渲染不出来又不报错、白屏最终OOM闪退3怎么避免?记得反注册合理使用缓冲策略使用weakrefrence及时释放资源如流式数据、webview避免静态集合无限制增长4内存泄漏原理创建一个对象也就是在堆区里申请多一块空间给它如果某个对象一直持有这块空间该空间无法得到释放。所以如果内存泄露的次数多最终很容易引起内存溢出。程序中已动态分配的堆内存由于某种原因程序未释放或无法释放造成系统内存的浪费。对象在引用链上但是已经不可用了。根可达但是内存已经不能再用了。5内存泄漏检测原理jvm判断对象应该被回收的方式引用计数法当对象没有其他对象在引用该对象时应该被回收。可达性分析GC roots静态变量、线程栈变量、常量池、JNI指针在GC roots的引用链上可以找到对象的时候就认为这个对象根可达GC来回收时发现该对象根可达该对象就不应该被回收。在引用链找不到该对象该对象不可达就应该被回收。6怎么检测自己可以用MAT俩Ativity跳来跳去比较heap堆栈过滤掉弱引用虚引用啥的就是泄漏的方法平时线下检测LeakCanary主要是hook页面生命周期hook生命周期这种操作也可以用来检测白屏。7LC原理和步骤原理可达性分析。根可达但无用。利用 WeakReference ReferenceQueue 来检测对象是否应被回收。8LC不能用于线上的原因LeakCanary 会主动GC、Dump内存快照造成卡顿和ANR只适合开发阶段不能用于线上。频繁gc造成掉帧卡顿dump内存快照耗时会造成anrhprof上传文件太大耗时耗流重复dump手机内存爆满9koom检测思路跟LC差不多线上可以使用这个监控内存泄漏。不同的是触发方式、gc时机不同、分析方式还要可以检测native泄漏和thread泄漏。koom不主动 GC不阻塞主进程。内存占用率 80% 连续检测超过3次时fork一个子进程去异步分析dump文件卡也只卡子进程且本地分析以后只把分析结果上传到服务器。6.兼容性问题、多语言适配、RTL一般是互联网app机型兼容性问题。安卓原生就是多种安卓机型不同安卓os版本和不同厂商之间这种一般跟fwk和硬件有关。主要是分辨率和系统bug。字体粗细、分辨率适配(宽、窄、大屏、2折叠、3折叠、上下折叠)、繁体字逗号自动居中、view倾斜后有锯齿、不同机型屏幕展示的字体不一样、同一个数值但是view字体大小表现不一致、时不时带出个导航栏、白边如果是跨端就是在安卓兼容性问题上叠加不同类型的os之间比如安卓/ios/鸿蒙之间。iOS os 16以下识别链接时汉子识别出来是黑块、有的表情符安卓展示不出来显示一个方块。更多的是双端差异和跨端容器实现不一致。lottie不设置宽度的时候双端表现不一致一个填充所有一个按照lottie素材内部宽度来展示。两帧动画衔接处有差异。ios不保留第一帧的状态第2帧开始前会回到初始坐标需要marginTop来矫正。安卓保留最后一帧状态但是第2帧的初始坐标是第一帧的坐标安卓需要在动画里translateY来矫正
返回列表