自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

怪咖先森的博客

小蜗牛,慢慢爬

  • 博客(373)
  • 资源 (4)
  • 收藏
  • 关注

原创 写给还在迷茫中挣扎的你

有一天你将破茧成蝶,成长的比人们期待的还要美丽,但这个过程会很痛苦,会很辛苦,有时候还会觉得很灰心。面对汹涌而来的现实世界,觉得自己渺小无力,这也是生命的一部分,做好现在你能做的,然后一切都会好的。...

2016-11-25 22:47:45 671

原创 Mac 上配置 ./gradlew环境

背景需要查看 Android studio 中项目里的 app:dependencies, 命令如下:./gradlew :app:dependencies1. Install Gradle Build Tool具体过程参考官方文档:How to Set $JAVA_HOME environment variable on macOSGradle Installation 官方文档对我而言,主要就是:brew install gradle2. gradle 查看包的依赖关系参

2021-12-05 08:47:47 5179 4

原创 Android 内存泄漏检测开源库LeakCanary 研究

1. Android 内存现状Facebook 有一个叫 device-year-class 的开源库,它会用年份来区分设备的性能2. Android 内存空间会引发的问题PSS : Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)PSS相对于RSS计算共享库内存大小是按比例的。N个进程共享,该库对PSS大小的贡献只有1/N。VSS : Virtual Set Size 虚拟耗用内存(包含共享库占用的内存),即单个进程全部可访问的地址空间,其大小

2021-09-01 07:29:10 5104

转载 Android View 绘制流程

1. 概述2. 什么是 ViewRootImpl1. 概述简单的可以说,如 measure,layout,draw 分别对应测量,布局,绘制三个过程深一些可以引申出 Handler,同步屏障,View 的事件传递,甚至 activity 的启动过程总体而言,Android 的绘制基本可以分为顶级 View 的绘制Viewgroup 的绘制View 的绘制三个方面顶级 View 就是 ViewrootImpl现在从以下问题开始来了解 Android View 的绘制流程2..

2021-07-05 21:08:19 5354

原创 Tencent/matrix错误:Cause: need sign apk but apksigner *\Sdk/build-tools/*/apksigner was not exist

apkCheckerPath = "${project.configurations.apkCheckerDependency.resolve().find { it.name.startsWith("matrix-apk-canary") }.getAbsolutePath()}"sevenZipPath = "${project.configurations.sevenZipDependency.resolve().getAt(0).getAbsolutePath()}"//Notice: You

2021-06-30 20:46:21 4971 2

原创 探究 Android MVC、MVP、MVVM 的区别以及优缺点

面试题:说一下对 MVVM 的了解面试题:为何使用 Android Jetpack?MVVM面试题:说一下对 MVVM 的了解举例说明,好证明自己确实对 MVVM 有着正确、深入的理解eg:分析为什么使用 MVVM,它相对于其他MVP这类架构师如何解决你的项目问题的,另外,还要回答jetpack使用过程中遇到的坑是怎样的。最后,面试官估计会问你对各种架构的选择的对比原则之类的哦面试题:为何使用 Android Jetpack?快速开发组件可以单独采用(不过这些组件是为协同工作而构建的),.

2021-06-30 13:48:01 7711

原创 解决 windows 文件被占用的问题 -- The action can‘t be completed because the folder is open in another program

问题今天要删一个文件但是删不掉,一直提示我文件被占用:The action can’t be completed because the folder is open in another program真的烦,想删还不能删,淦虽然重启可以解决这个问题,但是我不服,我就是要看看哪个孙子干这事解决方法打开 windows 资源管理器 – Resource Monitor输入被占用文件名称,不带后缀关掉所有 chrome 浏览器后还是不能删除文件,资源管理器底部还有一堆 ch

2021-06-29 15:54:01 5918

原创 深入分析 Handler 内存泄露

1. 在 Activity 中直接使用 Handler 时候编译器警告内存泄漏1.1 Javapublic class SampleActivity extends Activity { private final Handler mLeakyHandler = new Handler() { @Override public void handleMessage(Message msg) { // ... } };}在实际编写中,我们往往会得到如下

2021-06-29 11:05:56 4581

原创 GC 回收机制

1. 概述1.1 什么是垃圾1.2 可达性分析1.3 GC Root 对象1.4 什么时候回收2. 垃圾标记算法2.1 引用计数算法2.2 根搜索算法3. 清除算法3.1 标记-清除算法3.1.1 小结3.2 复制算法3.2.2 小结3.3 标记-压缩算法4. JVM分代回收策略4.1 新生代4.2 老年代5. GC Log 分析6. Java 四种引用7. Android 中的内存抖动8. 参考链接1. 概述1.1 什么是垃圾所谓垃圾就是内存中已经没有用的对象。 既然是”垃圾回收",那就必须知道.

2021-06-22 10:52:41 4777

原创 UI 渲染流程及优化

CPU 与 GPUXML 布局显示到屏幕的流程优化渲染过程过度绘制UI 优化解决方案CPU 与 GPUCPU 作为 中央处理器,除了要负责逻辑计算以外,还需要做内存管理,显示操作,因此随着各种复杂 App 的出现,其实际运算的性能会大打折扣设计原由:为了提高图形显示效率以及复杂的图形,设计出了 GPU主要功能:为了帮助 CPU 分担图形显示XML 布局显示到屏幕的流程优化渲染过程过度绘制布局嵌套会答复拖慢界面的加载,这种拖慢的原因在于各种 Layout 的重复测量这让布局层级的数.

2021-06-22 07:49:40 4541

原创 Activity、Window、View 之间的关系

1. 什么是ActivityActivity 并不负责视图控制,它只是控制生命周期和处理事件。真正控制视图的是 Window。一个 Activity 包含了一个 Window,Window才是真正代表一个窗口。Activity就像一个控制器,统筹视图的添加与显示,以及通过其他回调方法,来与 Window、以及 View 进行交互。2. 什么是WindowWindow 是一个抽象类,实际在 Activity 中持有的是其子类 PhoneWindow。PhoneWindow 中有个内部类Decor

2021-06-21 22:29:23 5104

原创 HandlerThread

1. Source code 概述2. HandlerThread 应用场景参考链接1. Source code 概述HandlerThread 是一个带有 looper 的线程, looper对象可以用于创建 Handler类来进行来进行调度,而且start()方法必须被调用。在 Android 开发中,不熟悉多线程开发的人一想到要使用线程,可能就用 new Thread(){…}.start() 这样的方式。实质上在只有单个耗时任务时用这种方式是可以的,但若是有多个耗时任务要串行执行呢?那不得要.

2021-06-21 14:35:46 4333

转载 理解 Android Context

1. 概述1.1 Context1.2 ContextWrapper1.3 ContextThemeWrapper1.4 Application1.5 Service2. 组件初始化 -- Activity3. 创建ContextImpl3.1 createBaseContextForActivity3.2 createAppContext3.4 ContextImpl初始化4. Context attach过程5. 总结5.1 组件初始化5.2 Context attach过程5.3 Context使.

2021-06-20 13:59:29 4469

原创 LeakCanary 2.7 原理分析

1. LeakCanary 初始化我们直接引入依赖即可,无需代码初始化,LeakCanary 会在 app 初始化时自动初始化自身。debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' Application->attachBaseContext =====> ContentProvider->onCreate =====> Application->onCreate ===

2021-06-16 18:10:14 6174 5

原创 Android 虚拟机进化史

Android 虚拟机进化史1. 按时间顺序开始介绍吧Dalvik or ART?Android 诞生之初 ——> 单纯的 DalvikAndroid 2.2 ——> JIT 首次登场JIT 的缺点Andorid 4.4 ——> ART 和 AOTAndroid 5.0 ——> ART 全面取代 Dalvik(只有 AOT)Android 7.0 ——> JIT 回归2. ART 相对 Dalvik 的优缺点3. 相关概念ARTDalvikDalvik 和 ART 的区别1.

2021-06-11 10:36:51 6347 1

原创 Handler 如何实现线程间切换

例如现在有A、B两个线程,在A线程中有创建了handler,然后在B线程中调用handler发送一个message。当在A线程中创建handler的时候,同时创建了MessageQueue 与 Looper你在子线程向主线程发消息,这个 mMainHandler 是在主线程初始化的,意思是用了主线程的 Looper.loop(), Looper 在主线程中调用 loop 进入一个无限的 for 循环从 MessageQueue 中取消息子线程调用 mMainHandler 发送一个 mess

2021-05-30 10:08:45 6210 2

原创 Android 点击 App icon 发生了什么?

Gityuan – startActivity启动过程分析点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;system_server 进程接收到请求后,向 zygote 进程发送创建进程的请求;Zygote 进程 fork 出新的子进程,即 App进程;App进程,通过 Binder IPC向 sytem_server 进程发起 attachApplication 请求;system_server 进程在收.

2021-05-29 22:36:03 4819

转载 Android 中为什么主线程不会因为 Looper.loop() 里的死循环卡死?

来自知乎的问题,一直没搞明白,今天好好梳理一下知乎原文 ==》 Android中为什么主线程不会因为Looper.loop()里的死循环卡死为什么主线程不会因为 Loop 死循环里卡死1. 问题2. 需要的知识背景3. Android中为什么主线程不会因为Looper.loop()里的死循环卡死?4. 没看见哪里有相关代码为这个死循环准备了一个新线程去运转?4.1 主线程的死循环一直运行是不是特别消耗CPU资源呢?5. Activity的生命周期是怎么实现在死循环体外能够执行起来的?1. 问题a

2021-05-29 19:47:08 4569

原创 APT 及实现ButterKnife

了解 APT 的相关知识,相信手动实践后你会更容易理解像 Dagger、ARouter、ButterKnife 等这种使用了编译时注解的框架,也更容易理解其内部源码实现,内容如下:编译时和运行时注解注解处理器APTAbstractProcessorElement和Elements自定义注解处理器使用自定义注解处理器编译时和运行时注解1. 译时和运行时注解先了解一下编译时和运行时的区别:编译时:指编译器将源代码翻译成机器能够识别的代码的过程,Java 中也就是将 Java 源代码编

2021-05-29 13:52:43 4555

原创 5 道刁钻的 Activity 生命周期问题

1. A Activity 打开 B Activity 时都有哪些生命周期回调1.1 standard 且无可复用实例A.onPause -> B.onCreate -> B.onStart -> B.onResume -> A.onStop 这仅在 B Activity 的 launchMode 为 standard 或者 B Activity 没有可复用的实例时是这样的。1.2 singleTop 已经在栈顶时当 B Activity 的 launchMode 为

2021-05-27 14:14:43 4520

原创 Android 如何 catch 程序中的异常呢?

1. 先从 Thread.setDefaultUncaughtExceptionHandler 说起我们先定个小目标,把 App 里所有的 Crash catch 住,防止 app crash.1.1 简单实现 Thread.UncaughtExceptionHandler 接口看看效果//定义CrashHandlerclass CrashHandler private constructor(): Thread.UncaughtExceptionHandler { private var

2021-05-27 13:11:24 4732

原创 Binder 核心原理分析(一)

这里写目录标题1. 什么是 Binder?2. Binder 简单例子3. Binder 由来3.1 传统 Linux 提供的进程间通讯方式优劣3.2 传统管道通信3.3 所以 Android 为什么用 Binder 做为进程间通信机制呢?4. Binder 四个重要角色4.1 Binder驱动 和 Binder5. Binder 四个重要对象5. Binder 通信机制流程6. Binder 架构设计1. 什么是 Binder?Binder 是 Android 中特有的一种跨进程通信方式,它模糊了进程

2021-05-27 00:19:13 365

原创 Android intent 传递数据的大小限制

我们知道可以通过 Intent 和 bundle 在 activity 或 fragment 间进行通信,但是 Intent 传递数据时,如果数据太大,可能会出现异常。1. Intent 传递不同大小数据时的问题Activity间通过Intent传递数据的大小限制 – 具体数据博客学Android 这么久,intent传递数据最大多少呢?传 512K 以下的数据的数据可以正常传递。传 512K~1024K 的数据会出错,闪退。传 1024K 以上的数据会报错:TransactionTooLar

2021-05-26 07:15:48 864

原创 Android Handler 同步屏障

参考链接Android筑基——可视化方式理解 Handler 的同步屏障机制每日问答 Handler应该是大家再熟悉不过的类了,那么其中有个同步屏障机制,你了解多少呢?Android Handler 源码分析揭秘 Android 消息机制之同步屏障:target==null ?简单理解异步消息相比同步消息要优先执行,好比 :当一堆人在排队进周杰伦演唱会时候,周杰伦来了,就通知保安,周杰伦来了,于是优先给周杰伦进去,等周杰伦进去后,其他人再按顺序进去专业解释就是:当开启了同步障碍时

2021-05-25 13:40:02 379

原创 sun.security.validator.ValidatorException: PKIX path building failed...

error msgCould not resolve all dependencies for configuration ':app:devDebugRuntimeClasspath'.Could not determine artifacts for androidx.swiperefreshlayout:swiperefreshlayout:1.0.0Could not get resource 'https://dl.google.com/dl/android/maven2/androidx/

2021-03-31 21:33:41 341

原创 More than one file was found with OS independent path ‘lib/x86/libc++_shared.so‘

参考链接More than one file was found with OS independent path ‘lib/x86/libc++_shared.so’Solutionandroid { packagingOptions { pickFirst 'lib/x86/libc++_shared.so' pickFirst 'lib/arm64-v8a/libc++_shared.so' pickFirst '

2021-03-31 21:27:01 525

原创 Android 中为什么主线程不会因为 Looper.loop() 里的死循环卡死?

Looper.loop 死循环分析问题分析参考链接问题app 程序入口中为主线程准备好了消息队列而根据 Looper.loop() 源码可知里面是一个死循环在遍历消息队列取消息而且并也没看见哪里有相关代码为这个死循环准备了一个新线程去运转,但是主线程却并不会因为Looper.loop() 中的这个死循环卡死,为什么呢?分析对于线程既然是一段可执行的代码,当可执行代码执行完成后,线程生命周期便该终止了,线程退出。而对于主线程,我们是绝不希望会被运行一段时间,自己就退出,那么如何保证能一直存活

2020-12-30 13:48:58 375 1

原创 2020-12-16

这里写目录标题一级目录二级目录三级目录一级目录二级目录三级目录能否让APP永不崩溃—小光与我的对决Github Cockroachme – Android Crash 原理分析me – Android app 崩溃 & Crash 分析(一)me – Android app 崩溃 & Crash 分析(二)奇怪的 TimeoutExceptionme – Android Crash框架Recoveryme – ADB(一) 模拟应用被杀掉

2020-12-16 14:02:35 111

原创 kotlin companion object

kotlin 没有 java 对应的 静态方法,但提供了 companion object@Jvmstatic 注解companion objectfun main(args: Array<String>) { StringUtils.isEmpty("===")}class StringUtils{ companion object{ fun isEmpty(str: String): Boolean{

2020-12-13 21:33:40 2367

原创 kotlin 高阶函数的注意事项

高阶函数的注意事项 高阶函数的定义在 kotlin 中,函数是 "一等公民"注意用内联优化代码高阶函数的定义函数(or lambde) 的参数又是 函数(or lambde),这样的函数我们称之为高阶函数fun main(args: Array<String>) { onlyif(true){ println("print log") }}fun onlyif(isDebug: Boolean, block:() -> Unit){ i

2020-12-12 21:53:17 344

原创 耗电优化(下):耗电的优化方法与线上监控

2020-12-11 15:23:14 349

原创 耗电优化(上):Android App 耗电分析

这里写目录标题1. 电量和硬件1.1 App 通过使用硬件模块消耗相应的电能1.2 资源调度机制是厂商功耗优化最重要的手段2. 电量和应用程序2.1 评估不同应用程序的耗电情况结论:把电量的测量转化为功能模块的使用时间或者次数2.2 尽可能准确的测量电量bug report结合 `Battery Historian` 是最好的排查方法3. Android 耗电的演进历程3.1 野蛮生长:Pre Android 5.03.2 逐步收紧:Android 5.0~Android 8.03.2.1 Android

2020-12-11 15:13:10 3297 1

原创 kotlin 的简洁性

kotlin 的简洁性1. 化空对象的处理(防止空指针)2. 属性访问,代替 `Get/Set` 方法3. 默认构造函数4. 对象属性调用简化(使用with、apply、let等)5. 安卓自动绑定xml文件中控件定义6. 简化Parcelable实现7. 简化单例对象构造8.使用字符串模版简化字符串拼接9. 使用 `when`进行分支判断(替代Java中 `switch`)10. 解构对象(Destructuring Declarations)(Java无此高级玩法)11. 协程coroutines12.

2020-12-07 10:41:50 198

原创 2020-12-05 杂感

我站在岸边,一艘船从我面前杨帆启航了。它迎着晨风,驶向蔚蓝的大海,英姿勃发,魅力无边。我站在那里,目送着它离去。直到它变成烟云中一粒白点,没入海天一色的远方。— 亨利·范戴克...

2020-12-05 20:39:55 183

原创 TextView 太长如何保持与 ImageView 在同一行显

实现效果: 左侧文字,右侧 icon文字短的时候,icon 仅靠 text文字长的时候,text 换行,icon 在右侧 <TextView android:id="@+id/chargingTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="24dp"

2020-11-04 13:43:10 730

原创 Android H5拉起 app

工作较忙,暂做记录,稍后整理最后采用的方案参考 openinstall 实现方式:<script type="text/javascript"> //OpenInstall初始化时将与OpenInstall服务器交互,应尽可能早的调用 /*web页面向app传递的json数据(json string/js Object),应用被拉起或是首次安装时,通过相应的android/ios api可以获取此数据*/ var data = OpenInstall.parseUrlParams

2020-10-14 09:56:17 2836

原创 2020-09-02

1. 电脑和手机文件互相传输把电脑上的文件传送到手机adb push D:\1\test.txt /data/local/tmp把手机上的文件传送到电脑adb pull /data/local/tmp/test.txt D:/1/6pull 出包下的所有文件这里以 /data/data/ 目录下的 demo2.jni.com.myapplication 包 pull 到电脑 D:/3 目录下 为例adb shell #进入手机系统su

2020-09-02 17:16:19 107

原创 Android 调试 WebView 网页

记录一下1. 调试微信网页chrome 调试微信网页2. 利用 chrome 浏览器(需 FanQ)Get Started with Remote Debugging Android Devices3. 离线包的解决方案Android的WebView调试工具(无需浏览器,无需FanQ)

2020-09-02 11:15:03 331

原创 一些有趣的资源搜索网站

1. 软件介绍2. 软件下载3. 软件配置4. 参考链接1. 软件介绍Android Killer是一款可以对 APK 进行反编译的工具,它能够对反编译后的Smali 文件进行修改,并将修改后的文件进行打包。2. 软件下载看雪 – Android 在线破解版下载昨夜星辰2012 吾爱大神更新的整合版提取码:tfdo解压密码:www.52pojie.cn3. 软件配置这里由于软件中的 Apktool 的版本太低可能导致 apk 的反编译失败,未检测到资源文件,(\smali\.

2020-07-24 09:42:29 4783 1

原创 在git中删除指定的文件和目录

具体操作#拉取远程的 `Repo` 到本地(如果已经在本地,可以略过) $ git clone xxxxxx#在本地仓库删除文件 $ git rm 我的文件#在本地仓库删除文件夹 $ git rm -r 我的文件夹/#此处-r表示递归所有子目录,如果你要删除的,是空的文件夹,此处可以不用带上-r#提交代码 $ git commit -m"我的修改"#推送到远程仓库(比如GitHub) $ git push origin xxxxxx补充: git rm$ git rm -

2020-06-08 20:31:32 3155

针对 VS MSBuild 不能正确检测字符串 “error:”的修正配置

针对 VS MSBuild 不能正确检测字符串 “error:”的修正配置

2018-05-19

microsoft-windows-netfx3-ondemand-package.cab

用与解决错误: Error Code 0x800F081F when Installing .NET Framework 3.5

2018-05-19

Visual Studio 2017 Professional 15.7.0 bootstrapper(安装器), 很小,只有 1.14 M

Visual Studio 2017 Community 15.7.0 Professional(安装器), 很小,只有 1.14 M

2018-05-12

Visual Studio 2017 Enterprise 15.7.0 bootstrapper (安装器)

Visual Studio 2017 Enterprise 15.7.0 bootstrapper(安装器), 很小,只有 1.14 M

2018-05-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除