自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

apigfly的博客

我要一步一步往上爬

  • 博客(60)
  • 资源 (2)
  • 收藏
  • 关注

原创 计算概论(二)计算机与程序运行基本原理

本篇是对北大信息技术学院李戈老师计算概论与程序设计基础课程的笔记和总结,源课程地址计算机的过去与未来什么是计算机计算机名称的起源:1646年正式出现”computer ”这一英文单词当时是指专门从事计算工作的人而用来计算的机器在1940年以前称为“计算器”或“制表机”直到1940前后发明第一台电子计算设备,计算机这一名词才正式具备今天的内涵计算机是一种能够根据存储的一系列指令,接收输入、处理数据、存储数据并产生输出的设备历史上的计算机由于课程中介绍的计算机历史内容较多.

2020-08-09 20:20:54 1531

原创 计算概论(一)计算起源、图灵机、计算原理

本篇是对北大信息技术学院李戈老师计算概论与程序设计基础课程的笔记和总结,源课程地址中国大学MOOC的课程是真的不错,一句好的大学 没有围墙让人有些心生感动哇,哈哈哈。PS:本人真滴不是托哈计算起源三次数学危机到哥德尔不完备性定理,产生了可计算与不可计算的边界问题。而对于边界问题探讨,引发了图灵机的问世。第一次数学危机(无理数发现)故事开始于公元前500年毕达哥拉斯学派信仰:数是万物的本源,事物的性质是由某种数量关系决定的,万物按照一定的数量比例而构成和谐的秩序。一切数均可表示为.

2020-08-08 15:34:45 2972

原创 XMLParser一个基于Dom4J的XML解析工具的使用

XMLParser介绍XMLParser 是一款Android XML文件解析生成工具,通过注解的方式来实现XML文件内标签的生成和解析。 使用gradle引入compile 'lee.hua.xmlparse:xmlparse:2.3.0'简单使用场景:一个关于书本信息的描述,一本书包含书名、页数、价格、作者、出版社等信息,我们用JAVA对象简单表示出来,如下@Xm...

2018-03-02 14:44:47 5092

原创 深入Android系统(十二)Android图形显示系统-2-SurfaceFlinger与图像输出

最近有些忙,切实体验了一把拖更的羞耻感 ( *︾▽︾)本文和上一篇深入Android系统(十二)Android图形显示系统-1-显示原理与Surface关系比较密切,撸完前篇更易理解本文啦 (๑‾ ꇴ ‾๑)了解SurfaceFlinger之前我们需要先了解下OpenGL相关的一些知识OpenGL ES与EGLOpenGL一般OpenGL被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,Op

2021-05-03 22:17:46 1409 1

原创 深入Android系统(十二)Android图形显示系统-1-显示原理与Surface

关于图形显示部分可以参考官网:Graphics图像显示原理Linux通常使用Framebuffer来用作显示输出(Framebuffer知识详解在这里),Framebuffer就是一块内存区域,它通常是显示驱动的内部缓冲区在内存中的映射。一旦用户进程把图像数据复制到Framebuffer中,显示驱动会一个像素一个像素地扫描整个Framebuffer,并根据其中的值更新屏幕上像素点的颜色。驱动中这个更新屏幕的动作是固定的,它的周期就是我们常说的刷新率Android关于图像渲染显示的架构图如下:结

2021-03-29 14:40:15 1724 2

原创 关于Java中Integer对象缓存问题的分析

Android的Surface看的有点头晕,换个口味,下一篇再更偶然网上看到如下代码:public class IntegerTest { private Integer a = 100; private Integer b = 100; private Integer c = 200; private Integer d = 200; public static void main(String[] args) { new IntegerTe.

2021-03-22 16:32:17 271

原创 深入Android系统(十一)AMS-4-广播管理

BroadcastReceiver 管理Broadcast实质上是提供了一种更灵活的使用Intent的方式。无论是启动Activity,还是Service,其实都是通过Intent的发送和过滤来调用应用中的功能,但是Activity、Service、ContentProvider所完成的功能是固定的而对于BroadcastReceiver可以做任意的事情,同时广播的发送和接收方式也更加丰富灵活理解BroadcastReceiverBroadcastReceiver是一种很简单的组件,甚至在Acti

2021-03-17 11:42:25 466 2

原创 深入Android系统(十一)AMS-3-Service和ContentProvider管理

Service 管理官方对Service的描述是:Service是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信IPC。在Service使用上,应用需要在AndroidManifest.xml文件中通过标签<service/>来声明一个Service,标签的属性如下:<service android:description="stri

2021-03-17 11:24:08 1089 1

原创 深入Android系统(十一)AMS-2-Activity生命周期管理

Activity管理Activity是最复杂的一个组件,它负责UI的显示以及处理各种输入事件。Activity提供窗口供应用在其中绘制界面,同时也提供了各种各样的控件方便开发。Activity 官网传送门另外,Android中并没有对外提供启动进程的接口,只是在启动Activity或Service时,由系统根据需要来启动进程。Activity的生命周期关于Activity的生命周期,我们先看下官方图示:Activity的生命周期图中隐含了Activity运行时的三种状态,分别是:激活

2021-02-28 20:00:29 1706 3

原创 深入Android系统(十一)AMS-1-应用组成与服务启动

牛年犇犇犇,刚刚完成AMS一半的学习进度,篇幅确实有点大,不过先更上两篇吧我们不止一次提到Android一直想弱化进程的存在,但是,Android毕竟是建立在Linux系统之上,基础的运行环境还是由进程组成。我们前面已经介绍,所有的Android的应用程序都是由Zygote进程fork而来,因此,构成应用进程的底层基础,像虚拟机、动态库等都是相同的。有了从Zygote中继承来的通用基础环境,Android还在Java层建立一套框架来管理运行的组件来进一步弱化进程的存在感。不过由于每个应用的上层配.

2021-02-28 19:57:52 761 1

原创 深入Android系统(十)PMS-1-服务初始化

导读当PMS笔记大小写到106kb时,就知大事不妙,导读叒叒叒来了不得已,将原本计划一篇结束的文章分为了如下三部分:PMS-1:服务初始化PMS-2:初始化的一些细节PMS-3:应用安装过程前两篇主要梳理了PMS初始化的流程和初始化的一些细节;最后一篇对应用的安装过程进行了简单梳理。有没有注意梳理字眼,关于想要深入全面学习PMS的同学只能非常抱歉,本系列文章也仅仅是起到的主要流程的梳理作用。我们先从整体上掌握,等后面遇到相关需求再来仔细研究吧(这波安慰很及时。。。。)整个模块学

2021-01-24 15:02:51 1322 1

原创 深入Android系统(十)PMS-2-初始化的一些细节

permission文件的处理在PMS的构造方法中初始化了PermissionManagerService,通过PermissionManagerService.create()方法,相关调用如下: public static PermissionManagerInternal create(......) { ...... new PermissionManagerService(context, defaultGrantCallback, externalLoc

2021-01-24 14:57:40 1313 1

原创 深入Android系统(十)PMS-3-应用安装过程

研究应用的安装过程,老样子,我们还是先从使用入手。在Android中,通过发送Intent就可以启动应用的安装过程,比如: Uri uri = Uri.fromFile(new File(apkFilePath)); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri,"application/vnd.android.package-archive"); startActivit

2021-01-24 14:50:00 1437

原创 深入Android系统(九)Android系统的核心-SystemServer进程

SystemServer是Android系统的核心之一,大部分Android提供的服务都运行在这个进程里。为了防止应用进程对系统造成破坏,Android的应用进程没有权限直接访问设备的底层资源,只能通过SystemServer中的服务代理访问。本篇重点是了解SystemServer的启动过程以及它的Watchdog模块SystemServer的创建过程SystemServer的创建可以分为两部分:在Zygote进程中fork并初始化SystemServer进程的过程执行SystemServer

2020-12-27 13:35:55 917

原创 深入Android系统(八)Android的资源管理

Android的优势之一是它几乎能运行在任何尺寸的设备上,为了能让同一个apk在不同设备上正常运行,Android设计了一套资源管理系统来完成目标。Android并不是简单地将UI布局和图片进行扩大和缩小来匹配不同配置的设备,而是通过复杂的资源定义方式来保证每种设备都可以有对应的资源文件,从而让用户体验最佳。资源系统简介Android 应用适应不同设备的方法是尽量为每种类型的设备提供一套资源。理论上虽然可以这样做,但实际上却行不通,我们只能为常见的几种设备类型提供完整的资源,否则应用的占用空间会膨胀到

2020-12-19 14:29:01 3109 1

原创 深入Android系统(七)Zygote进程

Zygote是Android中非常重要的一个进程,它和Init进程、SystemServer进程在Android中有着不可替代的地位。Zygote简介Linux的进程是通过系统调用fork产生的,fork出的子进程除了内核中的一些核心的数据结构和父进程不相同外,其余的内存映像都是和父进程共享的。只有当子进程需要去改写这些共享的内存时,操作系统才会为子进程分配一个新页面。这就是所谓的写时复制(Copy On Write)通常子进程被fork出后,会继续执行系统调用exec。exec将用一个新的可执行文件

2020-11-14 12:14:29 1836

原创 深入Android系统(六)第一个用户进程-Init进程

十一假期有点堕落,无限火力有点上瘾,谨戒、谨戒Init进程是Linux 内核启动后创建的第一个用户进程,地位非常重要。Init进程在初始化过程中会启动很多重要的守护进程,因此,了解Init进程的启动过程有助于我们更好的理解Android系统。在介绍Init进程前,我们先简单介绍下Android的启动过程。从系统角度看,Android的启动过程可分为3个大的阶段:bootloader引导装载和启动Linux内核启动Android系统,可分为启动Init进程启动Zygote启动Syst.

2020-10-25 15:28:47 3260 4

原创 深入Android系统(五)Android的同步和消息机制

Android 的消息机制消息驱动是一种进程或线程的运行模式。内部、外部的各种事件都可以放到消息队列中按序处理。这种模式特别适合处理大量的交互事件。Android 应用的UI线程,同样采用了消息驱动模式,所有外部来的按键事件、触屏事件、各种系统Intent、广播等都会转化为内部的消息,然后在主线程中分发处理。消息模型现在的操作系统普遍采用消息驱动模式。Windows操作系统就是经典的消息驱动类型。但是,Android的消息处理机制和Windows的不太相同,我们看下二者的对比图:[外链图片转存

2020-09-26 16:35:31 1220

原创 深入Android系统(四)Android 的 JNI

JNI 的作用JNI是Java Native Interface的缩写。JNI不是Android专有的东西,它是从Java继承而来的,但是在Android中,JNI的作用和重要性大大增强了。Android作为一种嵌入式操作系统,有大量驱动、硬件相关的功能必须在native层实现,另外一些注重性能、功耗的功能使用C/C++来实现也优于用Java来实现。因此,在Android的开发中,无论是应用级的开发,还是系统级的开发都离不开JNI。Android在编译、应用打包和安装、程序装载等各方面都对JNI进行

2020-09-13 16:14:36 494

原创 深入Android系统(三)Binder-1-导读与简介

导读(总结)导读叕叕叕叕来了。本来计划着8月底看完binder,而且是用一篇文章来记录完所学的知识,可是:读着读着,感觉缺少一个能串联起整个binder的主线,所以决定增加导读写着写着,突然发现一篇装不下,所以拆成了三篇导读和binder简介为一篇binder的使用为一篇binder原理为一大篇(85KB…)简单的开始我们先简单了解下binder架构涉及的几个概念:客户进程:发起远程方法调用的进程服务进程:真正服务所运行的进程binder驱动:binder通信的核心,

2020-09-05 14:01:18 423

原创 深入Android系统(三)Binder-3-原理

Binder的实现原理涉及到原理源码肯定是少不了的,9.0 binder 相关的源码分为三部分:Java:frameworks/base/core/java/android/os/Binder.javanative:frameworks/native/libs/binder/driver:common/drivers/android/binder.c还有一点需要明确的是:用户进程:针对内核空间或者binder驱动来说的,这里指的是向binder驱动发送消息的进程客户进程:针对binder

2020-09-05 13:58:23 589

原创 深入Android系统(三)Binder-2-使用

如何使用 Binder就开发语言而言,Binder服务可以用Java实现,也可以用C++实现,通常,我们在Java代码中调用Java语言实现的服务,在C++代码中调用C++编写的服务。但是从原理上讲,Binder并没有这种语言平台的限制,混合调用也是可以的。应用可以在任意的进程和线程中使用Binder服务的功能,非常方便、灵活。也不用关心同步、死锁等问题使用Binder服务C++层和Java层使用Binder服务的方式基本一样,包括函数的接口类型都相同,这里以C++为例:使用Binder服务前

2020-09-05 13:56:01 685

原创 深入Android系统(二)Bionic库

Bionic库是Android的基础库之一,也是连接Android和Linux的桥梁。Bionic库中包含了很多基本系统功能接口,这些功能大部分来自 Linux,但是和标准的 Linux 之间有很多细微差别。同时Bionic库中增加了一些新的模块(像log、linker),服务于Android的上层代码。导读为甚有导读呢,因为Bionic库这部分学起来太枯燥了,在实际开发过程中几乎没主动使用过,不过并不代表它不存在哈,这哥们无处不在。。。通过Bionic库的学习呢,至少可以:了解Andro.

2020-08-05 22:26:21 3097 2

原创 深入Android系统(一)Build系统

深入Android系统这本书是以Android5.0为基础讲解,但本人使用的是Android9.0的源码,所以和原书内容会有些出入。对于Android的构建系统,在Android7.0之后Google就已经使用Soong构建系统,旨在取代 Make。它利用 Kati GNU Make 克隆工具和 Ninja 构建系统组件来加速 Android 的构建。这里是官方构建传送门读书是一个引导学习的过程,读此书的目的是全面了解Android系统,当有一个全面了解后再来看新版特性吧。5.0 确实老了点。哈.

2020-07-19 19:28:23 3329

原创 深入Java虚拟机(思维导图)

本篇是对深入Java虚拟机的总结梳理,原始.xmind文件在这里下载

2020-07-15 18:47:29 248 1

原创 深入Java虚拟机(六)线程同步

可以在语言级支持多线程是Java语言的一大优势,这种支持主要集中在同步上,或调节多个线程间的活动和共享数据。Java所使用的同步是监视器。监视器MonitorJava中的监视器支持两种线程:互斥和协作虚拟机通过对象锁来实现互斥,允许多个线程在同一个共享数据上独立而不干扰地工作协作则是通过Object类的wait方法和notify方法来实现,允许多个线程为了同一个目标而共同工作我们可以把监视器比作一个建筑,它有一个很特别的房间,房间里有一些数据,而且在同一时间只能被一个线程占据。一个线程从进入这

2020-07-07 21:21:06 190

原创 深入Java虚拟机(五)垃圾收集

Java 虚拟机的堆里存放着程序运行中所创建的所有对象。虚拟机可以使用new、newarray、anewarray和multianewarray指令来创建对象,但是没有明确的代码来释放它们。垃圾收集就是自动释放不再被程序所使用的对象的过程。本篇文章并不是要描述正式的 Java 垃圾收集器,因为根本不存在这样一个正式的描述。前面说过,Java 虚拟机规范不要求任何特定的垃圾收集技术,这根本不是必需的。但是在发明可以无限使用的内存前,大部分的 Java 虚拟机都会附带垃圾收集功能。为什么要使用垃圾收集垃圾

2020-07-05 14:32:19 2632

原创 深入Java虚拟机(番外篇)ClassLoader 初探

本篇文章是在深入Java虚拟机(四)的基础上产生的一些想法,从另一个方面研究下类加载问题。面向接口编程在项目工程目录定义了一个获取钱包余额的接口,而作为普通人会返回50大洋,供你吃喝玩乐。public interface Pocket { int getBalance();}public class NormalUser implements Pocket{ @Override public int getBalance() { return 50;

2020-07-01 19:06:14 322

原创 深入Java虚拟机(四)连接模型

从程序猿的角度来看,理解Java体系结构最重要的方面之一就是连接模型。前面曾说过,Java的连接模型允许用户自行设计类装载器,通过自定义的类装载器,程序可以装载在编译时并不知道或许尚未存在的类或者接口,并动态连接它们。上一篇文章只是简单描述了类生命周期的各个阶段,但是没有深究装载和解析的细节。现在,我们用整个篇幅来讲一下装载和解析的细节,并展示解析过程如何和动态扩展相关联。解析当编译一个Java程序时,每个类或者接口都会编译成独立的class文件。虽然class文件之间看上去毫无关联,实际上它们之.

2020-06-30 23:29:25 1551

原创 求一个数组的全排列-Java

对于一个数组,没有重复的元素,求可能存在的排序情况。比如,[ “洞庭湖”, “鄱阳湖”, “太湖”, “洪泽湖” ]四个元素,可能的情况一共是4*3*2*1=24种。计算数量简单,用代码罗列花费了本人一下午的时间(笨死我了都。。。。)递归是核心,代码有注释,走起:public class FourLakes { public static void main(String[] args) throws InterruptedException { //待放置元素的数组 .

2020-06-30 11:03:10 755

原创 用递归的方式求解汉诺塔问题-Java

汉诺塔的由来这部分来自百度百科法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。不管这个传

2020-06-22 15:59:21 672

原创 深入Java虚拟机(三)Java类型的生命周期

上一篇简单记录了Java class文件的格式,它以标准的二进制形式来表现Java类型。本篇我们来看下当二进制的类型数据被导入到和Java虚拟机中时,到底会发生什么。我们以一个Java类型(类或接口)的生命周期(从进入虚拟机开始到最终退出)为例来讨论开始阶段的装载、连接和初始化,以及占Java类型生命周期绝大部分时间的对象实例化、垃圾收集和对象finalize,然后是Java类型生命周期的结束(从虚拟机中卸载)生命周期的开始–类型装载、连接与初始化Java虚拟机通过装载、连接和初始化一个Java类型,使

2020-06-21 16:48:53 240

原创 深入Java虚拟机(二)Java Class 文件

Java Class 是什么?Java Class 文件是对Java程序二进制文件格式的精确定义。每一个Java Class文件都对一个Java类或者接口作出了全面的描述。一个Java Class文件只能包含一个类或接口。class文件不一定必须与Java语言相关,可以使用其他语言来编写程序,然后将其编译为class文件Java class文件是8位字节的二进制流。数据项按顺序储存在class文件中,相邻项之间没有任何间隔,这样可以使得class文件紧凑。占据多个字节空间的项按照高位在前的顺序分为几

2020-06-14 17:59:10 154

原创 macOS Unable to create an interface plug-in (e00002be) ADB 异常

最近把AndroidStudio 升级到4.0,脑残的我顺便把 platform-tool 版本升级到30.0.2,随后发现 ADB 连接各种问题,连接时报Unable to create an interface plug-in (e00002be)异常,版本回溯到28.0.3就好了(29版本应该也可以,懒得试了)。Google 并没有直接给出历史版本的下载连接,方式是根据最新的下载链接信息把版本号和平台改一下就可以了https://dl.google.com/android/repository/p

2020-06-11 10:26:50 2791 1

原创 深入 Java 虚拟机(一)Java 虚拟机概述

Java 虚拟机之所以被称为是『虚拟』的,就是因为它仅仅是有一个规范来定义的抽象计算机。想深入理解Java虚拟机的同学建议先学习下计算机组成原理会事半功倍哟。Java 虚拟机是什么?要理解 Java 虚拟机,首先必须意识到,当我们提到 Java 虚拟机时,可能指的是三种不同的东西:抽象规范一个具体的实现一个运行中的虚拟机实例Java 虚拟机抽象规范仅仅是个概念。而该规范的具体实现可能来自多个供应商,并存在多个平台上。它或者完全用软件实现,或者以硬件和软件结合的方式来实现。当运行一个 J

2020-06-04 18:11:26 649

原创 springboot 报错 IDEA: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

springboot 项目使用 Mapper 时遇到IDEA: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)异常。很多次了,老是会忘记,记录一下增加以下两个地方配置信息:application.properties#mbatis 映射mybatis.type-aliases-package=com.fengmi.mac_keepermybatis.mapper-locations=c

2020-05-21 11:14:49 356

原创 JAVA多线程第三部分(三)原子变量和非阻塞同步机制

在 JAVA 并发包的许多类中,例如Semaphore 和 ConcurrentLinkedQueue,都提供了比synchronized机制更高的性能和可伸缩性。而这种性能的提升主要来源与原子变量和非阻塞同步机制的应用。锁的劣势调度开销当多个线程竞争锁时,JVM 需要借助操作系统的功能将一些线程挂起并且在稍后恢复运行。当线程恢复执行时,必须等待其他线程执行完它们的时间片以后,才能被调度...

2020-04-24 20:40:18 168

原创 JAVA多线程第三部分(二) AQS

在ReentrantLock和Semaphore这两个接口之间存在许多共同点。这两个类都可以用做一个“阀门”,即每次只允许一定数量的线程通过,并当线程到达阀门时,可以通过(在调用lock或acquire时成功返回),也可以等待(在调用lock或acquire时阻塞),还可以取消(在调用tryLock或tryAcquire时返回“假”,表示在指定的时间内锁是不可用的或者无法获得许可)。而且,这两个...

2020-04-24 20:37:43 208

原创 JAVA多线程第三部分(一)显式锁与synchronized

显式锁Java 5之前,在协调共享对象的访问时可以使用的机制只有synchronized和volatile。Java 5增加了ReentrantLock。ReentrantLock并不是一种替代内置加锁的方法,而是当内置锁机制不适用时,作为一种可选择的高级功能。Lock 与 ReentrantLockLock 提供了一中无条件的、可轮询的、定时的以及可中断的所获取操作,所有加锁和解锁的...

2020-04-24 20:35:22 199

原创 JAVA多线程第二部分(二)性能与可伸缩性

对性能的思考提升性能意味着用更少的资源做更多的事情。 “资源”的含义很广。对于给定的操作,通常会缺乏某种特定的资源,例如CPU时钟周期、内存、网路带宽、IO带宽、数据库请求、磁盘空间以及其它资源。当操作性能由于某种特定资源而受到限制时,我们通常将该操作称为资源密集型的操作,例如CPU密集型、数据库密集型等。使用多线程的目的是提升整体性能,但与单线程的方法比,使用多线程总会引起一些额外的开销...

2020-04-24 20:32:12 243

深入Java虚拟机.xmind

深入Java虚拟机-思维导图,算是对深入Java虚拟机专栏的总结和梳理。

2020-07-15

platform-tools_r28.0.3-darwin.zip

Mac OS 平台 ADB 工具 platform-tools,28.0.3 用于 ADB 调试,fastboot 等功能

2020-06-11

空空如也

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

TA关注的人

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