自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(95)
  • 收藏
  • 关注

原创 Android 编译打包的那些疑问

我们平时都是用 AS 进行打包,这就造成了很多盲点,我们就来看看究竟是咋回事,提前声明这篇文章讲的不全,只讲一些疑惑盲点,需要全面学习的,看老罗的吧,详细的令人发指。我们从结果入手,看看打包完毕的apk里面是啥模样,把.apk 修改成 .zip 解压缩。按图索骥哈哈。image一共五个文件,第一个 AndroidManifest.xml ...

2019-05-27 11:32:00 534

原创 Android性能优化一篇文章搞定

本文由玉刚说写作平台提供写作赞助,版权归玉刚说微信公众号所有原作者:Mr.s(猪_队友)版权声明:未经玉刚说许可,不得以任何形式转载文章之前的一些话:本文尿点比较多,酌情看自己想看的。什么是性能image.png这张图很好诠释了什么性能。快,稳,省,小,这四点很形象的代表了性能的四个方面,同时也让我们知道我们App现...

2018-07-13 11:42:00 2735 1

原创 我对移动端架构的思考

本文由玉刚说写作平台提供写作赞助,版权归玉刚说微信公众号所有原作者:Mr.s(猪_队友)版权声明:未经玉刚说许可,不得以任何形式转载架构就像是一场进化史,根据不同时期的需求,演变出不同的架构,车轮滚滚,到今天,移动端框架百花齐放,让人目不暇接。但是其中的本质是磨灭不了的,换言之根本没有磨灭而是隐藏到了人们所看不到的地方,但是依旧发挥着不可或缺的作...

2018-07-04 08:17:00 7030 1

原创 Android:一张图片占用多少内存(补充修改)

我们在开发Android应用的时候,经常会遇到OOM,加载图片过大,更是在OOM里面占有很大的比重,那么为什么会出现OOM?为啥图片过大就会OOM?图片的大小就是内存里的大小吗?首先第一个问题:为什么会出现OOM?答:为了整个系统的内存控制需要,Android系统为每一个应用程序都设置一个最大内存。超过这个内存数,那么就会OOM 内存溢出...

2018-07-01 10:45:00 1833 7

原创 Android targetSdkVersion你真的了解吗?

先抛出一个问题:我们的应用开发的时候android最新版本是6.0,当一年过去之后,7.0发布了,那么我们的应用在7.0手机上是否还能运行?会奔溃吗?根据我们的实际经验,觉得应该不会奔溃,可能有些功能会有问题,但是具体是那一块呢?又说不太好,这就涉及到了Android的向前兼容的问题了。我们在创建App的时候经常会设置这几个参数android {...

2018-06-15 17:08:00 76684 5

原创 Android Studio + MAT 内存泄露分析

前提 ThirdActivity 已经关闭,回到了MainAcitivity。应该是只有回到了MainAcitivity的。通过 Profiler 看到还有 ThirdActivity,那就是它有内存泄露。image1、首先利用 Profiler GC 打点,下载 hpof。当然也可以在Profiler中查看Activity是否有泄露,但...

2019-06-27 13:28:00 265

原创 不得不学之「 Gradle」 ⑥ 自定义 plugin

学习完毕 Gradle 的基础知识,不来点实战,感觉就像没有学习过啊。那我们就搞一搞实战,一共两个简单的操作。第一,写一个自定义 Plugin。第二,写一个自定义 Transform。自定义 Plugin网上一般都会说三种方法是去创建,咱们就不来那么多虚的,来个一劳永逸的吧,我们直接新建一个工程来写,这个会了,新建 Library 工程 和在 buil...

2019-05-27 11:31:00 282

原创 不得不学之「 Gradle」 ④ Gradle 任务

一、多种创建方式任务这个那么多,其实我们平时用的最多还是闭包的形式。记得太多容易混,别的看到能分别出来这个是创建就可以了。二、多种方式访问任务task 和 taskstasks 其实就是一个数组,根据 task 的名字可以查到。没啥意思。就是方便。用到在深究。tasks['task1']三、分组和描述符group 分类 分组都可以descr...

2019-05-27 11:29:00 191

原创 不得不学之「 Gradle」 ⑤ Gradle 插件

一、插件的作用首先学习这个之前,明确一下,啥是插件?插件的定位是开发实现原纯净系统平台、应用软件平台不具备的功能的程序。打个比方吧,本来卖房,是售楼处和客户的关系,但是有了中介和两者对接,这个中介就是售楼处的插件,符合不同售楼处的规定,提供售楼处没有的功能,比如树一个小黑板,写上 xxx楼xx钱。密密麻麻的。二、插件的作用插件分为两种:应用二...

2019-05-27 11:29:00 192

原创 不得不学之「 Gradle」 ③ 构建脚本基础

其实学到这里,对于 AndroidStudio 里的 Gradle 还是不懂, 好多东西见过 ,可是 不知道具体是干啥的,所以学好基础,到后面再看 Android Gradle 就很简 单了 。我 们接着学习基础。带着疑问去学习。什么是 Settings 文件?什么是 Build 文件?什么是 Project?什么是 Task?我们在 ...

2019-05-27 11:27:00 132

原创 不得不学之「 Gradle」 ② Groovy

进过上一篇 入门篇 之后,我们正式开始学 Groovy。我们这些使用 Java 语言的,学习 Groovy 基本没有难度,不过需要注意一些特性,比如支持「闭包」、支持「DSL」。是一门非常灵活的动态脚本语言。Groovy 没有分号,别不习惯。一、集合List、Set、Map、Queue 挺熟悉吧。一般我们常用 List 和 Map 。def nu...

2019-05-27 11:26:00 184

原创 不得不学之「 Gradle」 ①入门

1、运行 Gradle 文件build.gradle 是 Gradle 默认的构建脚本文件,执行 Gradle 命令的时候,会默认加载当前目录下的 build.gradle 加载脚本文件。当然我们也可以通过 -b 来指定要加载的文件。例如我们新建了一个 build.gradle 文件task hello{ doLast{ printl...

2019-05-27 11:24:00 167

原创 「Leakcanary 源码分析」看这一篇就够了

image.png「Leakcanary 」是我们经常用于检测内存泄漏的工具,简单的使用方式,内存泄漏的可视化,是我们开发中必备的工具之一。分析源码之前Leakcanary 大神的 github ,最好的老师。一、使用1、配置dependencies { debugImplementation 'com.squareup.lea...

2019-02-11 19:02:00 2284

原创 「ButterKnife 源码分析」看这一篇就够了!

「ButterKnife」是 Android 系统的 View 注入框架,极大的便利了我们的开发,对应用的性能基本没有影响,是我们开发中一把尖锐的匕首。<br /><br /><br />-- Mr.S分析源码之前ButterKnife 大神的 github ,最好的老师。一、使用使用的版本是 8....

2019-02-11 19:00:00 1294

原创 EventBus 源码分析

EventBus 源码分析分析源码之前EventBus 大神的 github,最好的老师。一、使用我们在平时都会运用 EventBus 去简化各个组件之间的通信,相信使用了它之后感觉是真的方便了不少,可以有效的对解耦发送方和接收方。无论主线程中调用子线程的方法,还是子线程中调用主线程的方法,我们不必去写繁杂的 Handler ,也省去了内存泄漏等...

2019-01-23 16:27:00 169

原创 View 的事件分发 原理和源码分析

很多人都是学了忘,忘了学,感觉永远也记不住。View 事件分发到底应该怎么学?其实很简单:1、敲代码2、学习原理3、画流程图View 事件分发 其实就4️部分组成1、 dispatchTouchEvent(MotionEvent ev)2、 onInterceptTouchEvent(MotionEvent ev)3、 onTouchEve...

2019-01-07 22:23:00 272

原创 JVM 之 类加载

Java 虚拟机将字节流转化为 Java 类的过程,可以分为三大步骤。1、加载查找字节流,并且据此创建类的过程。将类的.class 文件中的二进制数据读到内存中,将其放在运行时数据区域的方法区里,然后在堆区创建一个 java.lang.Class 对象,用来封装类在方法区内的数据结构。类的加载的最终产品位于堆中的 Class 对象,Class 对象封...

2018-12-30 19:33:00 202

原创 JVM 之 对象的创建

往往越熟悉的其实越陌生我们刚开始学 Java 的时候,就开始用这个 new 命令。一天八百遍的 new 却不知道它默默的为我们付出了什么。所以我们就从 JVM 的角度去看 Java 对象是如何创建出来的。首先说明一下流程,方便下面的理解NO.1 - new当程序计数器 PC 遇到这个 new 指令的时候,首先要做的是去 方法区...

2018-12-30 17:55:00 200

原创 JVM 之 运行时数据区域

学习JVM,首先我们需要了解 JVM 运行时数据区域。我们根据下面两张图,简单的了解一下。运行时数据区域组成部分:方法区 (Method Area)虚拟机栈 (VM Stack)本地方法栈 (Native Method Stack)堆 (Heap)程序计数器 (Program Counter Register)...

2018-12-24 18:35:00 262 1

原创 Android 面向切面编程(AOP)

概念:AOP: Aspect Oriented Programming 面向切面编程。AOP是个概念,AspectJ 是它的一个具体实现。和Java配合使用。AspectJ:核心是他的编译器(ajc),就做了一件事,讲 AspectJ 的代码在编译期插入到目标程序中。运行时没啥区别。ajc 会构建目标程序和AspectJ 代码的联系,在编译期将 As...

2018-12-21 15:29:00 353 1

原创 Android全埋点

什么是全埋点?也叫做无埋点,预先收集用户的所有行为数据,然后根据实际需求,从中提取行为数据。采集数据的点:$AppStart 冷启动➕热启动$AppEnd 正常退出➕进入后台➕崩溃➕强杀等$AppViewScreen 切换Activity$AppClick (重点➕难点)控件的点击事件本质原理自动拦截 =>Android对Vi...

2018-12-20 18:58:00 2675

原创 Android里的View滑动

我们平时会经常遇到View的滑动,不管自定义View,还是动画,都需要这个东西,但是往往最熟悉的最陌生。View滑动可以分为三大类1、自身的ScrollTo和ScrollBy2、通过动画给View平移效果3、改变View的LayoutParams进行修改View的位置很传统的三大分类。但是我们要思考为什么要分出这三类,各自的实现意义。一、Sc...

2018-12-19 12:00:00 155

原创 18年末,恍惚中骇然

适莽苍者,三餐而反,腹犹果然;适百里者,宿舂粮;适千里者,三月聚粮。再次读《逍遥游》,突然感觉经典之所以是经典,是因为每次读它,都会给人陌生感和渺小感。古人的智慧相比于今人,可能更纯粹一些吧,科技变化的表象之下,内心的世界在急速崩溃中。抖音,农药,各式各样的花花绿绿把碎片和整片的世界充斥着。每天拖着疲惫的身躯,刷完最后一把农药,刷完最后一个短视频,日...

2018-12-02 15:47:00 152 2

原创 第三章 Java内存模型之final域的重排序⑦

这是是一个我们平时不太注意的一个重点知识。写final域的重排序规则禁止把 final 域的写重排序到构造方法之外。这个规则的实现是以下两点:1)JMM 禁止编译器吧 final 域的重写排序到构造函数之外。就是说构造函数里的写操作,必须要在构造函数内完成。2)编译器会在 final 域的写之后,在构造方法 return 返回之前,插入一个 Sto...

2018-11-20 11:18:00 317

原创 第三章 Java内存模型之volatile⑥

接上一章Java内存模型之顺序一致性,我们来了解下volatile。理解volatile特性,一个好方法就是把volatile变量的单个读、写 ,可以看成是使用同一个锁对这些单个读/写进行了同步。class demo{volatile long v1 = 0L;public void set(long l){v1 = l;}public ...

2018-11-19 15:14:00 103 2

原创 第三章 Java内存模型之顺序一致性⑤

接上一章Java内存模型之重排序,我们来了解下顺序一致性。学习完重排序之后,顺序一致性这个概念,也就很好懂了。顺序一致性内存模型是一个理论参考模型,在设计的时候,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参考。也就是为行业制定了一系列的标准。一致性分三点来说明:1)数据竞争与顺序一致性2)顺序一致性内存模型3)未同步程序的...

2018-11-19 14:02:00 135

原创 Android系统启动

说起Android的系统启动,真的是很恐怖的一件事,因为里面具体设计的东西很多,但是我们如果不是搞系统开发的是不需要学习那么细致的,我们要做的是了解这个过程,以及过程里的作用。每年Android源码多多少少都有一些变化,如果我们只是记住了细节而不在乎这个整体思想,那么无异于自寻死路,苦恼不已。首先我们大概的了解一下 Android 系统启...

2018-11-18 18:56:00 172

原创 第三章 Java内存模型之重排序

接上一章Java内存模型之基础,我们接着探究Java内存模型。我们在上一章已经接触过重排序了,但是还没有那么透彻,这章重点来说下一下重排序。定义:重排序是编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。我们需要理解这几点:1)数据依赖性2)as-if-serial3)程序顺序规则4)重排序对多线程的影响数据依赖性:如果两...

2018-11-14 19:29:00 155

原创 第三章 Java内存模型之基础

平时我们很少会注意Java内存模型,对于一些概念很多都是背诵,不是甚解,纳闷这一章,将把这个透明层给扯开,让他再也遮不住我们眼睛。首先两个关键问题1)线程之间如何通信2)线程之间是如何同步线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型中,线程之间共享程序的公共状态,通过读-写内存中的公共状态进行隐式通信。在消息传递的并发模型...

2018-11-13 23:21:00 125

原创 第二章:Java并发机制的底层实现原理

这一章应该是很枯燥,很晦涩的一章。总要面对的,不是吗?先来简单的探探路~~1、volatile的应用在并发编程中我们经常会使用synchronize和volatile。volatile是轻量级的synchronize,成本较低。且不会引起线程上下文的切换和调度。volatile的定义与实现原理Java编程语言允许线程访问共享变量,为了确保共享变量...

2018-11-12 19:15:00 273

原创 第一章:并发编程的挑战

我们的认知里,并发编程的目的是为了让程序运行的更快,更能充分利用现在的多核CPU。但是多线程就一定快吗?什么时候应该用多线程呢?这需要面临很多的挑战,也挑战着我们的认知。首先我们要明白一个道理,没有免费的午餐,一切皆有成本。第一个挑战:上下文切换单核处理器也是支持多线程执行的。CPU会给每个线程分配CPU时间片来实现这个机制。这个时间通常很短(通常几...

2018-11-12 13:33:00 157

原创 算法(16)合并两个排序的链表

题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。随着做题越来越感觉递归可以让复杂的问题简单话,我们只需要清楚最根本的操作之后,递归帮你做了重复的事情。拨开云雾见本质。我们最基本的操作就是两个节点进行比较,对于值小的进行赋值,然后移到后面的节点,再进行比较。以此类推,直到一个为null。也就是比较...

2018-11-11 21:06:00 197 1

原创 算法(15)翻转链表

题目描述输入一个链表,反转链表后,输出新链表的表头。思路:就是把原节点的next节点当做头结点,然后将头结点的next指向原节点,其实就是互换一下,依次进行,知道把最后一个节点转换成了头结点。新建一个空节点,命名为preNode,然后将pNode节点(原节点)的next节点指向这个前节点,然后将我们自身的地址给这个前节点,我们自身节点往后移动,...

2018-11-08 16:58:00 107

原创 算法(14)链表中倒数第k个结点

题目描述输入一个链表,输出该链表中倒数第k个结点。这道题的难度中等 主要检验鲁棒性。思路:依次存储目前位置 链表的倒数第K个节点。需要注意的是越界,空的处理。 public ListNode FindKthToTail(ListNode head, int k) {//判断 是否为空链表 if (head == null)...

2018-11-08 13:52:00 94

原创 算法(13)调整数组顺序是奇数位于偶数前面

题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:那我们就for循环把奇数放到奇数列表,把偶数放到偶数列表,最后拼接一下奇数和偶数列表,替换一下全数组的内容就可以了。 public static void reOr...

2018-11-08 13:04:00 142

原创 算法(12)数值的整数次方

题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。很简单的一道题,分为两种情况,一种是 平方是正 一种是平方是负数。如果是负数 base 变成它的倒数,平方exponent取反就可以了。 public double Power(double base, int expon...

2018-11-08 12:24:00 106

原创 算法(11)二进制表示中1的个数

题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。借用了Java的系统方法,没啥可以说的。 public static int NumberOf1(int n) { int t=0; char[]ch=Integer.toBinaryString(n).toCharArray(); ...

2018-11-07 17:43:00 389

原创 算法(10)矩形覆盖

题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?看到这个题感觉有点熟悉啊,仔细一想不正是跳台阶的问题吗?一次一个或者两个,这个本质也是啊。一个的相当于竖着的,两个的相当于横着放。具体可以参照跳台阶。递归方法 public static int JumpFloo...

2018-11-07 16:55:00 740

原创 算法(9)疯狂跳台阶

题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。这个问题首先看是很难看出来的,那只好自己写写画画找找规律。笨方法:f(1) = 1f(2)= 2f(3)= 4f(4)= 8貌似发现什么了,有时间的同学可以算算f(5),我是数不下去了。分析法:f(n)= f(n-1...

2018-11-07 16:21:00 139

原创 算法(8)跳台阶

题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。其实无论哪一种方法思想是一样的f(n) = f(n-1)+f(n-2)我们通过数据可以得出这个公式,这是肉眼法。当然可以通过分析也可得出来结论。比如要跳到 f(10) 在跳到10的前一个情况 可能在f(9) 也可能...

2018-11-07 15:44:00 206

空空如也

空空如也

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

TA关注的人

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