Gradle核心思想(五)通俗易懂的Gradle插件讲解
本文首发于微信公众号「后厂技术官」
关联文章Gradle核心思想(一)为什么现在要用Gradle?Gradle核心思想(二)Gradle入门前奏Gradle核心思想(三)Groovy快速入门指南Gradle核心思想(四)看似无用,实则重要的Gradle WrapperGradle核心思想(五)通俗易懂的Gradle插件讲解
前言在本系列的前作中,我们学习了为什么要用Gradle、Gradle的入门基础和Groovy的基础,这些文章为Gradle的入门打下了基础,这一篇我们要来学习Gradle的插件。
1.Gradle插件概述说到Gradle插件前,我们先要了解下什么是插件。在Android进阶三部曲第二部《Android进阶解密》一书中,我为了讲解插件化的原理,讲解了什么是插件,我们先来看看下面这张图。可以看到初始的机器人只有照相、地图、浏览器、计算机等功能,这显然是比较乏味的,我们可以给这个机器人安装很多其他的应用,使它提供更多的功能,如下图所示
我们给这个机器人安装了很多应用,这些应用不仅覆盖了人的衣食住行还提供了娱乐功能,我们可以玩游戏、听音乐和购物等等,机器人也得到了 ...
Gradle核心思想(四)看似无用,实则重要的Gradle Wrapper
本文首发于微信公众号「后厂技术官」
关联文章Gradle核心思想(一)为什么现在要用Gradle?Gradle核心思想(二)Gradle入门前奏Gradle核心思想(三)Groovy快速入门指南Gradle核心思想(四)看似无用,实则重要的Gradle WrapperGradle核心思想(五)通俗易懂的Gradle插件讲解
前言在本系列的此前文章中,我们学习了为什么要用Gradle、Gradle的入门基础和Groovy的基础,这些文章为Gradle的入门打下了基础,这一篇我们接着学习Gradle Wrapper。有的同学可能有疑问,你不是要讲Android Gradle嘛,讲这个干啥?了解Gradle Wrapper可以更好的理解Gradle,Gradle Wrapper在日常开发中看似“不起眼”,实则超级重要。
1.为什么需要Gradle WrapperGradle Wrapper称为Gradle包装器,是对Gradle的一层包装。为什么需要Gradle Wrapper呢?比如在一个开发团队中,如果每进来一个成员,都需要在计算机中安装Gradle,这个时候运行Gradle的 ...
Android输入系统(四)输入事件是如何分发到目标窗口的?
本文首发于微信公众号「后厂技术官」
关联系列解析WindowManager系列解析WMS系列深入理解JNI系列输入系统系列
基于Android 8.1
前言在Android输入系统(三)InputReader的加工类型和InputDispatcher的分发过程这篇文章中,由于文章篇幅的原因,InputDispatcher的分发过程还有一部分没有讲解,这一部分就是事件分发到目标窗口的过程。
1. 为事件寻找合适的分发目标我们先来回顾上一篇文章讲解的InputDispatcher的dispatchOnceInnerLocked函数:frameworks/native/services/inputflinger/InputDispatcher.cpp
void InputDispatcher::dispatchOnceInnerLocked(nsecs_t* nextWakeupTime) { ... DropReason dropReason = DROP_REASON_NOT_DROPPED;//1 ... switch (mPendingEven ...
Android输入系统(三)InputReader的加工类型和InputDispatcher的分发过程
本文首发于微信公众号「后厂技术官」
关联系列解析WMS系列深入理解JNI系列输入系统系列
前言在上一篇文章中,我们学习了输入事件的处理,输入事件会交由InputDispatcher进行分发,那么InputDispatcher是如何进行分发的?这篇文章会给你答案。
1.InputReader的加工类型在Android输入系统(二)IMS的启动过程和输入事件的处理这篇文章中,我们知道InputReader会对原始输入事件进行加工,如果事件的类型为按键类型的事件,就会调用如下一段代码。frameworks/native/services/inputflinger/InputDispatcher.cpp
void InputDispatcher::notifyKey(const NotifyKeyArgs* args) { ... bool needWake; { ... } // release lock if (needWake) { mLooper->wake(); } ...
Android输入系统(二)IMS的启动过程和输入事件的处理
本文首发于微信公众号「后厂技术官」
关联系列解析WMS系列深入理解JNI系列输入系统系列
基于Android 8.1
前言在上一篇文章中,我们学习了IMS的诞生(创建),IMS创建后还会进行启动,这篇文章我们来学习IMS的启动过程和输入事件的处理。
1.IMS的启动过程IMS的创建在SystemServer的startOtherServices方法中,不了解请查看Android输入系统(一)输入事件传递流程和InputManagerService的诞生这篇文章。frameworks/base/services/java/com/android/server/SystemServer.java
private void startOtherServices() { ... traceBeginAndSlog("StartInputManagerService"); inputManager = new InputManagerService(context); traceEnd(); ... ...
寒冬已至?四面楚歌的Android工程师该何去何从
寒冬真的来了吗?可能是吧,因为最近几年每年都说是寒冬,说的真的叫人焦虑。不过互联网的整体环境确实不如前几年,即使不说我想大家也能隐约的感受到了。作为曾经炙手可热的Android工程师,现在面临着以下的问题:
互联网整体环境不乐观
Android开发人员众多但岗位减少,导致要求越来越苛刻
大前端趋势、跨平台方案频出、小程序肆虐,Android不再是应用开发唯一的方案
人工智能、大数据、区块链等技术炒的火热,培训机构倾巢出动,学校学生疯狂学习,而培训Android出来就失业,大学学Android出来基本也失业。
从上面几点来看,说Android工程师是四面楚歌真的不为过,本篇文章会从以下几个方面来进行分析,请轻拍。
解除对Android的误解
是否要转行
如何提升竞争力
1. 解除对Android的误解无论是Android同行还是其他技术领域,明显都对Android有些误解。作为Android开发来说,如果对Android有误解可能会影响到后续的发展和决定,我有必要来消除这个误解。
1.1 Android系统的未来Android系统是根,没了它Android工程师也不存在了。在我 ...
Android输入系统(一)输入事件传递流程和InputManagerService的诞生
本文首发于微信公众号「后厂技术官」
关联系列解析WMS系列View体系系列
前言很多同学可能会认为输入系统是不是和View的事件分发有些关联,确实是有些关联,只不过View事件分发只能算是输入系统事件传递的一部分。这个系列讲的输入系统主要是我们不常接触的,但还是需要去了解的那部分。
1. 输入事件传递流程的组成部分输入系统是外界与Android设备交互的基础,仅凭输入系统是无法完成输入事件传递的,因此需要输入系统和Android系统的其他成员来共同完成事件传递。输入系统事件传递需要经过以下几个部分。
输入事件传递流程可以大致的分为三个部分,分别是输入系统部分、WMS处理部分和View处理部分。下面分别对这几个部分进行简单的介绍。
输入系统部分输入系统部分主要又分为输入子系统和InputManagerService组成(以下简称IMS),在Android中还有一个IMS(IP Multimedia Subsystem)意为为IP多媒体子系统,不要搞混了。Android的输入设备有很多种,比如屏幕、键盘、鼠标、游戏手柄、操纵杆等等,其中应用开发接触最多的屏幕。当输入设备可用时,Lin ...
《Android进阶解密》勘误
感谢提供勘误信息的读者,正是有了你们,《Android进阶解密》才会变得越来越好。目前最新印次:2019年4月 第5印。
108页中间段落第1行,scheduleLaunchActivity方法改为scheduleCreateService方法,ActivityClientRecord改为CreateServiceData。第二行ActivityClientRecord改为CreateServiceData
139页 第4行,我们查看ContentProvider的acquireUnstableProvider方法…,改为:查看acquireUnstableProvider方法…
42页 第10行,RuntimeInit.java改为:ZygoteInit.java
87页 中间段落,startActivityLocked方法,全部改为:startActivityMayWait方法
130页(第5印),倒数第9行,enqueueOrderedBroadcastLocked(r);改为:enqueueParallelBroadcastLocked(r);
114页(第5印),中间段 ...
Android进阶三部曲 第二部《Android进阶解密》已出版
勘误贴请点击这里本书源码地址:https://github.com/henrymorgen/android-advanced-decodeAndroid进阶三部曲第一部《Android进阶之光》介绍 :点击这里
为什么写这本书Android进阶三部曲包括《Android进阶之光》和本书,因此写这本书的原因和《Android进阶之光》有些关联,主要有以下几点:
《Android进阶之光》适合初、中级工程师阅读,因此我需要写一本适合中、高级工程师阅读的进阶书。
目前市场上的系统源码分析的书大部分不是专门为应用开发编写的,因此我要专门为Android应用开发编写一本系统源码分析的书,不仅如此,我还要将系统源码和应用开发相结合并融会贯通。
目前市面上的源码分析类书籍大多是基于Android 6.0以前版本的,需要有一本书籍来对更新版本的系统源码进行分析。
内容简介本书主要针对Android 8.0系统源码并结合应用开发相关知识进行介绍。《Android进阶解密》共分为17章,从3个方面来组织内容。 一方面介绍Android应用开发所需要掌握的系统源码知识,第二方面介绍JNI、ClassL ...
Android包管理机制(五)APK是如何被解析的
本文首发于微信公众号「后厂技术官」
关联系列包管理机制系列
前言在本系列的前面文章中,我介绍了PackageInstaller的初始化和安装APK过程、PMS处理APK的安装和PMS的创建过程,这些文章中经常会涉及到一个类,那就是PackageParser,它用来在APK的安装过程中解析APK,那么APK是如何被解析的呢?这篇文章会给你答案。
1.引入PackageParserAndroid世界中有很多包,比如应用程序的APK,Android运行环境的JAR包(比如framework.jar)和组成Android系统的各种动态库so等等,由于包的种类和数量繁多,就需要进行包管理,但是包管理需要在内存中进行,而这些包都是以静态文件的形式存在的,就需要一个工具类将这些包转换为内存中的数据结构,这个工具就是包解析器PackageParser。
在Android包管理机制(三)PMS处理APK的安装这篇文章中,我们知道安装APK时需要调用PMS的installPackageLI方法:frameworks/base/services/core/java/com/android/server ...
Gradle核心思想(三)Groovy快速入门指南
本文首发于微信公众号「后厂技术官」
关联文章Gradle核心思想(一)为什么现在要用Gradle?Gradle核心思想(二)Gradle入门前奏Gradle核心思想(三)Groovy快速入门指南Gradle核心思想(四)看似无用,实则重要的Gradle WrapperGradle核心思想(五)通俗易懂的Gradle插件讲解
前言在前面我们学习了为什么现在要用Gradle?和Gradle入门前奏两篇文章,对Gradle也有了大概的了解,这篇文章我们接着来学习Groovy的基础,要想学好Gradle,Groovy是必须要掌握的。Groovy仅凭一篇文章是介绍不完的,这里会带大家快速的入门Groovy,讲解Groovy和Java不同的部分,想要更多了解Groovy可以查看Groovy官方文档和Groovy API文档。
1.Groovy概述Groovy是Apache 旗下的一种基于JVM的面向对象编程语言,既可以用于面向对象编程,也可以用作纯粹的脚本语言。在语言的设计上它吸纳了Python、Ruby 和 Smalltalk 语言的优秀特性,比如动态类型转换、闭包和元编程支持。Groo ...
Gradle核心思想(二)Gradle入门前奏
本文首发于微信公众号「后厂技术官」
关联文章Gradle核心思想(一)为什么现在要用Gradle?Gradle核心思想(二)Gradle入门前奏Gradle核心思想(三)Groovy快速入门指南Gradle核心思想(四)看似无用,实则重要的Gradle WrapperGradle核心思想(五)通俗易懂的Gradle插件讲解
前言在上一篇文章Gradle核心思想(一)为什么现在要用Gradle?中,我们学习了常见的构建工具,以及Gradle与这些构建工具相比有那些不同的特性。这一篇文章我们接着来学习Gradle入门需要掌握的知识,包括配置环境、实现Hello World、Gradle的任务、Gradle日志和Gradle命令行,掌握这些能够更好的理解Gradle。
1.配置Gradle环境安装Gradle前要确保系统已经配置好JDK的环境,要求JDK的版本在1.7或更高。Gradle的安装有两种形式:
通过包管理安装,比如Window平台的Chocolatey、Scoop,Mac平台的MacPortsl、Homebrew等等。
手动安装。
关于包管理器安装可以查看官方文档 ,这 ...
Gradle核心思想(一)为什么现在要用Gradle?
本文首发于微信公众号「后厂技术官」
关联文章Gradle核心思想(一)为什么现在要用Gradle?Gradle核心思想(二)Gradle入门前奏Gradle核心思想(三)Groovy快速入门指南Gradle核心思想(四)看似无用,实则重要的Gradle WrapperGradle核心思想(五)通俗易懂的Gradle插件讲解
前言又要开启一个新系列了,这个系列我们来学习Gradle,它是一个基于JVM的新一代构建工具,关于Gradle完全可以写一本书,这个系列会针对Android开发来对Gradle的知识进行精简讲解。Gradle目前已经应用于多个Android开发的技术体系中,比如构建系统、插件化、热修复和组件化等等,如果你不了解Gradle,那么你对于上述技术体系的了解会大打折扣。为了让大家能够更好的学习Gradle,这篇文章不会介绍Gradle具体的技术细节,而是先介绍为什么现在要用Gradle?
1.项目自动化Gradle是一个构建工具,那么为什么要用构建工具,这就需要先从项目自动化开始讲起。在我们开发软件时,会面临相似的情况就是,我们需要去用IDE来进行编码,当完成一些 ...
Android包管理机制(四)PMS的创建过程
本文首发于微信公众号「后厂技术官」
关联系列Android包管理机制系列
前言PMS的创建过程分为两个部分进行讲解,分别是SyetemServer处理部分和PMS构造方法。其中SyetemServer处理部分和AMS和WMS的创建过程是类似的,可以将它们进行对比,这样可以更好的理解和记忆这一知识点。
1. SyetemServer处理部分PMS是在SyetemServer进程中被创建的,SyetemServer进程用来创建系统服务,不了解它的可以查看Android系统启动流程(三)解析SyetemServer进程启动过程这篇文章。从SyetemServer的入口方法main方法开始讲起,如下所示。frameworks/base/services/java/com/android/server/SystemServer.java
public static void main(String[] args) { new SystemServer().run(); }
main方法中只调用了SystemServer的run方法,如下所示。frame ...
Android包管理机制(三)PMS处理APK的安装
本文首发于微信公众号「后厂技术官」
关联系列Android包管理机制系列
前言在上一篇文章Android包管理机制(二)PackageInstaller安装APK中,我们学习了PackageInstaller是如何安装APK的,最后会将APK的信息交由PMS处理。那么PMS是如何处理的呢?这篇文章会给你答案。
1.PackageHandler处理安装消息APK的信息交由PMS后,PMS通过向PackageHandler发送消息来驱动APK的复制和安装工作。先来查看PackageHandler处理安装消息的调用时序图。
接着上一篇文章的代码逻辑来查看PMS的installStage方法。frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
void installStage(String packageName, File stagedDir, String stagedCid, IPackageInstallObserver2 observer, ...
Android包管理机制(二)PackageInstaller安装APK
本文首发于微信公众号「后厂技术官」
关联系列Android包管理机制系列
前言在本系列上一篇文章Android包管理机制(一)PackageInstaller的初始化中我们学习了PackageInstaller是如何初始化的,这一篇文章我们接着学习PackageInstaller是如何安装APK的。本系列文章的源码基于Android8.0。
1.PackageInstaller中的处理紧接着上一篇的内容,在PackageInstallerActivity调用startInstallConfirm方法初始化安装确认界面后,这个安装确认界面就会呈现给用户,用户如果想要安装这个应用程序就会点击确定按钮,就会调用PackageInstallerActivity的onClick方法,如下所示。packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
public void onClick(View v) { if (v == mOk) ...