Android开发之旅
文章平均质量分 62
此专栏除了记录后续Android开发过程中的实践,同时还会总结之前的开发经历(包括遇到的坑),此专栏的一系列文章希望能给大家提供交流的主题,引起大家的讨论,彼此之间多交流,共同进步。谢谢!
喜欢踢足球的老罗
0)不忘初心, 方得始终;
1)知其然,知其所以然;
2)工欲善其事,必先利其器
3)路曼曼其修远兮,吾将上下而求索;
展开
-
RN开发搬砖经验之—处理“Duplicate class com.github.barteksc.pdfviewer“
哇哦,搞Android开发经常遇到的问题,这类问题不大,先分析好相关的依赖,然后排除冲突。原创 2024-03-22 21:17:13 · 456 阅读 · 0 评论 -
mac命令行下计算文件SHA-256散列值
从国内的第三方网站下载了Android sutiod的zip包,为了安全起见还是得跟Android官网上的对应的zip包的SHA值做下对比。以前是经常使用md5命令的,所以理论在命令行下应该是有对应的命令行工具可以计算SHA值的。后来搜索到可以用 shasum命令来完成我的需求。我们man一下shasum命令,原创 2024-02-28 13:20:43 · 859 阅读 · 0 评论 -
查看阿里云maven仓中某个库有哪些版本
经分析是有调到VODSVideoUploadClientImpl的cancel方法,然后就调AliyunVodAuth的cancel方法![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/291365b6a3a94a13a53eb9daedc68a51.png在看下183行onError方法中的代码吧!额外简单评价下相关的代码逻辑哦,有点发散了,收敛回来一下!原创 2024-01-31 12:09:34 · 693 阅读 · 0 评论 -
Android 13以上版本读写SD卡权限适配
如题,最近工作上处理的问题,把解决方案简单逻列出来,供有需要的朋友参考之。原创 2024-01-29 19:30:30 · 1545 阅读 · 0 评论 -
360加固APP后启动崩溃—注意加固前后签名是否一致
如下截图所示,我今天就是遇到了这个问题,这个问题是比较好解决,但如果官网有显眼指引说明会不会对开发者更友好些呢?首先我们给360的加固包是带有自己的签名的,然后经360加固过后(免费的加固服务),输出的包是没有签名的,所以我们就需要再重新签名一次,这时候就要注意了,前后签名的keystore要用同一个。不然一启动就崩溃/点击应用标图没有响应的感觉,应用主Activity都没机会显示。原创 2023-10-31 19:07:49 · 846 阅读 · 0 评论 -
RN Android开发过程中截图的最简单最快捷方式
最简单、方便、快速的方法是自己写段shell 代码来截图片,不然打开AS首先会很快,然后AS又很占内存的!原创 2023-10-30 10:17:57 · 134 阅读 · 0 评论 -
Android versionCode会变成指定数值加001、002、003等后缀
活久见”—今天得到个奇怪的问题,指定的versionCode最终在打包出来的apk中,versionCode变成(指定数值+ 00X的形式)官网文档有关的说明:原来是为不同架构的同一个版本配置不同的versionCode,之前还没有注意到这点!arm64-v8a的apk包,versionCode会变成 27003,即 配置versionCode 为27时,后来搜索代码,发现原来是这个配置导致。原创 2023-10-16 19:26:34 · 287 阅读 · 0 评论 -
【cocos源码学习】cocos2d-x-4.0 Android Demo工程构建产物的简析
如标题所示,内容很少,但是可以从中了解相关的技术点,还有一些代码、脚本分析的技巧吧原创 2022-12-14 19:36:20 · 595 阅读 · 0 评论 -
【cocos源码学习】cocos2d-x-4.0 Android Demo工程结构的简析
如标题如示,没有什么很干货的内容,但确实是很基础很重要的学习cocos的知识点原创 2022-12-11 18:10:24 · 960 阅读 · 0 评论 -
【cocos源码学习】解决cocos2d-x-4.0 Android Demo构建遇到的问题
解决cocos2d-x-4.0 Android Demo构建遇到的问题原创 2022-12-03 18:42:45 · 1368 阅读 · 0 评论 -
新版Logcat体验与分享—NEW Logcat in Android Studio Dolphin
Android Studio 新logcat的体验与分享原创 2022-11-02 19:49:24 · 920 阅读 · 0 评论 -
【用示例学习与理解C++系列】eventfd与epoll的使用
Android开发环境下用一个简单的示例来学习eventfd结合epoll的使用,对理解Android hander的实现机制有帮忙原创 2022-10-17 12:19:51 · 1737 阅读 · 0 评论 -
在开发或调试IP直接方案时需要注意Host的值跟直接的IP要一致
如题,如果不一致可能会遇到502或其它认验失败的情况,不管是http还是https都要注意这个问题!在http的场景下可能服务侧的Nginx会配置规则,如允许IP直接但Host字段值必须跟IP匹配,即Host是IP对应的域名......原创 2022-07-22 18:39:37 · 444 阅读 · 0 评论 -
【注意/切记】 Android JIN开发过程中不要把long当jlong使用
C/C++ 调Java方法时直接把long类型的变量,传给CallStaticVoidMethod导致对应的Java静态方法接收到了错误的long值PS: 实际的业务场比较复杂,浪费了好多时间去分析才定位到是这个基础的,但容易忽略的问题!!!armv7架构下long是32位,jlong是64位,所以JVM去读取就读到了函数栈中其它的内存空间的值!得到了一个异常的值,并赋给了java代码中的long变量。目前大家的手机都是armv8的,所以开发调试的时候一般都是构建了armv8的包,导致没有第一时间发现异常原创 2022-07-08 19:03:28 · 1410 阅读 · 3 评论 -
华为手机通过adb安装APK提示“签名不一致,该应用可能已被修改”
如题,原因是鸿蒙系统的手机默认是开启纯净模式的,在该模式之下开发包(没有签名的)是无法通过adb安装的原创 2022-06-20 17:08:21 · 14209 阅读 · 0 评论 -
处理JNI DETECTED ERROR IN APPLICATION: GetStringUTFChars received NULL jstring的崩溃 case 要注意实际的调用栈
GetStringUTFChars received NULL 的问题分析要注意实际的崩溃堆栈原创 2022-04-20 18:57:01 · 4081 阅读 · 0 评论 -
Message的消息池(sPool)
关键总结1、消息池缓存有可复复使用的消息实例,可以重复使用消息实例,避免过多的创建与回收消息消息实例2、消息池是后一个栈(LIFO/FILO=后进先出/先进后出)的数据结构,具体的栈的数据存放是采用了链表方式组织3、消息池一开始是空的,需要主动添加消息进入缓存池,然后供后续的取出与使用,消息池的长度是有限制的,这样可以避免缓存过多的对象,导致内存占用过多,尽可能的避免内存泄漏3、消息入队列时会被设置为已经在使用的状态,消息从消息列表取出被消费后会放入消息池,大多数情况下我们是不会主动调Message原创 2021-12-23 23:40:32 · 2232 阅读 · 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 · 2191 阅读 · 0 评论 -
【温故而知新】Android 消息机制/HandlerThread、Looper、Handler 的前置知识点
有关于Android消息机制的复习与分享,温故而知新的总结与交流,大家感兴趣可以看下,交流交流,写得不对的地方讲大家指正,谢谢原创 2021-12-07 19:39:09 · 2021 阅读 · 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 · 2439 阅读 · 0 评论 -
gradle学习笔记
gradle是基于groovy脚本语言的,所以在学习gradle之前还得先学习一个groovy的基础。JVM与groovy、java code的关系可以简单理解为,groovy与java代码都会编译为java字节码,然后在JVM上运行。groovy就像python一样,是一种动态脚本语言。还有就是groovy代码中可以直接调用java代码,可以直接引入与使用jar原创 2021-09-09 16:28:55 · 194 阅读 · 0 评论 -
Android native开发需要注意native线程的Detach
在跨平台开发的过程中,通常跨平层/C++会创建native线程,如果创建的native线程运行的代码有调用到Java层接口(跟java层有交互),即有调到了AttachCurrentThread,当native线程退出时需要调DetachCurrentThread接口跟JVM世界做分离。否侧为遇到JNI经典崩溃问题之—**Native thread exited without calling DetachCurrentThread**,如果Deatch的处理逻辑写的不好,可能还会继续遇到JNI经崩溃崩溃问原创 2021-08-13 18:04:27 · 1568 阅读 · 0 评论 -
遇到了http响应头中的Server字段为空的“灵异事件“
前言祖传代码坑多是众所周知的事!这不,前段时间就遇到了一个坑,即手撸的httpclient模块遇到响应报名,响应头中的字段值为空时就出现“解析”报名异常,导致没有响应的回调到上层业务!这个httpclient是用c++来写的,用tcp创建连接后发http请求与处理http server的响应。出现该异常时收到的响应报名中Server的值竟然是空值!跟服务器维护同学排查不是自己的web server配置问题后,基本只能是怀疑用户网络连路的某个网关或网络代理搞的鬼—偷偷的追加了Server但该值为空。响应头原创 2021-08-10 13:17:36 · 1461 阅读 · 0 评论 -
Android native开发需要注意[-Wreturn-type],否侧会遇到运行时崩溃
最近在修改一个demo工程的代码时,为了快速去验证几个功能,屏蔽了某个C++类几个方法(声名有返回值的方法)的内容,包括最后return语句。结果是编译正常,但运行时崩溃(不稳定崩溃),具体的原因是没有返回值的函数,返回值是随机的,大概率会遇到空指针与野指针!注:demo项目的编译选项没有添加编译警告!原创 2021-07-07 19:46:44 · 623 阅读 · 2 评论 -
terminating with uncaught exception of type std::length_error: basic_string
terminating with uncaught exception of type std::length_error: basic_string的崩溃原因,以及解决方案原创 2021-06-29 20:08:45 · 2456 阅读 · 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 · 2045 阅读 · 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 · 1236 阅读 · 5 评论 -
Android上使用leaktracer的经验分享
上周使用了LeakTracer来分析我们项目的SDK的内存问题,最终的成效还算可以。工具能正常使用,通过内存泄漏日志文件中的函数调用堆栈,结合查看源代码找到不少的内存使用不当的问题。我的使用场景是:在初始化SDK前调用 leaktracer::MemoryTrace::GetInstance().startMonitoringAllThreads(),启动内存监控。在销毁SDK后再调用leaktracer::MemoryTrace::GetInstance().writeLeaksToFile("/s原创 2020-12-29 17:38:24 · 1485 阅读 · 0 评论 -
breakpad的学习与使用笔记
有关breakpad的学习笔记以及使用过程中的tips分享原创 2020-12-16 14:25:35 · 1803 阅读 · 0 评论 -
【漏洞修复】自定义实现的X509TrustManager子类中..
漏洞说明 /** * 覆盖java默认的证书验证 */ private static final TrustManager[] TRUSTALLCERTS = new TrustManager[]{ new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { r原创 2020-07-27 17:57:25 · 11455 阅读 · 2 评论 -
通过示例去看JNI中为什么使用extern “C“
总结C++的编译示例说明分析过程参考资料原创 2020-06-30 20:41:23 · 798 阅读 · 0 评论 -
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 · 1330 阅读 · 3 评论 -
跟进SharedPreferences ANR的总结
ANR分析最近也跟进了一个SharedPreferences相关的ANR,是主线程读取SP的时(首次读取某个key的值)产生了ANR。ANR 信息如下原因是:SP加载整个文件时比较耗时,导致加载的后台线程被挂起,同时就影响到了主线程的唤醒。即之前要主线程读取某个key时主动await了,它需要SP加载整个文件的线程Notify临时解决方案:在应用启动时主动读取SP的值,提前触发整个...原创 2020-04-27 16:13:45 · 242 阅读 · 0 评论 -
简单分析一个APP的示例
一般我们去逆向一些主流的APP是可以了解到目前的主流“技术”的使用的,以及学习别人一些技术选行等等如下是一些简单的分析示例原创 2020-04-23 21:26:06 · 600 阅读 · 0 评论 -
【工具推荐】Android Studio LayoutInspector 超时错误解决
感谢【笨鸟正飞】分享,特推荐给大家 》》传送门注:可以直接在他的github上下载LayoutInspector.jar包,下载地址他提供的解决方案就自己编译一个LayoutInspector的jar包(把默认的20S改成了),并在命令行环境下使用如下是使用示例,结果生成的后缀为*.li的布局文件,用AS打开即可dw_luogongwu@dw-luogongwudeMacBook-Pro ...原创 2020-04-20 18:04:10 · 2521 阅读 · 0 评论 -
也算踩到了 is 32-bit instead of 64-bit的坑
问题说明这几天主要在做内存分析与解决内存的解释,然后打开了AS的 “Enable advanced profiling”选项注:刚‘接手“的项目,代码都不熟悉,好扯蛋!!!打开这个选项后,触发了一系列的反应,结果是应用一运行就崩溃!!!原因分析去看下自己应用的apk中的so,是怎么样的情况?发现个奇怪的so (ibsupportjni.so),然后当前自己有分析的项目只使用32位的...原创 2020-03-01 16:54:38 · 1902 阅读 · 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 · 6322 阅读 · 1 评论 -
Nexus 5 Android6.0.1 Chrome下载apk失败的原因分析
设备Nexus 5Android 6.0.1版本号 M4B30Z结论chrome下载apk时,少发了一次分段的网络请求分析正常的情况异常的情况原创 2018-08-21 18:11:05 · 2765 阅读 · 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 · 2090 阅读 · 0 评论 -
android仅通过自定义属性id值获取样式自定义属性值
自定义样式属性的使用自定义样式属性一般是使用在自定义UI控件中,自定义样式属性用来扩展UI控件的样式属性。 使用三步曲如下: 1.声明:自定义样式属性 2.使用:在layout文件使自定义控件时,设置自定义样式属性的值 3.解析:在自定义控件的样式属性解析时,读取自定义样式属性的值声明自定义样式属性在values.xml声明CommMyFragmentItem样式属性...原创 2018-08-14 14:26:39 · 3461 阅读 · 0 评论