ANDROID
文章平均质量分 76
喜欢踢足球的老罗
0)不忘初心, 方得始终;
1)知其然,知其所以然;
2)工欲善其事,必先利其器
3)路曼曼其修远兮,吾将上下而求索;
展开
-
Message的消息池(sPool)
关键总结1、消息池缓存有可复复使用的消息实例,可以重复使用消息实例,避免过多的创建与回收消息消息实例2、消息池是后一个栈(LIFO/FILO=后进先出/先进后出)的数据结构,具体的栈的数据存放是采用了链表方式组织3、消息池一开始是空的,需要主动添加消息进入缓存池,然后供后续的取出与使用,消息池的长度是有限制的,这样可以避免缓存过多的对象,导致内存占用过多,尽可能的避免内存泄漏3、消息入队列时会被设置为已经在使用的状态,消息从消息列表取出被消费后会放入消息池,大多数情况下我们是不会主动调Message原创 2021-12-23 23:40:32 · 2349 阅读 · 0 评论 -
Android上使用leaktracer的经验分享
上周使用了LeakTracer来分析我们项目的SDK的内存问题,最终的成效还算可以。工具能正常使用,通过内存泄漏日志文件中的函数调用堆栈,结合查看源代码找到不少的内存使用不当的问题。我的使用场景是:在初始化SDK前调用 leaktracer::MemoryTrace::GetInstance().startMonitoringAllThreads(),启动内存监控。在销毁SDK后再调用leaktracer::MemoryTrace::GetInstance().writeLeaksToFile("/s原创 2020-12-29 17:38:24 · 1574 阅读 · 0 评论 -
【温故而知新】Android 消息机制/HandlerThread、Looper、Handler 在Java层的知识点
Android 消息机制的实现主要类有Looper、HandlerThread、Handler、Message、MessageQueue,但在使用过程中我们会发现明显Hander与Message提供的方法非常之多,Looper与MessageQueue等类提供的接口确很少,另外还特别提供了一个HandlerThread这个开箱即用的类(HandlerThread = Thread + Looper 模型的默认实现)来尽可能的方便我们使用消息机制。其实我们去看MessageQueue类的源码会发现它的方法是原创 2021-12-09 21:18:07 · 2230 阅读 · 0 评论 -
【温故而知新】Android 消息机制/HandlerThread、Looper、Handler 的前置知识点
有关于Android消息机制的复习与分享,温故而知新的总结与交流,大家感兴趣可以看下,交流交流,写得不对的地方讲大家指正,谢谢原创 2021-12-07 19:39:09 · 2060 阅读 · 0 评论 -
android.os.Process.myTid与Thread.currentThread.getId的区别
关键总结1、android.os.Process.myTid返回的是系统系别的线程实例的实程号,在JNI开发过程我们一般称之为natvie线程2、Thread.currentThread.getId返回的是JVM级别的线程实例对应的线程号(一个递增的Id)3、一个native线程当前只能绑定一个JVM世界的线程,但可以多次绑定不同的线程实例,这个绑定线程实例过程其实是发生在我们的创建的native线程将要跟Java代码做交互时前的的attchJVM的操作,如果每次都交互前后都做attach与deatt原创 2021-11-29 21:22:39 · 2522 阅读 · 0 评论 -
正确使用NDEBUG宏——release包如何关闭assert(Android/ios)
前言最近堆的坑——release包含了Assert的逻辑。原来是项目中针对发布包没有关闭Assert功能,即没有定义NDEBUG宏所导致。如下是搜索资料的与相关实践总结,供遇到同类问题的同学参考Android NDEBUG配置在build.gradle文件IOS NDEBUG配置在TAGGETS的build Settings的Preprocessing配置NDBUG跟assertassert用于调试应用,一般是在开发阶段使用。assert为true会抛出运行时异常而中止应用的运行。而NDB原创 2021-06-24 19:23:29 · 2133 阅读 · 0 评论 -
Android native开发设置线程名需要注意的地方
前言最近在native开发过程为了分析SDK使用线程情况,设置线程名过程中遇到了两个“坑”,故做下简单的总结记录同时跟大家分享一下。注:这里的native线程,是指用使用pthread创建的线程或直接使用c++的std::thread类来创建新的线程,Andorid/linux上使用prctl(PR_SET_NAME, thread_name, 0, 0, 0)来设置线程名总结第一点:设置线程名可能会失效一般情况下我们native的线程是需要跟java层的模块交互的,由于native线程是没有JV原创 2021-06-22 21:16:10 · 1349 阅读 · 5 评论 -
android aar 包含静态库的打包
前言一般我们开发的android sdk(arr)使用了jni后,aar中只会包含动态库的(so文件),所以以前一直没有注意与处理过android平台上的静态库的打包。今天尝试了一下,并且遇到了一直打不出.a文件,通过搜索找到了不明原因的解决方案。后续需要弄清楚背后的原因和撑握相关的知识点。方案1、CMakeLists.txt文件,把库的打包类型改为STATIC2、需要在build.gradle 文件的nativeBundleExport配置上加上bundleStatic3、需要在build.gr原创 2020-05-15 20:59:26 · 1397 阅读 · 3 评论 -
跟进SharedPreferences ANR的总结
ANR分析最近也跟进了一个SharedPreferences相关的ANR,是主线程读取SP的时(首次读取某个key的值)产生了ANR。ANR 信息如下原因是:SP加载整个文件时比较耗时,导致加载的后台线程被挂起,同时就影响到了主线程的唤醒。即之前要主线程读取某个key时主动await了,它需要SP加载整个文件的线程Notify临时解决方案:在应用启动时主动读取SP的值,提前触发整个...原创 2020-04-27 16:13:45 · 271 阅读 · 0 评论 -
Parcel: Class not found when unmarshalling: 自定义类
问题描述如标题,这个问题网上有很人遇到,场景是跨进程启动activity或service通传Intent传Parcel数据时遇到,网上总结是类加载器设置不对的原因。我遇到的问题场景是在本进程中,启动新的activity解析传过来的Parcel子类时出现的异常,异常backtrace如下: Caused by: android.os.BadParcelableException: ClassNo...原创 2020-02-15 18:15:18 · 6575 阅读 · 1 评论 -
Nexus 5 Android6.0.1 Chrome下载apk失败的原因分析
设备Nexus 5Android 6.0.1版本号 M4B30Z结论chrome下载apk时,少发了一次分段的网络请求分析正常的情况异常的情况原创 2018-08-21 18:11:05 · 2817 阅读 · 0 评论 -
OpenGLRenderer: Bitmap too large to be uploaded into a texture 的原因简析
根本原因:使用硬件加速沉浸,图片太大(生成对应的Bimmap size太大),生成GPU处理的纹理失败(不允许生成)解决方案:1.换张小size的图片(当图片是本杝的,用来当背景图这类) 2.使用第三方图片库,对图片使用缩压处理View的渲染与OpenGLRenderer的关系ImageView或其它View的子类的渲染是使用了android.graphics.Can...原创 2018-08-15 11:26:17 · 2113 阅读 · 0 评论 -
android仅通过自定义属性id值获取样式自定义属性值
自定义样式属性的使用自定义样式属性一般是使用在自定义UI控件中,自定义样式属性用来扩展UI控件的样式属性。 使用三步曲如下: 1.声明:自定义样式属性 2.使用:在layout文件使自定义控件时,设置自定义样式属性的值 3.解析:在自定义控件的样式属性解析时,读取自定义样式属性的值声明自定义样式属性在values.xml声明CommMyFragmentItem样式属性...原创 2018-08-14 14:26:39 · 3485 阅读 · 0 评论 -
工欲善其事,必先利其器之—命令行下使用jdb调试android应用(MAC环境)
前提说明先关闭Eclipse,Android Studio这类的IDE,否则jdb attach到应用时出现如下异常,jdb连接中断java.io.IOException: handshake failed - connection prematurally closed at com.sun.tools.jdi.SocketTransportService.handsha...原创 2018-08-10 14:13:35 · 2052 阅读 · 0 评论 -
使用WebView的注意事项(加载视频播放页)
如下是最近在搞webview播放视频,全屏切换需求的总结,供同仁参考,避免踩坑,提高工作效率,早点下班,丰富个人生活!webview生命周期方法应用前后台切换时,相应Activity生命周期方法中要调用webview的onResume与onResume的方法,否则应从前台切换到后台后视频还是在播放的,还有声音的。loadUrl与postUrl的区别loadUrl与PostUrl的最...原创 2018-08-01 14:43:19 · 3568 阅读 · 0 评论 -
不通过R类获取自定义样式资源ID数组
本文是最近工作上帮忙其它“同事”处理问题的产物,纯属现学现买,供遇到同类问题的同仁参考!需求描述不引用R类获取到自定义样式的值(资源id数组),如下是R.java中某个自定义样式的值public static final int[] LoadingView = { 0x7f0200ac, 0x7f0200c5, 0x7f0200cd, 0x7f0200ce, 0x7f0200cf };...原创 2018-07-28 11:11:44 · 464 阅读 · 0 评论 -
不通过R.jav类仅通过字符串名称获取各类资源
如题,是一个“老生长谈”的主题,但这里还是以最近工作上处理相关的问题以及过程中的学习经验梳理一下相关的知识点需求来源相关知识进阶使用参考资料...原创 2018-07-28 10:55:20 · 895 阅读 · 0 评论 -
通过AS直接查看APK的resources.arsc文件(应用资源表)
如题在分析R文件和其对应的应用资源表的相关问题,或研究andorid资源合并编译打包逻辑到有查看应用资源表结构和内部的信息,可以直接通过AS(Android studio)来操作。 ...原创 2018-07-28 10:29:59 · 7991 阅读 · 0 评论 -
有关Android编译相关知识点的文章
最近这两周的工作内容都跟Android的编译打包,APK的反译有关,现学现用解决工作上遇到的问题了,如下是资源搜索过程中觉得后续总结与深入学习时需要的 API 级别在 Android 中的使用Android targetSdkVersion 原理compileSdkVersion、minSdkVersion、targetSdkVersion详解 - CSDN博客 搞清minSDKV...原创 2018-07-20 11:47:43 · 449 阅读 · 0 评论 -
如何在gradle脚本中判断运行时的系统
方法1:获取os的name判断其中是否包含系统关键字段判断是否为window系统的代码示例如下def isWindows() { return System.properties['os.name'].contains('windows');}方法2:通过OperatingSystem类中的方法来判断当前环境判断是否为window系统的代码示例如下def is...原创 2018-07-03 14:00:37 · 4022 阅读 · 0 评论 -
使用https://github.com/jaredrummler/AndroidProcesses库遇到的崩溃问题的“探索”
AndroidProcesses库是jared rummler大神的双一杰作http://jaredrummler.com/,该库简单来说是通过读取/proc/pid/目录下的文件,获取对应进程的信息,具体功能移动至 https://github.com/jaredrummler/AndroidProcesses最近我们项目中使用该库,线上收集到相关的崩溃信息如下(精简过后的backtrace原创 2017-06-27 13:42:33 · 2828 阅读 · 0 评论 -
尽量少使用全局变量或全局单例,特别在Android开发过程中
参与过的很多项目会经常处理由于全局变量的状态值错乱引发的奇怪Bug,以及过多的使用全局单例导致内存的泄漏。代码模块相互交插引用,模块之间没有分界的概念,影响代码的维户与后续的代码重构(分层)。 今天分析了项目的历史 BUG,也是跟全局变量有关。大概的原因是一个全局变量的状态没有reset到合适的状态,在应用启动时(打开主 Activity)处理启动流程的过程中没有走到(显示)合适的界面(Frag...原创 2018-06-03 00:06:22 · 2183 阅读 · 0 评论 -
使用LayoutInflater的inflate方法的注意事项
获取LayoutInflater实例的常规方法//方法1LayoutInflater layoutInflater = LayoutInflater.from(context); //方法2LayoutInflater layoutInflater = (LayoutInflater) context .getSystemService(Context.LAYO...原创 2018-06-04 21:07:49 · 584 阅读 · 0 评论 -
Android部份源码下载
部份源码很多情况下我们只关注Android源码的部份组件,所以只clone某个组件的代码仓库即可 如clone framework的仓库git cloen https://github.com/aosp-mirror/platform_frameworks_base.git注:各个组件/模块的代码仓库地git上或官网仓库找即可!参考资料git上的镜象google官网...原创 2018-06-12 19:06:47 · 591 阅读 · 0 评论 -
Android优秀资料收藏贴
图解Android - Android GUI 系统 (1) - 概论*原创 2018-06-12 20:24:11 · 168 阅读 · 0 评论 -
android:layout_gravity 和 android:gravity 的区别
Android开发必遇问题,最有可能忘记两者之间的区别的问题之一 如下是Google搜索出来的结果 记忆方法联想/形像記法 * 利用成员变量的属性记录,gravity是类的成员变量,自然就是控制子节点的排版效果,设置自己内部的排版重心,即排版内部子类的参数。排版它人的重心(主动) * layout_gravity的前缀有layout,即属于LayoutParams类的属性值,然后L...原创 2018-06-05 21:04:20 · 5175 阅读 · 0 评论 -
工欲善其事,必先利其器之—搭建Android(apk)的反编译环境
反编译流程这里仅关注java代码的反编译 步骤 工具 apk(zip) -> dex代码 更改后缀名为.zip后用图形功能解析或直接命令行下unzip命 dex代码 -> jar代码(class文件 可选工具 dex2jar jar代码 -> java代码 可选工具 jd-gui工具安装* 前提jav原创 2018-06-13 20:01:40 · 2220 阅读 · 0 评论 -
Android开发填坑之Bilibili视频页(移动版)的scheme跳转支持
问题现象打开Bilibili视频播放页,如https://m.bilibili.com/video/av23921215.html,正常打开该页面,但过一二秒后页面白屏。根本原因Bilibili视频放页的JS脚本会尝试跳转到一个地址,关键代码如下 该href的一个实例如下:bilibili://video/23921215?h5awaken=cHZpZD0zOTY3NzhCM...原创 2018-06-13 20:44:54 · 7299 阅读 · 2 评论 -
工欲善其事,必先利其器之—Android 反编译利器-jadx
工具介绍工具安装参考资料github jadx反编译工具JadxAndroid 反编译利器,jadx 的高级技巧原创 2018-06-13 20:52:35 · 727 阅读 · 0 评论 -
拉起抖音APP视频页的scheme
拉起scheme地协议snssdk1128://aweme/detail/6534452667488406792?refer=web&gd_label=click_wap_detail_download_feature&appParam=%7B%22__type__%22%3A%22wap%22%2C%22position%22%3A%22900718067%22%2C%22p...原创 2018-06-22 13:55:10 · 36750 阅读 · 12 评论 -
Android开发填坑之setUseWideViewPort
现象项目中的“浏览器组件”(对Webview的封装,用于浏览网页)在加载bilibili个人主页(https://m.bilibili.com/space/26233856)时排版错乱。 效果如下图所示: 正常的效果如下图所示:(使用chrome UA换成Android的UA) 分析使用对比法看看其它浏览器(Anroid chrome,手机自带浏览顺,UC浏览器)的效果,都正...原创 2018-06-07 20:08:19 · 13626 阅读 · 0 评论 -
Android开发踩坑之PopupWindow "Unable to add window -- token null is not valid; is your activity running"
问题现象关键崩溃的BS如下:android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? at android.view.ViewRootImpl.setView(ViewRootImpl.java:...原创 2018-06-22 15:52:40 · 5394 阅读 · 0 评论 -
工欲善其事,必先利其器之—Android 反编译利器-classyshark
介绍 Android-classyshark,Google出口必属精品,你值得拥有! classyshark的优点: * 直接打开并反编译dex、apk、jar、arr * 图形化操作,方便查看各类文件信息,方法类占比情况等 * 支持代码的增量搜索安装直接下载jar包,放在本地目录。我的习惯是放在如下本地目录(home/dev_tool/),并设置相关的快捷访问方式(注里要...原创 2018-06-15 11:12:48 · 1591 阅读 · 0 评论 -
ViewSwitcher的使用
文档的说明ViewSwitcher的api文档 >>ViewAnimator that switches between two views, and has a factory from which these views are created. You can either use the factory to create the views, or add them...原创 2018-06-08 23:39:08 · 2115 阅读 · 0 评论 -
ViewSwitcher的源码学习
类继承关系 从如上图的继承关系上看,主要是利用了继承的策略来实现种(扩展)View切换的功能代码分析ViewAnimator继承了FrameLayout类再聚合了两个动画实例,具备了基本的View的切换能力提供对View的插入、删除、显示的方法提供对View的切换出场与入场动画的getter与setter提供顺序的显示View的方法showNext()对于的View...原创 2018-06-09 16:12:01 · 253 阅读 · 0 评论 -
Android开发填坑之自定义User-Agent(UA)
问题现状我们应用的浏览器组件打开抖音的某个视频播放页(如https://www.iesdouyin.com/share/video/6537198229467958531/),返回的是PC版的页面,效果如下所示 在之前的分享中,我有提过页面排版效果的问题几乎是UA的问题,所以第一时间切换UA看看是什么效果先!(如下是切换Android KitKat webview的UA) 注...原创 2018-06-19 19:40:36 · 9803 阅读 · 0 评论 -
Android开发踩坑之showAsDropDown
showAsDropDown有兼容性问题!!具体原因与解决方案参考:处理PopupWindow在Android 7.x中兼容性问题需要花时间阅读下相关代码!原创 2018-05-10 22:59:48 · 1681 阅读 · 0 评论