中宏人寿保险官网保险MOVE2.0手机应用程序支持所有版本的手机系统吗?

保险下载_保险合集下载_当易网
您的位置: → 保险合集列表
保险排行榜
更新时间:
保险大专家软件是专为保险代理人所研发的平台,我们会帮您圆您的保险梦,我们这有海量顶尖大咖为您教授保险推销知识,让您展业变得更加简单,我们会全心为您的事业服务,让您的行销更加容易,如果你也在从事保险行业
更新时间:
保险之家软件是专属于保险行业的交易平台,在这里,邀请你的好友加入团队,每次出单你都会获得提成,你的团员自己发展的团员人员出单,你也能永久获利,让你签单快人一步,轻松打开客户市场,这是保险人最安全的展业
更新时间:
保客云集软件是专为保险师所研发的移动展业助手软件,我们首创长期寿险,在线交易,并且和多家保险公司战略合作,邀请好朋友一起还有福利可以获得,甚至还能有极速结算功能,如果你也对这款软件感兴趣的话,就到当易
更新时间:
车险分期王手机版是一款车险金融分期购平台软件,在这里,0利息,0手续费,选择多样,大牌车险任你选,分期灵活,支付方式多样,安全保障出单,福利购不停,如果你需要为爱车购买保险的话,就赶快到当易网下载!车
更新时间:
大算车险手机版是一款车险金融分期平台软件,我们是您随身的靠谱车险平台,在这里,车险购买0首付,先享受后付费,我们还会为您推荐购险方案,险种自由选择,更有买保险送积分的活动,多种支付,安全保障出单,如果你
更新时间:
深信达文件保险箱软件是一款非常强大的文件夹加密工具,用户可以使用这款软件对自己的重要资料进行加密,防止由于电脑丢失、电脑中毒等原因导致电脑中的重要文件资料被盗,软件界面简洁,操作简单,安全行强大,有需
更新时间:
保道app是一款给用户普及保险知识的生活服务手机软件,生活中我们免不了都会买一些保险,而保险的种类繁多,内容涉及颇为复杂,如何才能选择适合自己的保险也成了一件不简单的事,保道app会为您解决烦恼,让您找到最
更新时间:
车童手机版是一款专注于快速解决有车一族的车险问题。车险公司人实时在线,就近安排。您只需动动手指,就可以叫来离你最近的保险公司人员为您处理保单问题。为你省时省力,给你一个方便快捷的解决办法。车童手机软件
更新时间:
熊猫保保app是一款保险工作人员必备的业务软件,用户可以在上面对自己的客户进行管理,建立团队,可以对现在的实时资讯进行分享从而获得积分,获得最新的保险产品信息更好的和客户交流,快来当易网下载吧!应用信息
更新时间:
中宏保险moveapp是一款保险服务软件,用户可以通过它轻松查看自己的保单状况以及相关信息,在软件中还能进行缴费,公司的最新产品也能在上面及时查看,感兴趣就来当易网下载吧!中宏保险move简介:这是中宏人寿保险
更新时间:
人人保险app是一款服务优质、定位精准的的保险平台,为大众提供了一个可以轻松购买保险服务的客户端,可以查看详细的保险订单内容、服务范围。平台会精准定位客户帮助你选出一款最适合你的服务。快来当易网下载吧!
更新时间:
熊猫保险是一款非常好用的手机保险app,它可以为用户提供一站式保险购买服务,为用户挑选最好的产品,给用户最贴心和温馨的服务,有需要的可以到当易网下载体验!熊猫保险app介绍熊猫保险用户可以通过该APP查阅车险
更新时间:
国寿天财ios版是一款由中国人寿推出的金融理财软件,具有大量的历理财产品,提供最专业的资讯以及即时更新最新的资讯,帮助用户解决常见的理财问题等等便捷服务,设置清晰的管理模块,操作简单。还在等什么,快来当易
更新时间:
国寿智悦app是一款提供理财保险服务平台,为你提供多种类目的保险业务,软件还有问诊功能,在就医前就能了解病情大致状况,非常方便。除此之外你也能通过这款软件解决自己资金周转的问题。快来当易网下载吧!国寿智
更新时间:
太平保宝app是中国太平人寿公司打造的一款在线保险办理平台,为用户提供便捷的保险办理服务,软件包含各类保险产品,还有专业保险咨询师为您在线答疑,给您最优质的服务,欢迎来当易网下载软件。中国太平保宝软件简
更新时间:
华夏人寿保险app是由华夏人寿保险股份有限公司官方推出的一款便捷的掌上保险业务办理软件!它可以帮助使用者最及时的了解华夏人寿推出的最新保险咨询,有需要的朋友可以来当易网下载体验哦!华夏人寿保险软件简介:
更新时间:
平安好贷app是一款金融理财的软件,由平安保险推出,软件可实现快捷借贷以及理财保险等亮点,提供多种理财产品,供用户参考使用,清晰的操作界面,使用更方便,实时方便。还在等什么,快来当易网下载吧!平安好贷手
更新时间:
平安掌上保手机版是一款由平安公司出品的保险查询app,它可以帮助用户快速的查询到自己所需要查看的保单,也可以提升保险业务人员的业务办理效率。有需要的可以到当易网下载体验!平安掌上保app介绍平安掌上保app是
更新时间:
医账通app是一款为人们提供健康医疗服务的手机软件,用户通过这款软件可以获取到更加优惠的医院医疗服务,同时也为广大用户提供非常适合的保险服务,为您的健康医疗保驾护航,有需要的朋友欢迎来当易网下载!医账通
更新时间:
科技个险ipad版是一款专为太平洋保险员工制作的移动办公软件,软件支持一键登录,查看最新的办公状态以及申请批准的事务,具有详细的办公流程文本教程,实时更新最新的银行新闻资讯等特点,设置清爽的操作见面,可快
更新时间:
快乐平安app是平安保险为员工打造的效率办公软件,旨在加强员工之间的沟通,为员工提供各种便捷办公服务,有需要的朋友欢迎来当易网下载软件。快乐平安软件简介:拥有许多非常实用的功能,能够帮助员工查询自己的工资
更新时间:
葫芦okapp是一款由百年人寿官方推出的保险管理软件,用户可以使用它来进行线上投保以及了解最新保险信息等,非常实用便捷,是百年人寿用户的必备保险应用,欢迎来当易网下载使用。百年人寿葫芦ok介绍:葫芦ok是百年
更新时间:
君易保手机版是君康人寿为客户打造的手机保险软件,用户可以使用这款软件查看君康人寿的各种保险理财产品,还能在线资讯专业保险师,更有免费保险大礼赠送,欢迎来当易网下载软件。君易保app简介:全面展现多样化的
更新时间:
华康通app是一款提供专业的保险业务的手机软件,这里有丰富的保险产品供你选择,多样化的保险方式让你放心,根据自己的实际情况进行自由挑选,并支持手机端在线查询个人,有需要的朋友欢迎下载!当易网提供下载!信息
更新时间:
建信e保app是建信人寿打造的手机保险服务软件,汇集建信人寿所有保险产品的详细信息,客户可以选择自己需要的保险在线咨询,还能快速下单,非常方便,有需要的用欢迎来当易网下载软件。建信e保手机版简介:可以随时
更新时间:
阳光保险ehr怎么下载?当易网小编为你提供最新版本的下载方式,软件为工作人员提供便捷的登录以及办理方式,可以查看工作流程和薪酬和事项审核等窗口,界面管理模块鲜明,使用方便,快来下载吧!软件简介:阳光保险eH
更新时间:
农银人寿农银e保是农银人寿为客户打造的掌上保险理财软件,用户可以使用这款软件了解农银人寿的所有理财产品,还有专业保险师为你答疑解惑,给你最好的保险服务,欢迎来当易网下载软件。农银e保安卓版简介:一站式
更新时间:
阳光保险mhr安卓版是阳光保险打造多热一款高效率移动办公app,让移动办公变得更加简单便捷,让保险变得更加透明实惠,阳光保险mhr安卓版,给用户带来更多的阳光!需要的朋友快来当易网下载使用吧!阳光保险mhr安卓版
更新时间:
阳光保险e路阳光是阳光集团为客户打造的掌上保险服务软件,平台汇集了阳光保险所有保险产品,用户可以选择自己需要的产品购买,还有专业顾问在线答疑,有需要的用户欢迎来当易网下载软件。e路阳光最新版app简介:集
更新时间:
平安好伙伴手机版是由中国平安保险官方推出专为平安保险投保人打造的一款便捷式手机理财软件,平安好伙伴干嘛用?平安好伙伴软件为每一位使用者提供最贴心最放心最有价值的一站式理财服务!有需要的朋友可以来当易网
更新时间:
人保e动神州客户端是中保人寿为旗下保险销售人员打造的展业软件,平台上拥有公司各种保险产品的详细资料,销售员可以随时随地向客户展示各种产品,急速签单,提高工作效率,欢迎来当易网下载软件。人保寿e动神州简
更新时间:
新版科技个险plus是太平洋保险为员工打造的办公软件,员工可以使用这款软件便捷的处理工作中的一些事务,还有在线课程可以免费学习,提升自己的工作技能,欢迎来当易网下载软件。科技个险plus最新版本简介:手机考
更新时间:
太平洋科技个险是太平洋保险公司专为旗下员工打造的办公软件,软件具有多种办公功能,比如考勤、业绩查询等,还有各种培训课程,大大提升员工工作效率,欢迎来当易网下载软件。太平洋保险科技个险简介:为太平洋保
更新时间:
国寿随行e门店是中国人寿为客户打造的掌上保险软件,用户可以使用这款软件对自己的保险查看管理,还能了解国寿的最新资讯和最新产品,有需要的朋友欢迎来当易网下载软件。中国人寿e门店简介:软件除了车险报价及快
更新时间:
保宝网工具手机版是一款专门为保险行业从业人员打造的学习软件,这里有海量专业保险学习课程,还有最新的保险行业资讯,让你了解到保险行业的最新动态,有需要的朋友欢迎来当易网下载软件。保宝网学习工具简介:涵
更新时间:
保宝网手机版是一款专为保险代理人打造的展业软件,这里拥有海量保险行业的最新资讯的学习资料,还有各种经典案例教学,让你了解到更多保险行业的知识,提升专业水准,欢迎来当易网下载软件。保宝网2017版简介:保
更新时间:
平安新e家app是平安保险为保险销售人员打造的行销软件,让销售人员可以对自己的客户进行全方位管理,给客户最好的服务,有需要的用户欢迎来当易网下载软件。平安保险公司新e家简介:客户带来更好的感受,让专业时刻
更新时间:
易行销手机版是天安财产保险公司为财险销售人员打造的展业软件,销售人员可以使用这款软件很方便的移动办公,想客户介绍公司产品,提高工作效率,有需要的朋友欢迎来当易网下载软件。天安财险易行销简介:让你能够
更新时间:
富德生命e行销是富德人寿保险公司为旗下销售人员打造的展业app,内置公司各种保险产品,方便销售人员移动办公,大大提升办公效率,有需要的朋友欢迎来当易网下载软件。生命人寿行销app简介:通过掌上系统的投保进度
更新时间:
平安开心行销app是平安保险为保险代理人打造的展业软件,为保险代理人提供最新的保险业务,还有各种保险产品,为代理人的工作提供方便,提升工作效率,欢迎来当易网下载软件。平安开心行销简介:使代理人展业更便利
共:184条 页次:1/5 每页:40
当易网 版权所有 Copyright ©
www.downyi.com. All rights reserved.
鄂ICP备号 鄂公网安备 84号拒绝访问 | www.smcnn.com | 百度云加速
请打开cookies.
此网站 (www.smcnn.com) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(40b1e722b2b743ef-ua98).
重新安装浏览器,或使用别的浏览器&p&&b&四大组件相关:&/b&&/p&&p&1.启动一个Activity,在应用进程至少需要两个Binder线程。&/p&&p&2.启动一个launchMode为singleTask的Activity,它并不一定会运行在新的Activity栈中。&/p&&p&3.两个不同应用的Activity,可以运行在同一个Activity栈中。&/p&&p&4.同一个应用进程中的所有Activity,共享一个WindowSession。&/p&&p&5.弹出一个AlertDialog,不一定需要Activity级别的Context,而且任何地方都有办法弹出一个AlertDialog,只要是在Application的attachBaseContext之后。&/p&&p&6.可以通过设置Activity主题android.R.style.Theme_NoDisplay,来启动一个不显示的Activity,在某些需要过渡的地方很实用。&/p&&p&7.Activity、Service、Receiver在没有配置intent-filter的action属性时,exported默认为false,配置了intent-filter的action属性时,exported默认为true。稍有不慎,很可能埋下越权、Intent攻击等安全隐患。&/p&&p&8.当从最近使用应用列表中移除某个App时,四大组件只有Service拥有神奇的onTaskRemoved回调,但是并不一定回调,还与stopWithTask属性等有关。&/p&&p&9.四大组件都运行在主线程,是因为它们在ActityThread中(或Instrumentation)实例化;它们的生命周期也运行在主线程,是因为通过ActivityThread.H将消息从Binder线程发送到主线程,然后执行回调。&/p&&p&10.TaskStackBuilder的出现基本上解决了所有构造Activity回退栈的问题。&/p&&p&11.ContentProvider的onCreate()方法先于Application的onCreate()方法执行,晚于Application的attachBaseContext()方法,所以在ContentProvider的onCreate()时候也是有办法弹出一个AlertDialog的(参考5)。&/p&&p&12.BroadCastReceiver回调onReceive(Context context,Intent intent)中的context类型各种场景相差很大,静态注册的receiver回调的Context都是ReceiverRestrictedContext,动态注册的receiver有可能是Activity或Application。&/p&&p&13.ServiceRecord和BroadcastRecord自身就是Binder。&/p&&p&14.同一个provider组件名,可能对应多个provider。&/p&&p&&br&&/p&&p&&b&Handler、Message相关:&/b&&/p&&p&1.MessageQueue.addIdleHandler可以用来在线程空闲的时候,完成某些操作,比较适合那种需要在将来执行操作,却又不知道需要指定多少延迟时间的操作。&/p&&p&2.Message.what尽量不要设置成0,因为postRunnable的方式会生成Message.what为0的消息,如果删除了what为0的Message,也会将runnable方式创建的Message删掉。&/p&&p&3.Handler可以设置同步异步(默认是同步的),他们的区别在于异步不会被Barrier阻塞,而同步会被阻塞。&/p&&p&4.Handler的消息分发流程是如果Message的callback不为空,通过callback处理,如果Handler的mCallback不为空,通过mCallback来处理,如果前两个都为空,才调用handleMessage来处理。在DroidPlugin中,便是利用ActivityThread.H的这一特性,拦截了部分消息,实现Activity的插件化。&/p&&p&5.Java层和Native层Looper、MessageQueue的创建时序,Java层Looper—&Java层MessageQueue—&Native层NativeMessageQueue—&Native层Looper。&/p&&p&6.Java层通过Handler去发送消息,而Native层是通过Looper发消息。&/p&&p&&br&&/p&&p&&b&Window、View相关:&/b&&/p&&p&1.硬件加速在Window级只能开不能关,View级只能关不能开。&/p&&p&2.自android2.3删除MidWindow后,PhoneWindow成了Window的唯一实现类。&/p&&p&3.WMS管理Window的过程中涉及4个Binder,应用进程只有ViewRootImpl.W一个Binder服务端。&/p&&p&4.MotionEvent、KeyEvent、DragEvent等具有相似的链式缓存,类似Message。&/p&&p&5.在View的状态保存、恢复过程中,ActionBar中所有View共享一个SparseArray容器,ContentView中所有View共享一个SparseArray容器。当前获取焦点的View会额外存储。&/p&&p&6.设置ViewTreeObserver的系列监听方法需要确保View在attachToWindow之后,否则可能因为add监听和remove监听不是作用于同一个对象而引起内存泄漏等。&/p&&p&&br&&/p&&p&&b&Binder、IPC、进程等相关&/b&&/p&&p&1.可以通过文件锁来实现进程间互斥(参考:RePlugin),在处理某些只需要单进程执行的任务时很实用。&/p&&p&2.Binder设计架构中,只有Binder主线程是由本进程主动创建,Binder普通线程都是由Binder驱动根据IPC通信需求被动创建。&/p&&p&3.oneway与非oneway,都需要等待Binder Driver的回应消息(BR_TRANSACTION_COMPLETE),区别在于oneway不用等待BR_REPLY消息。&/p&&p&4.mediaserver和servicemanager的主线程都是binder线程,但system_server的主线程不是Binder线程,system_server主线程的玩法跟应用进程一样。&/p&&p&5.同一个BpBinder可以注册多个死亡回调,但Kernel只允许注册一次死亡通知。&/p&&p&6.应用进程由Zygote进程孵化而来,在它真正成为应用进程之前,系统通过抛异常的方式来清理栈帧,并反射调用ActivityThread的main方法。&/p&&p&7.在Binder通信的过程中,数据是从发起通信进程的用户空间直接写到目标进程内核空间,内核空间的数据释放是由用户空间控制的。&/p&
四大组件相关:1.启动一个Activity,在应用进程至少需要两个Binder线程。2.启动一个launchMode为singleTask的Activity,它并不一定会运行在新的Activity栈中。3.两个不同应用的Activity,可以运行在同一个Activity栈中。4.同一个应用进程中的所有Activity,…
&figure&&img src=&https://pic1.zhimg.com/v2-ddc6e981f1_b.jpg& data-rawwidth=&1217& data-rawheight=&811& class=&origin_image zh-lightbox-thumb& width=&1217& data-original=&https://pic1.zhimg.com/v2-ddc6e981f1_r.jpg&&&/figure&&p&本文首发于博客 : &a href=&http://link.zhihu.com/?target=http%3A//androidperformance.com//Android-performance-optimization-skills-and-tools.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android 性能优化必知必会&/a&&/p&&p&做了这么久性能相关的工作,也接触了不少模块,说实话要做好性能这一块,真心不容易.为什么这么说? 是因为需要接触的知识实在是太多了, Android 是一个整体,牵一发而动全身,不是说只懂一个模块就可以做好.&/p&&p&在学习的过程中,除了看源码,我还接触到了很多互联网上已有的知识,各位前辈们,将他们的知识和经验倾囊相授,让我少走了很多弯路. 我在自己的笔记里面存了很多很优秀的技术文章和技术文档,现在我决定将这些放到网上,让每一个想进入 Android 系统开发和优化这个领域的人,能通过阅读这篇文章,快速入门. 同时也算是我对知识的一个梳理,查漏补缺,终身学习.&/p&&p&这篇文章记录了 Android 性能优化所必须掌握的知识,涵盖性能优化相关的方方面面(当然如果读者同学你也有很棒的私藏文章,也可以加入到这篇文章里面).&/p&&h2&# 优化心得和经验&/h2&&p&0. [系列视频] Android Performance Patterns : &a href=&http://link.zhihu.com/?target=https%3A//www.youtube.com/playlist%3Flist%3DPLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&youtube.com/playlist?&/span&&span class=&invisible&&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&1. &a href=&http://link.zhihu.com/?target=http%3A//android.jobbole.com/81944/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&给 App 提速:Android 性能优化总结 - 安卓 - 伯乐在线&/a&&/p&&p&2. &a href=&http://link.zhihu.com/?target=https%3A//tech.meituan.com/hertz.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&移动端性能监控方案Hertz -&/a&&/p&&p&3. &a href=&http://link.zhihu.com/?target=http%3A//androidperformance.com//android-performance-case-study-follow-up.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android性能优化后续 | Android Performance&/a&&/p&&p&4. &a href=&http://link.zhihu.com/?target=http%3A//weishu.me//dive-into-android-optimize-vm-heap/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android性能优化之虚拟机调优&/a&&/p&&p&5. &a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&[译]Android UI 性能优化&/a&&/p&&p&&br&&/p&&h2&# 响应速度&/h2&&p&1. Optimizing Boot Times : &a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/perf/boot-times& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/perf/boot-times&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&2. &a href=&http://link.zhihu.com/?target=http%3A//androidperformance.com//How-to-calculation-android-app-lunch-time.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android 中如何计算 App 的启动时间?&/a&&/p&&p&&br&&/p&&h2&# 流畅度&/h2&&p&1. Evaluating Performance : &a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/debug/eval_perf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/debug/eval_perf&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&2. Understanding Systrace : &a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/debug/systrace& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/debug/systrace&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&3. Using ftrace : &a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/debug/ftrace& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/debug/ftrace&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&4. Identifying Capacity-Related Jank : &a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/debug/jank_capacity& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/debug/jank_capacity&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&5. Identifying Jitter-Related Jank : &a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/debug/jank_jitter& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/debug/jank_jitter&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&6. 那些年我们用过的显示性能指标 : &a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/tencent_bugly/article/details/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&blog.csdn.net/tencent_b&/span&&span class=&invisible&&ugly/article/details/&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&&br&&/p&&h2&# 内存&/h2&&p&1. Low RAM Configuration : &a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/perf/low-ram& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/perf/low-ram&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&2. Linux Swap 与 Zram 详解 : &a href=&http://link.zhihu.com/?target=http%3A//www.tinylab.cn/linux-swap-and-zramfs/%23zram-& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Linux Swap 与 Zram 详解&/a&&/p&&p&3. Android 加载不同 DPI 资源与内存消耗间的关系 : &a href=&http://link.zhihu.com/?target=http%3A//www.tinylab.cn/android-loading-a-different-relationship-between-dpi-and-memory-consumption-of-resources/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android 加载不同 DPI 资源与内存消耗间的关系&/a&&/p&&p&4. ZRAM SWAP 内存管理讲解 : &a href=&http://link.zhihu.com/?target=https%3A//nekosc.com/technology/zram.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[ZRAM]SWAP内存管理讲解 - 零件's Blog&/a&&/p&&p&5. Android OOM 案例分析 : &a href=&http://link.zhihu.com/?target=https%3A//tech.meituan.com/oom_analysis.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android OOM案例分析 -&/a&&/p&&p&6. Android 代码内存优化建议-Android 资源篇 : &a href=&http://link.zhihu.com/?target=http%3A//androidperformance.com//Android-Performance-Memory-AndroidResource.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android代码内存优化建议-Android资源篇 | Android Performance&/a&&/p&&p&7. Android 代码内存优化建议-Android 官方篇 : &a href=&http://link.zhihu.com/?target=http%3A//androidperformance.com//Android-Performance-Memory-Google.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android代码内存优化建议-Android官方篇 | Android Performance&/a&&/p&&p&8. Android 代码内存优化建议-Java 官方篇 : &a href=&http://link.zhihu.com/?target=http%3A//androidperformance.com//Android-Performance-Memory-Java.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android代码内存优化建议-Java官方篇 | Android Performance&/a&&/p&&p&9. Android 内存优化之一:MAT 使用入门 : &a href=&http://link.zhihu.com/?target=http%3A//androidperformance.com//AndroidMemory-Usage-Of-MAT.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android内存优化之一:MAT使用入门 | Android Performance&/a&&/p&&p&10. Android 内存优化之二:MAT 使用进阶 : &a href=&http://link.zhihu.com/?target=http%3A//androidperformance.com//AndroidMemory-Usage-Of-MAT-Pro.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android内存优化之二:MAT使用进阶 | Android Performance&/a&&/p&&p&11. Android 内存优化之三:打开 MAT 中的 Bitmap 原图 : &a href=&http://link.zhihu.com/?target=http%3A//androidperformance.com//AndroidMemory-Open-Bitmap-Object-In-MAT.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android内存优化之三:打开MAT中的Bitmap原图 | Android Performance&/a&&/p&&p&12. Android 代码内存优化建议-OnTrimMemory 优化 : &a href=&http://link.zhihu.com/?target=http%3A//androidperformance.com//Android-Performance-Memory-onTrimMemory.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android代码内存优化建议-OnTrimMemory优化 | Android Performance&/a&&/p&&p&13. Android LowMemoryKiller原理分析 : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//android-lowmemorykiller/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android LowMemoryKiller原理分析&/a&&/p&&p&14. Android 匿名共享内存(Ashmem)原理 : &a href=&http://link.zhihu.com/?target=https%3A//juejin.im/post/59e818bb6fb9a044fd10de38& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android匿名共享内存(Ashmem)原理 - 掘金&/a&&/p&&p&&br&&/p&&h2&# 图形栈&/h2&&p&1. Android 硬件加速原理与实现简介 :&a href=&http://link.zhihu.com/?target=https%3A//tech.meituan.com/hardware-accelerate.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android硬件加速原理与实现简介 -&/a&&/p&&p&2. Android6.0 显示系统(一) Surface 创建: &a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/kc/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android6.0 显示系统(一) Surface创建&/a&&/p&&p&3. Android6.0 显示系统(二) SurfaceFlinger 创建 Surface :&a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/kc/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android6.0 显示系统(二) SurfaceFlinger创建Surface&/a&&/p&&p&4. Android6.0 显示系统(三) 管理图像缓冲区 : &a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/kc/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android6.0 显示系统(三) 管理图像缓冲区&/a&&/p&&p&5. Android6.0 显示系统(五) SurfaceFlinger 服务 : &a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/kc/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android6.0 显示系统(五) SurfaceFlinger服务&/a&&/p&&p&6. Android6.0 显示系统(六) 图像的输出过程 : &a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/kc/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android6.0 显示系统(六) 图像的输出过程&/a&&/p&&p&7. Android6.0 SurfaceControl 分析(一)SurfaceControl创建&使用 Surface创建&使用 : &a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/kc/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android6.0 SurfaceControl分析(一)SurfaceControl创建&使用 Surface创建&使用&/a&&/p&&p&8. Android6.0 SurfaceControl 分析(二)SurfaceControl和SurfaceFlinger通信&/p&&p&9. Android6.0 VSync 信号如何到用户进程 : &a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/kc/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android6.0 SurfaceControl分析(二)SurfaceControl和SurfaceFlinger通信&/a&&/p&&p&10. Android 图形系统概述 : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//graphic_arch/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android图形系统概述 - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&11. Choreographer 原理 : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//choreographer/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Choreographer原理 - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&12. SurfaceFlinger 启动篇 : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//surface_flinger/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SurfaceFlinger启动篇 - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&13. SurfaceFlinger 绘图篇 : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//surface_flinger_2/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SurfaceFlinger绘图篇 - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&14. [HWUI]Android 应用程序 UI 硬件加速渲染技术简要介绍和学习计划 : &a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/luoshengyang/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android应用程序UI硬件加速渲染技术简要介绍和学习计划 - CSDN博客&/a&&/p&&p&15. [HWUI]Android 应用程序 UI 硬件加速渲染环境初始化过程分析 : &a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/luoshengyang/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android应用程序UI硬件加速渲染环境初始化过程分析 - CSDN博客&/a&&/p&&p&16. [HWUI]Android 应用程序 UI 硬件加速渲染的预加载资源地图集服务(Asset Atlas Service)分析 : &a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/luoshengyang/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android应用程序UI硬件加速渲染的预加载资源地图集服务(Asset Atlas Service)分析&/a&&/p&&p&17. [HWUI]Android 应用程序 UI 硬件加速渲染的 Display List 构建过程分析 : &a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/luoshengyang/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android应用程序UI硬件加速渲染的Display List构建过程分析&/a&&/p&&p&18. [HWUI]Android 应用程序 UI 硬件加速渲染的 Display List 渲染过程分析 : &a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/luoshengyang/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android应用程序UI硬件加速渲染的Display List渲染过程分析&/a&&/p&&p&19. [HWUI]Android 应用程序 UI 硬件加速渲染的动画执行过程分析 : &a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/luoshengyang/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android应用程序UI硬件加速渲染的动画执行过程分析 - CSDN博客&/a&&/p&&p&&br&&/p&&h2&# 虚拟机&/h2&&p&1. ART and Dalvik : &a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/dalvik/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/dalvik/&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&2. Android 8.0 ART Improvements : &a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/dalvik/improvements& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/dalvik/improvements&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&3. Dalvik bytecode :
&a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/dalvik/dalvik-bytecode& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/dalvik/dalvik-bytecode&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&4. Dalvik Executable format :
&a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/dalvik/dex-format& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/dalvik/dex-format&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&5. Dalvik Executable instruction formats :
&a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/dalvik/instruction-formats& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/dalvik/instruction-formats&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&6. Constraints : &a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/dalvik/constraints& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/dalvik/constraints&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&7. Configuring ART : &a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/dalvik/configure& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/dalvik/configure&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&8. Debugging ART Garbage Collection : &a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/dalvik/gc-debug& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/dalvik/gc-debug&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&9. Implementing ART Just-In-Time (JIT) Compiler : &a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/dalvik/jit-compiler& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/dalvik/jit-compiler&/span&&span class=&ellipsis&&&/span&&/a& &/p&&p&&br&&/p&&h2&# 系统框架&/h2&&p&1. Task Snapshots :&a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/perf/task-snapshots& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/perf/task-snapshots&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&2. Android Input 子系统:Input 进程的创建,监听线程的启动 : &a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Android Input子系统:Input进程的创建,监听线程的启动&/a&&/p&&p&3. Android Input 子系统:Input 事件的产生、读取和分发,InputReader、InputDispatcher : &a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Android Input子系统:Input事件的产生、读取和分发,InputReader、InputDispatcher&/a&&/p&&p&4. EventHub 与设备、Input 事件的交互 : &a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&EventHub与设备、Input事件的交互&/a&&/p&&p&4. Android 消息机制,从Java 层到 Native 层剖析 : &a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Android消息机制,从Java层到Native层剖析&/a&&/p&&p&5. 理解 Android Binder 机制(1/3):驱动篇 : &a href=&http://link.zhihu.com/?target=http%3A//qiangbo.space//AndroidAnatomy_Binder_Driver/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&理解Android Binder机制(1/3):驱动篇&/a&&/p&&p&6. 理解 Android Binder 机制(2/3):C++ 层 : &a href=&http://link.zhihu.com/?target=http%3A//qiangbo.space//AndroidAnatomy_Binder_CPP/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&理解Android Binder机制(2/3):C++层&/a&&/p&&p&7. 理解 Android Binder 机制(3/3):Java 层 : &a href=&http://link.zhihu.com/?target=http%3A//qiangbo.space//AndroidAnatomy_Binder_Java/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&理解Android Binder机制(3/3):Java层&/a&&/p&&p&8. Android Bander 设计与实现 - 设计篇 : &a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/universus/article/details/6211589& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android Bander设计与实现 - 设计篇&/a&&/p&&p&8. 四大组件之综述 : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//ams-abstract/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&四大组件之综述 - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&8. 四大组件之 ActivityRecord : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//activity_record/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&四大组件之ActivityRecord - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&9. 四大组件之 ContentProviderRecord : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//content_provider_record/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&四大组件之ContentProviderRecord - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&10. 四大组件之 BroadcastRecord : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//broadcast_record/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&四大组件之BroadcastRecord - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&11. 四大组件之 ServiceRecord : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//service_record/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&四大组件之ServiceRecord - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&12. 简述 Activity 与 Window 关系 : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//activity-with-window/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&简述Activity与Window关系 - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&13. 理解 Android Context : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//android_context/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&理解Android Context&/a&&/p&&p&14. 理解 Application 创建过程 : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//android-application/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&理解Application创建过程 - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&15. 以 Window 视角来看 startActivity : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//start-activity-wms/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&以Window视角来看startActivity - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&16. WMS—启动窗口(StartingWindow) : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//wms_starting_window/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WMS-启动窗口(StartingWindow) - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&17. WMS—启动过程 : &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//windowmanger/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WMS-启动过程 - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&&br&&/p&&h2&# 进程管理&/h2&&p&1. cpuset : &a href=&http://link.zhihu.com/?target=https%3A//www.kernel.org/doc/Documentation/cgroup-v1/cpusets.txt& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&kernel.org/doc/Document&/span&&span class=&invisible&&ation/cgroup-v1/cpusets.txt&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&2. cgroup : &a href=&http://link.zhihu.com/?target=https%3A//www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&kernel.org/doc/Document&/span&&span class=&invisible&&ation/cgroup-v1/cgroups.txt&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&3. Android 进程调度之 adj 算法 &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//android-adj/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android进程调度之adj算法 - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&4. Linux 进程管理(一) &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//linux-process/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Linux进程管理(一) - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&5. Linux 进程管理(二)--fork &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//linux-process-fork/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Linux进程管理(二)--fork - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&6. Linux 进程 pid 分配法 &a href=&http://link.zhihu.com/?target=http%3A//gityuan.com//linux_process_pid/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Linux进程pid分配法 - Gityuan博客 | 袁辉辉博客&/a&&/p&&p&7. [收费培训视频] 打通 Linux 脉络系列:进程、线程和调度 : &a href=&http://link.zhihu.com/?target=http%3A//edu.csdn.net/course/detail/5995& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[教学视频]打通Linux脉络系列:进程、线程和调度-宋宝华-CSDN学院-在线学习教程-CSDN学院&/a&&/p&&p&8. Android 系统中的进程管理:进程的创建 : &a href=&http://link.zhihu.com/?target=http%3A//qiangbo.space//AndroidAnatomy_Process_Creation/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android系统中的进程管理:进程的创建&/a&&/p&&p&8. Android 系统中的进程管理:进程的优先级 : &a href=&http://link.zhihu.com/?target=http%3A//qiangbo.space//AndroidAnatomy_Process_OomAdj/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android系统中的进程管理:进程的优先级&/a&&/p&&p&9. Android 系统中的进程管理:内存的回收 : &a href=&http://link.zhihu.com/?target=http%3A//qiangbo.space//AndroidAnatomy_Process_Recycle/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android系统中的进程管理:内存的回收&/a&&/p&&p&10. Android 系统启动:init 进程与 init 语言 : &a href=&http://link.zhihu.com/?target=http%3A//qiangbo.space//AndroidAnatomy_Init/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android系统启动:init进程与init语言&/a&&/p&&p&&br&&/p&&h2&# 调试工具&/h2&&p&1. 另一个 Android 性能剖析工具——simpleperf : &a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&另一个Android性能剖析工具——simpleperf&/a&&/p&&p&2. 如何调试 Android Framework : &a href=&http://link.zhihu.com/?target=http%3A//weishu.me//how-to-debug-android-framework/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&如何调试Android Framework?&/a&&/p&&p&3. 如何调试 Android Native Framework : &a href=&http://link.zhihu.com/?target=http%3A//weishu.me//how-to-debug-android-native-framework-source/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&如何调试Android Native Framework&/a&&/p&&p&4. Catapult : &a href=&http://link.zhihu.com/?target=https%3A//catapult.gsrc.io/README.md& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&catapult.gsrc.io/README&/span&&span class=&invisible&&.md&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&5. &a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&手把手教你使用Systrace(一)&/a&&/p&&p&6. &a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&手把手教你使用Systrace(二)——锁优化&/a&&/p&&p&&br&&/p&&h2&# 硬件相关&/h2&&p&1. Flash Wear Management in Android Automotive : &a href=&http://link.zhihu.com/?target=https%3A//source.android.com/devices/tech/perf/flash-wear& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&source.android.com/devi&/span&&span class=&invisible&&ces/tech/perf/flash-wear&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&2. Cortex-A75 和 Cortex-A55 : &a href=&http://link.zhihu.com/?target=http%3A//www.10tiao.com/html/431/.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Cortex-A75 和 Cortex-A55&/a&&/p&&p&3. CPU Utilization is Wrong : &a href=&http://link.zhihu.com/?target=http%3A//www.brendangregg.com/blog//cpu-utilization-is-wrong.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CPU Utilization is Wrong&/a&&/p&&p&&br&&/p&&h2&# 编程语言&/h2&&p&1. 探索 Java 隐藏的开销 : &a href=&http://link.zhihu.com/?target=https%3A//academy.realm.io/cn/posts/360andev-jake-wharton-java-hidden-costs-android/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&探索 Java 隐藏的开销&/a&&/p&&p&&br&&/p&&h2&# Kernel&/h2&&p&1. 内核探索:Regmap 框架:简化慢速 I/O 接口优化性能 &a href=&http://link.zhihu.com/?target=http%3A//www.tinylab.cn/kernel-explore-regmap-framework/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&内核探索:Regmap 框架:简化慢速 I/O 接口优化性能&/a&&/p&&p&2. 嵌入式 Linux 启动时间优化 &a href=&http://link.zhihu.com/?target=http%3A//www.tinylab.cn/elinux-org-boot-time-optimization/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&嵌入式 Linux 启动时间优化&/a&&/p&&p&&br&&/p&&h2&# 我辈楷模&/h2&&p&1. &a href=&http://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s%3F__biz%3DMzU3ODAxNDcwNQ%3D%3D%26mid%3D%26idx%3D1%26sn%3Dcd5f8fead3bcaac2d22a3dd699d2e79f%26chksm%3Dfd7a9e6dca0d177b20e83baa89aada46c5fe3%26mpshare%3D1%26scene%3D1%26srcid%3D1027hi7FsUIG3AirEiJg198C%23rd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&我到底有多么努力&/a&&/p&&p&2. 工作以来的一些感悟 : &a href=&https://zhuanlan.zhihu.com/zmywly5& class=&internal&&&span class=&invisible&&https://&/span&&span class=&visible&&zhuanlan.zhihu.com/zmyw&/span&&span class=&invisible&&ly5&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&&/p&&p&&/p&&p&&/p&&p&&/p&
本文首发于博客 : 做了这么久性能相关的工作,也接触了不少模块,说实话要做好性能这一块,真心不容易.为什么这么说? 是因为需要接触的知识实在是太多了, Android 是一个整体,牵一发而动全身,不是说只懂一个模块就可以做好.在学习的过…
&p&哈哈,之前写过一系列调试Android Framework的文章,唯独没写过动态调试;借此机会补上。&/p&&p&这么多答案,到底谁对谁错?来来来,手把手教你分析一波。&/p&&p&_________________________________________________&/p&&p&&br&&/p&&p&首先这是个ANR,说白了就是主线程由于某些原因停滞不前导致无法响应界面操作,我们先拉取ANR的trace文件分析,在手机的 /data/anr/traces/txt 目录,直接 `adb pull /data/anr/traces.txt` 拉出来看即可,只需要关注主线程的堆栈。&/p&&p&复现了好几次发现这个ANR的堆栈每次都有细微的不一样:&/p&&p&trace1:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&main& prio=5 tid=1 Runnable
| group=&main& sCount=0 dsCount=0 obj=0x74dee000 self=0xf3e85400
| sysTid=7194 nice=-8 cgrp=default sched=0/0 handle=0xf6ac8534
| state=R schedstat=(
03 ) utm=746 stm=57 core=4 HZ=100
| stack=0xff39d000-0xff39f000 stackSize=8MB
| held mutexes= &mutator lock&(shared held)
at java.util.regex.Matcher.&init&(Matcher.java:172)
at java.util.regex.Pattern.matcher(Pattern.java:1006)
at com.tencent.mm.ui.widget.celltextview.g.a.o(SourceFile:95)
at com.tencent.mm.ui.widget.celltextview.g.a.dc(SourceFile:55)
at com.tencent.mm.ui.widget.celltextview.f.b.a(SourceFile:76)
at com.tencent.mm.ui.widget.celltextview.d.a.CD(SourceFile:466)
at com.tencent.mm.ui.widget.celltextview.d.a.Cu(SourceFile:92)
at com.tencent.mm.ui.widget.celltextview.CellTextView.onMeasure(SourceFile:102)
at android.view.View.measure(View.java:19733)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
&/code&&/pre&&/div&&p&trace2:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&main& prio=5 tid=1 Native
| group=&main& sCount=1 dsCount=0 obj=0x74dee000 self=0xf3e85400
| sysTid=28710 nice=0 cgrp=default sched=0/0 handle=0xf6ac8534
| state=S schedstat=(
94 ) utm=840 stm=68 core=5 HZ=100
| stack=0xff39d000-0xff39f000 stackSize=8MB
| held mutexes=
kernel: __switch_to+0x8c/0x98
kernel: futex_wait_queue_me+0xd4/0x130
kernel: futex_wait+0xfc/0x210
kernel: do_futex+0xe0/0x920
kernel: compat_SyS_futex+0xe8/0x17c
kernel: cpu_switch_to+0x48/0x4c
native: #00 pc
/system/lib/libc.so (syscall+28)
native: #01 pc 000b62bd
/system/lib/libart.so (_ZN3art17ConditionVariable16WaitHoldingLocksEPNS_6ThreadE+92)
native: #02 pc 003efd1b
/system/lib/libart.so (_ZN3artL12GoToRunnableEPNS_6ThreadE+230)
native: #03 pc 003efc0b
/system/lib/libart.so (_ZN3art12JniMethodEndEjPNS_6ThreadE+8)
native: #04 pc 0006de8f
/data/app/com.tencent.mm-1/oat/arm/base.odex (Java_com_tencent_mars_xlog_Xlog_logWrite2__ILjava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2IIJJLjava_lang_String_2+242)
at com.tencent.mars.xlog.Xlog.logWrite2(Native method)
at com.tencent.mars.xlog.Xlog.logI(SourceFile:61)
at com.tencent.mm.sdk.platformtools.w.i(SourceFile:260)
at com.tencent.mm.ui.widget.celltextview.f.b.a(SourceFile:76)
at com.tencent.mm.ui.widget.celltextview.d.a.CD(SourceFile:466)
at com.tencent.mm.ui.widget.celltextview.d.a.Cu(SourceFile:92)
at com.tencent.mm.ui.widget.celltextview.CellTextView.onMeasure(SourceFile:102)
at android.view.View.measure(View.java:19733)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
&/code&&/pre&&/div&&p&&br&&/p&&p&trace3:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&main& prio=5 tid=1 Native
| group=&main& sCount=1 dsCount=0 obj=0x74dee000 self=0xf3e85400
| sysTid=29538 nice=-8 cgrp=default sched=0/0 handle=0xf6ac8534
| state=S schedstat=(
6268 ) utm=2836 stm=187 core=4 HZ=100
| stack=0xff39d000-0xff39f000 stackSize=8MB
| held mutexes=
kernel: __switch_to+0x8c/0x98
kernel: futex_wait_queue_me+0xd4/0x130
kernel: futex_wait+0xfc/0x210
kernel: do_futex+0xe0/0x920
kernel: compat_SyS_futex+0xe8/0x17c
kernel: cpu_switch_to+0x48/0x4c
native: #00 pc
/system/lib/libc.so (syscall+28)
native: #01 pc 000b62bd
/system/lib/libart.so (_ZN3art17ConditionVariable16WaitHoldingLocksEPNS_6ThreadE+92)
native: #02 pc
/system/lib/libart.so (_ZN3art3JNI18ReleaseStringCharsEP7_JNIEnvP8_jstringPKt+204)
native: #03 pc 0001329d
/system/lib/libjavacore.so (???)
native: #04 pc 00012e73
/system/lib/libjavacore.so (???)
native: #05 pc 001fbc83
/system/framework/arm/boot.oat (Java_java_util_regex_Matcher_findNextImpl__JLjava_lang_String_2_3I+142)
at java.util.regex.Matcher.findNextImpl(Native method)
at java.util.regex.Matcher.find(Matcher.java:437)
- locked &0x0f4fd7f4& (a java.util.regex.Matcher)
at com.tencent.mm.ui.widget.celltextview.g.a.o(SourceFile:96)
at com.tencent.mm.ui.widget.celltextview.g.a.dc(SourceFile:55)
at com.tencent.mm.ui.widget.celltextview.f.b.a(SourceFile:76)
at com.tencent.mm.ui.widget.celltextview.d.a.CD(SourceFile:466)
at com.tencent.mm.ui.widget.celltextview.d.a.Cu(SourceFile:92)
at com.tencent.mm.ui.widget.celltextview.CellTextView.onMeasure(SourceFile:102)
at android.view.View.measure(View.java:19733)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1117)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:642)
at android.view.View.measure(View.java:19733)
&/code&&/pre&&/div&&p&&br&&/p&&p&trace4:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&main& prio=5 tid=1 Runnable
| group=&main& sCount=0 dsCount=0 obj=0x74dee000 self=0xf3e85400
| sysTid=31062 nice=-8 cgrp=default sched=0/0 handle=0xf6ac8534
| state=R schedstat=(
98 ) utm=728 stm=46 core=5 HZ=100
| stack=0xff39d000-0xff39f000 stackSize=8MB
| held mutexes= &mutator lock&(shared held)
at com.tencent.mm.ui.widget.celltextview.g.a.V(SourceFile:-1)
at com.tencent.mm.ui.widget.celltextview.f.b.a(SourceFile:76)
at com.tencent.mm.ui.widget.celltextview.d.a.CD(SourceFile:466)
at com.tencent.mm.ui.widget.celltextview.d.a.Cu(SourceFile:92)
at com.tencent.mm.ui.widget.celltextview.CellTextView.onMeasure(SourceFile:102)
at android.view.View.measure(View.java:19733)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1117)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:642)
at android.view.View.measure(View.java:19733)
&/code&&/pre&&/div&&p&&br&&/p&&p&trace1和trace3看起来都是正则表达式的问题,但是trace2堆栈落在了输出日志上,trace4则是另一个函数的函数。由于堆栈并不是固定的,因此可以&b&排除是某一个函数耗时超长的情况&/b&(比如正则匹配);不过这几个堆栈有相似之处,就是他们有一些相同的父调用链:&/p&&div class=&highlight&&&pre&&code class=&language-java&& &span class=&n&&at&/span& &span class=&n&&com&/span&&span class=&o&&.&/span&&span class=&na&&tencent&/span&&span class=&o&&.&/span&&span class=&na&&mm&/span&&span class=&o&&.&/span&&span class=&na&&ui&/span&&span class=&o&&.&/span&&span class=&na&&widget&/span&&span class=&o&&.&/span&&span class=&na&&celltextview&/span&&span class=&o&&.&/span&&span class=&na&&f&/span&&span class=&o&&.&/span&&span class=&na&&b&/span&&span class=&o&&.&/span&&span class=&na&&a&/span&&span class=&o&&(&/span&&span class=&n&&SourceFile&/span&&span class=&o&&:&/span&&span class=&mi&&76&/span&&span class=&o&&)&/span&
&span class=&n&&at&/span& &span class=&n&&com&/span&&span class=&o&&.&/span&&span class=&na&&tencent&/span&&span class=&o&&.&/span&&span class=&na&&mm&/span&&span class=&o&&.&/span&&span class=&na&&ui&/span&&span class=&o&&.&/span&&span class=&na&&widget&/span&&span class=&o&&.&/span&&span class=&na&&celltextview&/span&&span class=&o&&.&/span&&span class=&na&&d&/span&&span class=&o&&.&/span&&span class=&na&&a&/span&&span class=&o&&.&/span&&span class=&na&&CD&/span&&span class=&o&&(&/span&&span class=&n&&SourceFile&/span&&span class=&o&&:&/span&&span class=&mi&&466&/span&&span class=&o&&)&/span&
&span class=&n&&at&/span& &span class=&n&&com&/span&&span class=&o&&.&/span&&span class=&na&&tencent&/span&&span class=&o&&.&/span&&span class=&na&&mm&/span&&span class=&o&&.&/span&&span class=&na&&ui&/span&&span class=&o&&.&/span&&span class=&na&&widget&/span&&span class=&o&&.&/span&&span class=&na&&celltextview&/span&&span class=&o&&.&/span&&span class=&na&&d&/span&&span class=&o&&.&/span&&span class=&na&&a&/span&&span class=&o&&.&/span&&span class=&na&&Cu&/span&&span class=&o&&(&/span&&span class=&n&&SourceFile&/span&&span class=&o&&:&/span&&span class=&mi&&92&/span&&span class=&o&&)&/span&
&span class=&n&&at&/span& &span class=&n&&com&/span&&span class=&o&&.&/span&&span class=&na&&tencent&/span&&span class=&o&&.&/span&&span class=&na&&mm&/span&&span class=&o&&.&/span&&span class=&na&&ui&/span&&span class=&o&&.&/span&&span class=&na&&widget&/span&&span class=&o&&.&/span&&span class=&na&&celltextview&/span&&span class=&o&&.&/span&&span class=&na&&CellTextView&/span&&span class=&o&&.&/span&&span class=&na&&onMeasure&/span&&span class=&o&&(&/span&&span class=&n&&SourceFile&/span&&span class=&o&&:&/span&&span class=&mi&&102&/span&&span class=&o&&)&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&因此可以初步下结论:`com.tencent.mm.ui.widget.celltextview.f.b.a(SourceFile:76)` 这个函数内部有循环,由于某未知原因导致循环无法退出,或者循环内某个调用较为耗时导致整个循环体超级耗时,进而出现用户点击界面之后主线程由于一直在循环内无法响应用户操作,出现ANR;ANR的时候(注意这时候主线程并没有死掉,而是一直在执行代码,只不过在死循环里面出不来)系统抓主线程的堆栈,不同的时间会抓到循环体内不同的行数上,所以会发现调用栈不同的情况。&/p&&p&&br&&/p&&p&有了基本方向之后就可以直接调试微信并验证了。&/p&&p&工具:Root设备(准确滴说co.debuggable = 1的设备)或者模拟器,Android Studio,baksmali,SmaliIdea插件,某信最新版apk&/p&&p&步骤:&/p&&ol&&li&&b&安装SmaliIDEA调试插件&/b&&/li&&ol&&li&&b&下载SmaliIDEA插件到本地:&/b&&a href=&//link.zhihu.com/?target=https%3A//bitbucket.org/JesusFreke/smali/downloads/smalidea-0.05.zip& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&bitbucket.org/JesusFrek&/span&&span class=&invisible&&e/smali/downloads/smalidea-0.05.zip&/span&&span class=&ellipsis&&&/span&&/a&&/li&&li&打开AndroidStudio的设置面板,左侧选择Plugin:&/li&&/ol&&/ol&&figure&&img src=&https://pic3.zhimg.com/v2-c28aee5f5fd49f9ca35f290b8640697a_b.jpg& data-rawwidth=&1852& data-rawheight=&1270& class=&origin_image zh-lightbox-thumb& width=&1852& data-original=&https://pic3.zhimg.com/v2-c28aee5f5fd49f9ca35f290b8640697a_r.jpg&&&/figure&&p&&br&&/p&&p&点`Install plugin from disk`,然后选择你刚刚下载的那个文件,然后按步骤重启Android Studio即可完成安装。&/p&&p&&b&2. 反编译为smali&/b&&/p&&p&接下来可以把某信反编译为smali指令,然后进行调试。&/p&&p&1)首先下载&a href=&//link.zhihu.com/?target=https%3A//bitbucket.org/JesusFreke/smali/downloads/baksmali-2.2.1.jar& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&bitbucket.org/JesusFrek&/span&&span class=&invisible&&e/smali/downloads/baksmali-2.2.1.jar&/span&&span class=&ellipsis&&&/span&&/a& 和 某信的最新apk文件&/p&&p&2)然后用上述下载的baksmali反编译某信:`java -jar baksmali-2.2.1.jar d mouxin.apk`,即可得到一个名为`out`的输出目录,里面是反编译好的smali文件。(这一步也可以使用apktool来进行,更为简单)&/p&&p&3)在符合要求的设备上装上某信安装包,然后登陆。&/p&&p&&br&&/p&&p&3. &b&建立动态调试环境&/b&&/p&&p&&b&1)首先导入并创建项目&/b&。打开Android Studio,选择菜单File-New Project -&Import Project:&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-eabf01bdda6be85a5b36_b.jpg& data-rawwidth=&1100& data-rawheight=&194& class=&origin_image zh-lightbox-thumb& width=&1100& data-original=&https://pic3.zhimg.com/v2-eabf01bdda6be85a5b36_r.jpg&&&/figure&&p&然后选择刚刚baksmali的输出目录:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-bda953a9a7a_b.jpg& data-rawwidth=&856& data-rawheight=&740& class=&origin_image zh-lightbox-thumb& width=&856& data-original=&https://pic3.zhimg.com/v2-bda953a9a7a_r.jpg&&&/figure&&p&&br&&/p&&p&点确定,Next:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-de7afefa7b08dff62be5a0a_b.jpg& data-rawwidth=&990& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&990& data-original=&https://pic3.zhimg.com/v2-de7afefa7b08dff62be5a0a_r.jpg&&&/figure&&p&然后一路Next直到Finish完成。&/p&&p&2)&b&设置smali源码目录&/b&。首先把目录视图从‘Android’切换为‘project’:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-7b9aaa485c653af42569f54bde567f91_b.jpg& data-rawwidth=&488& data-rawheight=&350& class=&origin_image zh-lightbox-thumb& width=&488& data-original=&https://pic2.zhimg.com/v2-7b9aaa485c653af42569f54bde567f91_r.jpg&&&/figure&&p&&br&&/p&&p&这样就能看到你导入的smali源码目录,右键此目录:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-9f9a20f2230ddf10a7c74a3d33b53939_b.jpg& data-rawwidth=&954& data-rawheight=&224& class=&origin_image zh-lightbox-thumb& width=&954& data-original=&https://pic2.zhimg.com/v2-9f9a20f2230ddf10a7c74a3d33b53939_r.jpg&&&/figure&&p&这一步完成。&/p&&p&3)打开调试器。首先用usb连上手机,在有Android SDK的前提下,在命令行执行:`$ANDROID_HOME/tools/monitor`即可打开Android Monitor;如果你的设备满足条件(所有进程可调试)那么左边会出现进程列表:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-a795acf00f38ca984d2b9deb_b.jpg& data-rawwidth=&1036& data-rawheight=&334& class=&origin_image zh-lightbox-thumb& width=&1036& data-original=&https://pic4.zhimg.com/v2-a795acf00f38ca984d2b9deb_r.jpg&&&/figure&&p&直接鼠标点击你要调试的进程,会出现一个如上图的端口号,这个是adb进行调试用来端口转发的socket号,记住这个数字,这里是8700。&/p&&p&&br&&/p&&p&&b&4)连上调试器。点击Android Studio菜单,Run-&Edit Configration:&/b&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-cfceca27dec4ce_b.jpg& data-rawwidth=&726& data-rawheight=&366& class=&origin_image zh-lightbox-thumb& width=&726& data-original=&https://pic1.zhimg.com/v2-cfceca27dec4ce_r.jpg&&&/figure&&p&&br&&/p&&p&点击+号,新建Remote类型的配置:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-55527a3bfbf0da47623a6fdecedf9bdb_b.jpg& data-rawwidth=&548& data-rawheight=&498& class=&origin_image zh-lightbox-thumb& width=&548& data-original=&https://pic4.zhimg.com/v2-55527a3bfbf0da47623a6fdecedf9bdb_r.jpg&&&/figure&&p&&br&&/p&&p&然后把要连接的端口号修改为上面的8700即可:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-ea10d6ab363aab8772fcd1_b.jpg& data-rawwidth=&1256& data-rawheight=&780& class=&origin_image zh-lightbox-thumb& width=&1256& data-original=&https://pic2.zhimg.com/v2-ea10d6ab363aab8772fcd1_r.jpg&&&/figure&&p&&br&&/p&&p&点击确定之后,Android Studio的工具栏右上角会出现Debug按钮,点击此按钮:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-b155adfdc8d799b86a23cfc6_b.jpg& data-rawwidth=&390& data-rawheight=&142& class=&content_image& width=&390&&&/figure&&p&&br&&/p&&p&下方的控制台就会输出:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-e2aa0ffa464513cffcc8f195b359178a_b.jpg& data-rawwidth=&1674& data-rawheight=&288& class=&origin_image zh-lightbox-thumb& width=&1674& data-original=&https://pic3.zhimg.com/v2-e2aa0ffa464513cffcc8f195b359178a_r.jpg&&&/figure&&p&&br&&/p&&p&这样,整个调试环境已经准备好了;接下来可以进行动态调试。&/p&&p&&br&&/p&&p&4. 开始动态调试。&/p&&p&通过第一步的anr trace文件分析,我们知道大概出问题的地方是 `com.tencent.mm.ui.widget.celltextview.f.b.a(SourceFile:76)` ,我们在Android Studio中打开这个文件,找到这个函数调用的地方,直接下个断点:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-a030d8c93b1bdf4a2f57a8b1d2fd0aaa_b.jpg& data-rawwidth=&1550& data-rawheight=&396& class=&origin_image zh-lightbox-thumb& width=&1550& data-original=&https://pic3.zhimg.com/v2-a030d8c93b1bdf4a2f57a8b1d2fd0aaa_r.jpg&&&/figure&&p&然后打开某信复现此bug,可以看到Android Studio中断点触发:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-f3ff797ca3a3fd4ec349f883ebe9b382_b.jpg& data-rawwidth=&1306& data-rawheight=&404& class=&origin_image zh-lightbox-thumb& width=&1306& data-original=&https://pic3.zhimg.com/v2-f3ff797ca3a3fd4ec349f883ebe9b382_r.jpg&&&/figure&&p&&br&&/p&&p&接下来就可以正常地进行调试;如果要查看变量值,可以用Alt + F8 或者在下方的watch窗口中添加,如下图(点?添加):&/p&&figure&&img src=&https://pic4.zhimg.com/v2-b7b53ac0ea273f1f7b118b_b.jpg& data-rawwidth=&974& data-rawheight=&326& class=&origin_image zh-lightbox-thumb& width=&974& data-original=&https://pic4.zhimg.com/v2-b7b53ac0ea273f1f7b118b_r.jpg&&&/figure&&p&&br&&/p&&p&断点下好之后,可以不停滴单步执行,观察程序的流程;不停滴跟踪之后发现,这个函数会不断滴被重入,因此上面下的基本结论“此函数内有循环”是错误的,应该是次函数被循环调用。于是我们把断点下在调用此函数的地方:&/p&&p&at com.tencent.mm.ui.widget.celltextview.f.b.a(SourceFile:76)&br&&b&
at com.tencent.mm.ui.widget.celltextview.d.a.CD(SourceFile:466)&/b&&br&
at com.tencent.mm.ui.widget.celltextview.d.a.Cu(SourceFile:92)&br&
at com.tencent.mm.ui.widget.celltextview.CellTextView.onMeasure(SourceFile:102)&/p&&p&&br&&/p&&p&继续跟踪,就可以知道为什么会出现死循环的情况。&/p&&p&&br&&/p&&p&关于更多的调试原理与调试姿势,可以移步我的博客:&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//weishu.me//how-to-debug-android-framework/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&如何调试Android Framework?&/a&&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//weishu.me//how-to-debug-android-native-framework-source/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&如何调试Android Native Framework&/a&&/p&
哈哈,之前写过一系列调试Android Framework的文章,唯独没写过动态调试;借此机会补上。这么多答案,到底谁对谁错?来来来,手把手教你分析一波。_________________________________________________ 首先这是个ANR,说白了就是主线程由于某些原因停滞不前…
&figure&&img src=&https://pic4.zhimg.com/v2-a6900bac29e8e4eaed758d24793cc13c_b.jpg& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&https://pic4.zhimg.com/v2-a6900bac29e8e4eaed758d24793cc13c_r.jpg&&&/figure&&blockquote&8 /* 一共绘制 8 个数(4 个点)*/这期的文章格式如果看着太难受,可以去我的网站看原文。我调了几个小时了还是调不好,实在是 hold 不住知乎的编辑器啊……
网站原文:&a href=&https://link.zhihu.com/?target=http%3A//hencoder.com/ui-1-1/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android 开发进阶: 自定义 View 1-1 绘制基础&/a&&/blockquote&&p&从今天开始,HenCoder 就正式开讲知识技能了。按照我的计划,第一季是 UI,UI 一共分为三部分:绘制、布局和触摸反馈。本期是绘制部分的第一期。绘制大概会用 5~6 期的时间讲完,整个 UI 的绘制、布局和触摸反馈三部分大概会用十来期。更新频率大约为每周一更(不承诺哟)。&/p&&p&如果你不知道 HenCoder 是什么,可以先看这里:&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&HenCoder:给高级 Android 工程师的进阶手册&/a&&/p&&h2&自定义绘制概述&/h2&&p&二话不说,我反手就是一个视频:&/p&&a class=&video-box& href=&https://link.zhihu.com/?target=https%3A//www.zhihu.com/video/340160& target=&_blank& data-video-id=&& data-video-playable=&true& data-name=&& data-poster=&https://pic3.zhimg.com/v2-ae5e658da8e2.jpg& data-lens-id=&340160&&
&img class=&thumbnail& src=&https://pic3.zhimg.com/v2-ae5e658da8e2.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://www.zhihu.com/video/340160&/span&
&p&首先总结一下视频中的关键点:&/p&&ul&&li&自定义绘制的方式是重写绘制方法,其中最常用的是 onDraw()&/li&&li&绘制的关键是 Canvas 的使用&/li&&ul&&li&Canvas 的绘制类方法: drawXXX() (关键参数:Paint)&/li&&li&Canvas 的辅助类方法:范围裁切和几何变换&/li&&/ul&&li&可以使用不同的绘制方法来控制遮盖关系&/li&&/ul&&p&概念已经在视频里全部讲出来了,知识点并不多,但你可能也看出来了,我讲得并不细。这是因为知识点虽然不多,但细节还是很多的,仅仅靠一节分享不可能讲完。我按照顺序把这些知识分成了 4 个级别,拆成几节来讲,你按照这 4 个级别的顺序学习下来,就能够平滑地逐步进阶。&/p&&h2&自定义绘制知识的四个级别&/h2&&ol&&li&Canvas 的 drawXXX() 系列方法及 Paint 最常见的使用&/li&&/ol&&p&Canvas.drawXXX() 是自定义绘制最基本的操作。掌握了这些方法,你才知道怎么绘制内容,例如怎么画圆、怎么画方、怎么画图像和文字。组合绘制这些内容,再配合上 Paint 的一些常见方法来对绘制内容的颜色和风格进行简单的配置,就能够应付大部分的绘制需求了。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-764d6f89dadfff_b.jpg& data-rawwidth=&288& data-rawheight=&182& class=&content_image& width=&288&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-4c904db3ec7c80b1946bfe8d81332bea_b.jpg& data-rawwidth=&343& data-rawheight=&197& class=&content_image& width=&343&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-325d2d5e4ca61b9acc4d9f2fa9daa7fb_b.jpg& data-rawwidth=&254& data-rawheight=&237& class=&content_image& width=&254&&&/figure&&p&&br&&/p&&p&今天这篇分享我要讲的就是这些内容。也就是说,你在看完这篇文章&b&并做完练习&/b&之后,上面这几幅图你就会绘制出来了。从今以后,你也很少再需要假装一本正经地对设计师说「不行这个图技术上实现不了」,也不用心惊胆战得等待设计师的那句「那 iOS 怎么可以」了。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-3ea01a73cd5b67957ebc72_b.jpg& data-rawwidth=&234& data-rawheight=&272& class=&content_image& width=&234&&&/figure&&p&&br&&/p&&ol&&li&Paint 的完全攻略&/li&&/ol&&p&Paint 可以做的事,不只是设置颜色,也不只是我在视频里讲的实心空心、线条粗细、有没有阴影,它可以做的风格设置真的是非常多、非常细。例如:&/p&&blockquote&拐角要什么形状?&/blockquote&&figure&&img src=&https://pic3.zhimg.com/v2-c1cebee3038cbdd759abf5_b.jpg& data-rawwidth=&449& data-rawheight=&149& class=&origin_image zh-lightbox-thumb& width=&449& data-original=&https://pic3.zhimg.com/v2-c1cebee3038cbdd759abf5_r.jpg&&&/figure&&p&&br&&/p&&blockquote&开不开双线性过滤?&/blockquote&&figure&&img src=&https://pic4.zhimg.com/v2-6b7ac60ce_b.jpg& data-rawwidth=&658& data-rawheight=&304& class=&origin_image zh-lightbox-thumb& width=&658& data-original=&https://pic4.zhimg.com/v2-6b7ac60ce_r.jpg&&&/figure&&p&&br&&/p&&blockquote&加不加特效?&/blockquote&&figure&&img src=&https://pic4.zhimg.com/v2-d5ac530b51cf68a1fc0656_b.jpg& data-rawwidth=&667& data-rawheight=&306& class=&origin_image zh-lightbox-thumb& width=&667& data-original=&https://pic4.zhimg.com/v2-d5ac530b51cf68a1fc0656_r.jpg&&&/figure&&p&&br&&/p&&p&可以调节的非常多,我就不一一列举了。当你掌握到这个级别,就真的不会有什么东西会是 iOS 能做到但你做不到的了。就算设计师再设计出了很难做的东西,做不出来的也不再会是你们 Android 组了。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-e71f850f2aad008cb831b49_b.jpg& data-rawwidth=&260& data-rawheight=&281& class=&content_image& width=&260&&&/figure&&p&&br&&/p&&ol&&li&Canvas 对绘制的辅助——范围裁切和几何变换。&/li&&/ol&&p&范围裁切:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-5b034d70cf6d4d6240ee56_b.jpg& data-rawwidth=&655& data-rawheight=&431& class=&origin_image zh-lightbox-thumb& width=&655& data-original=&https://pic2.zhimg.com/v2-5b034d70cf6d4d6240ee56_r.jpg&&&/figure&&p&几何变换:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-785dbc3841fcab4ad39e_b.jpg& data-rawwidth=&938& data-rawheight=&722& class=&origin_image zh-lightbox-thumb& width=&938& data-original=&https://pic1.zhimg.com/v2-785dbc3841fcab4ad39e_r.jpg&&&/figure&&p&&br&&/p&&p&大多数时候,它们并不会被用到,但一旦用到,通常都是很炫酷的效果。范围裁切和几何变换都是用于辅助的

我要回帖

更多关于 中宏人寿保险公司 的文章

 

随机推荐