Android开发者&前端菜鸟,专注于跨平台、热修复领域
11月4日,厦门航空与阿里云宣布合作打造航空业“移动研发中台”。该项目将基于阿里云企业级移动研发平台EMAS,结合厦门航空在航空业数字化探索实践联合研发,搭建完成后将助力厦门航空打造厦门航空超级APP。
WEEX依旧采取传统的web开发技术栈进行开发,同时app在终端的运行体验不输native app。其同时解决了开发效率、发版速度以及用户体验三个核心问题。那么WEEX是如何实现的?目前WEEX已经完全开源,并捐给Apache基金会,我们可以通过分析其源码来一探究竟。
WEEX依旧采取传统的web开发技术栈进行开发,同时app在终端的运行体验不输native app。其同时解决了开发效率、发版速度以及用户体验三个核心问题。那么WEEX是如何实现的?目前WEEX已经完全开源,并捐给Apache基金会,我们可以通过分析其源码来一探究竟。
自己动手写Promise
Promise常见用法及含义介绍
perspective、perspective-origin属性含义及常见用法介绍
利用CSS Animation属性实现加载动画
CSS 3D相册
在`JavaScript`中,函数原型链是最强大也是最容易让人迷惑的特性。长期以来对于`prototype`和`__proto__`的一知半解导致在实际开发中经常遇到难以排查的问题,所以有必要将`JavaScript`中的原型概念理解清楚。
由于JavaScript不是典型的面向对象语言,因而在实现一些经典的设计模式上也与一般语言存在差异,本文主要介绍在JavaScript中如何实现常用的设计模式。
消息气泡样式实现
介绍常见的css居中方案
介绍css经典三栏布局的6中方案
介绍addrinfo、sockaddr结构体
由于`WebView`并未暴露处设置DNS的接口,因而在`WebView`场景下使用`HttpDns`存在很多无法限制,但如果接入`WEEX`,则可以较好地植入`HTTPDNS`,本文主要介绍在`WEEX`场景下接入`HTTPDNS`的方案细节。
Android Studio 2.0开始支持 Instant Run 特性, 使得在开发过程中能快速将代码变化更新到设备上。之前,更新代码之后需要先编译一个完整的新Apk,卸载设备上已安装的这个 Apk (若有),再 push 到设备安装,再启动。
上一篇博客的末尾我们介绍了`InstantRun`在初始化完成后,会启动一个server。不难猜测,这个server就是在监听是否有代码更新。当用户更改代码后,AndroidStudio会将相关更新发送给server,server获取到更新后执行修复逻辑。接下来我们看下具体的修复逻辑。
volatile关键字就是Java中提供的另一种解决可见性和有序性问题的方案。对于原子性,需要强调一点,也是大家容易误解的一点:对volatile变量的单次读/写操作可以保证原子性的,如long和double类型变量,但是并不能保证i++这种操作的原子性,因为本质上i++是读、写两次操作。
Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态)。
在上一篇博客中我们知道,`Synchronized`的实现依赖于与某个对象向关联的monitor(监视器)实现,而monitor是基于底层操作系统的Mutex Lock实现的,而基于Mutex Lock实现的同步必须经历从用户态到核心态的转换,这个开销特别大,成本非常高。
Synchronized是Java中实现进程同步最简单的一种方式,`Synchronized`主要有以下三个作用:保证互斥性、保证可见性、保证顺序性 接下来我们就来看下Synchronized的实现原理,看看Synchronized是如何实现上述三个作用的。
并发编程是Java程序员最核心的技能之一,同时也是掌握难度最大的一部分。我们都知道Java中提供了各种异步机制,但无论是`notify` `wait`、`synchronized`、`volatile`亦或是`java.util.conccurrent`包下的`ReentrantLock`、`ThreadPoolExecutor`都遵循着相同的异步理论,要理解上述并发机制就必须首先了解Java异步的核心原理。
上一篇博客中,我们提到`AQS`的队列管理是基于CLH锁队列实现的,所以首先我们来看下`CLH锁队列`。
尽管JVM在并发上已经做了很多优化工作,如偏向锁、轻量级锁、自旋锁等等。但是基于`Synchronized` `wait` `notify`实现的同步机制还是无法满足日常开发中。原生同步机制在时间和空间上的开销也一直备受诟病。
任何一种语言、框架,线程都是非常重要的一部分。要想实现异步就需要通过异步线程,但是频繁地创建销毁线程会带来较大的性能开销,而线程池就是为解决这一问题而出现的
和Java异步打交道就不能回避掉`Runnable`,`Callable`,`Future`,`FutureTask`等类,首先来介绍下这几个类的区别
对于Java程序员来说,他们相比C++程序员最幸福的一点就是不用自己管理内存,内存的分配和回收都由虚拟机完成。然而,正是由于该原因,一旦虚拟机内存管理出现问题,比如出现内存泄漏或溢出,排查起来将是非常困难的。所以尽管不用亲自动手管理内存,但是了解虚拟机的内存管理机制还是很有必要的。 1. 运行时数据区域 首先来看下Java虚拟机在运行时的数据区域划分,Java虚拟机在Java程
代码编译的结果从机器码转变为字节码,是存储格式的一小步,确实编程语言发展的一大步。正是因为有了字节码这一中间格式才有了Java语言跨平台的特性。 字节码并不能直接基于物理机执行引擎执行,因为物理机执行引擎是建立在特定的处理器,指令集以及操作系统之上的,并不具备跨平台特性。
在介绍完class文件格式后,我们来看下虚拟机是如何把一个由class文件描述的类加载到内存中的。具体来说java中类的加载涉及7个阶段:加载、校验、准备、解析、初始化、使用、卸载
Class文件是Java程序跨平台的保证,正是由于有了Class文件架起源码和机器码之间的中间桥梁,JVM虚拟机才可以在各种平台上按照统一的规范标准加载Java代码
对于Java程序员来说,他们相比C++程序员最幸福的一点就是不用自己管理内存,内存的分配和回收都由虚拟机完成。然而,正是由于该原因,一旦虚拟机内存管理出现问题,比如出现内存泄漏或溢出,排查起来将是非常困难的。所以尽管不用亲自动手管理内存,但是了解虚拟机的内存管理机制还是很有必要的
OkHttp是一个处理网络请求的开源项目,是Android端最火热的轻量级框架,由移动支付Square公司贡献用于替代HttpUrlConnection和Apache HttpClient。随着OkHttp的不断成熟,越来越多的Android开发者使用OkHttp作为网络框架。
前一篇博客中我们介绍了OkHttp的总体架构,接下来我们以一个具体的网络请求来讲述OkHttp进行网络访问的具体过程。由于该部分与OkHttp的拦截器概念紧密联系在一起,所以将这两部分放在一起进行讲解。
合理地利用本地缓存可以有效地减少网络开销,减少响应延迟。HTTP报头也定义了很多与缓存有关的域来控制缓存。今天就来讲讲OkHttp中关于缓存部分的实现细节。
OkHttp的任务队列在内部维护了一个线程池用于执行具体的网络请求。而线程池最大的好处在于通过线程复用减少非核心任务的损耗。
接下来讲下OkHttp的连接池管理,这也是OkHttp的核心部分。通过维护连接池,最大限度重用现有连接,减少网络连接的创建开销,以此提升网络请求效率。
随着Android Studio 2.2的推出,Android Studio的NDK开发支持Cmake和ndk-build两种方式,简化了Android Studio上NDK开发流程,提升了开发效率
JNI-Java Native Interface,是Java平台提供的一个特性,通过编写JNI函数实现Java代码调用C/C++代码以及C/C++代码调用Java代码的作用。从而达到利用不同语言的特点
在Android端如果OkHttp作为网络请求框架,由于其提供了自定义DNS服务接口,可以很优雅地结合HttpDns,相关实现可参考:[HttpDns+OkHttp最佳实践](https://help.aliyun.com/document_detail/52008.html?spm=5176.product30100.6.585.USrgj7)。 如果您使用`HttpClient`或`Http
要想实现热更新的目的,就必须在dex分包完成之后操作字节码文件。比较常用的字节码操作工具有ASM和javaassist。另外还需要在Gradle的构建过程中完成插桩的操作
Android热修复QQ空间补丁方案实战篇。本篇博客我们将介绍1)如何打包补丁包; 2)如何将通过ClassLoader加载补丁包;3)如何将补丁包的dex插入到`dexElements`的前面
传统的app开发模式下,线上出现bug,必须通过发布新版本,用户手动更新后才能修复线上bug。那么是否存在一种方案可以在不发版的前提下修复线上bug?有!而且不只一种。今天首先来看下腾讯的QQ空间补丁方案
之前的博客已经介绍了应用框架中的`Activity`和`Application`,今天来讲四大组件之一的`Service`。对于`Service`大家肯定都比较熟悉,与`Activity`最大的不同就是`Service`不会与界面打交道,而是始终工作在后台,执行一些与UI无关的操作和计算。即便用户切换了其他应用,启动的Service仍可在后台运行。一个组件可以与Service绑定并与之交互,甚至是
不同于其他系统,在Android中Application并不是一个重要的概念,甚至开发人员在开发的过程中很少需要直接与Application打交道,其提供的也仅仅是一个上下文环境。至于为什么会这样,还是与设计者的设计思想有关。Android的设计者希望呈现给用户的是一个组件化的操作系统,开发者只需要与`Activity`,`Service`,`BroadcatReceiver`,`ContentP
AIDL全名Android Interface Definition Language,是一种接口定义语言,也是Android系统的一种跨进程通信机制。从AIDL的名字就可以看出来,AIDL做的就是在服务提供进程和服务使用进程之间的协商好的接口,双方通过该接口进行通信。本文将以一个例子来讲述AIDL的使用方式和流程,在下一篇文章中我将从代码层面对AIDL进行分析。 ### AIDL实例 文
上一篇博客介绍了`Application`和`ActivityThread`,今天来讲一下Android中最为重要的一个组件,`Activity`。 ### 1.基本结构 一个应用程序通常由多个`Activity`组成,那么在应用程序中肯定需要一个容器来盛放这些`Activity`,必要时通过该容器找到对应的`Activity`,并进行相关操作。上一篇文章已经讲过一个应用程序对应一个`Ac
在接下来的几篇博客中我会主要给大家讲一下Android系统的启动过程,之前也断断续续讲过PackageMangerService和Home程序的启动过程,但是没有系统的讲过,接下来将系统性地介绍整个系统的启动过程。
原文链接:点击打开链接 本篇文章内容包括: 注解的概念 元注解 自定义注解 Android自定义编译时注解 如果使用过ButterKnife, EventBus, Retrofit, Dagger等框架, 你对注解一定不会陌生. 但是注解背后究竟有什么魔法, 可以做这么不可思议的事情. 什么是注解 先来看看Java文档中的定义 An annotation is a
在Android的应用框架中,ActivityManagerService是非常重要的一个组件,尽管名字叫做ActivityManagerService,但通过之前的博客介绍,我们知道,四大组件的创建都是有AMS来完成的,其实不仅是应用程序中的组件,连Android应用程序本身也是AMS负责启动的。AMS本身运行在一个独立的进程中,当系统决定要在一个新的进程中启动一个Acti
上一篇博客我们讲了PackageManagerService的启动过程以及对于应用程序的注册过程,当系统启动完成后,系统需要开启第一个应用程序,这就是Home程序,也就是我们熟知的桌面程序。本篇博客主要介绍Home的启动过程。 通过上一篇博客介绍,我们知道系统在启动的时候会启动SystemServer,并且在SystemServer中会启动一系列的Service,包括Pac