自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 资源 (1)
  • 收藏
  • 关注

原创 Android 利用APT对网络请求进行极简封装

团队并行开发,每个人对自己模块的api进行封装,然后利用Retrofit的create方法创建出对应的apiservice进行网络请求,各个模块都需要含有apiservice实例的简单单例封装,那么多个模块就有多个单例,这个时候就需要工厂模式进行设计。

2017-08-17 00:38:49 945

原创 Android AOP实现模块间通信

上一篇《Android Retrofit2.0 实现原理分析》我们分析了Retrofit2.0的实现原理,用到了AOP的方式,实现了注解的动态解析。下面我们利用AOP的原理实现多模块的RPC通信。工程目录app module是client角色,rpc功能的调用者apis 定义了rpc提供的所有接口,包含ITest1 、ITest2接口rpc rpcservice

2017-07-26 00:14:40 2188 1

原创 Android Retrofit 2实现原理分析

1.Retrofit的原理是什么Retrofit是一个基于AOP思想,对RestfulApi注解进行动态代理的网络框架。2.AOP是什么Aspect Oriented Programming  面向切面编程。面向切片编程是编程实践中的解耦利器,能够极大的减少对象的创建,AOP的思想是在不影响主体逻辑的前提下,动态的插入逻辑,利用反射进行调用。在执行频度不是很高的

2017-07-20 10:18:37 4466

原创 Android RxJava原理分析

团队并行开发,每个人对自己模块的api进行封装,然后利用Retrofit的create方法创建出对应的apiservice进行网络请求,各个模块都需要含有apiservice实例的简单单例封装,那么多个模块就有多个单例,这个时候就需要工厂模式进行设计。

2017-07-19 00:16:58 3617

原创 Android高性能编码实战:修复内存泄漏

之前的文章从理论上介绍了Android高性能编码的几个优化的方向,下面我们从实战的角度讲述如何优化Android高性能编码实战:App启动优化Android高性能编码实战:网络框架优化Android高性能编码实战:修复内存泄漏        内存泄漏也称作“存储渗漏”,用动态储存分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(

2017-05-18 10:15:29 570

原创 Android handler的内存泄漏问题

在Activity或者Fragment中创建异步处理对象时,比如Handler、AsyncTask,要特别注意内存泄漏问题,这些异步对象在子线程处理请求,生命周期和外面Activity和Fragment存在不同步的问题,当Activity的生命周期结束时,若不显式在onDestroy中将这些异步控件结束,将会造成activity无法被回收,也就造成了内存泄漏。下面我们从smali文件和内存堆栈

2017-05-05 13:43:34 507

原创 Android高性能编码实战:网络框架优化

之前的文章从理论上介绍了Android高性能编码的几个优化的方向,下面我们从实战的角度讲述如何优化Android高性能编码实战:App启动优化Android高性能编码实战:网络框架优化之前的App启动优化最后提到了网络框架的优化问题,本篇将针对这个问题对APP进一步优化04-26 18:14:59.504 11295-11295/com.js.test E/xuti

2017-04-26 18:54:43 1352 1

原创 Android高性能编码实战:App启动优化

App冷启动是很慢的,期间有大量的对象被创建,进程创建,分配内存,绘制界面,建立消息队列,各种第三方控件初始化等等,用户安装完APP,第一次启动,往往第一印象特别重要,启动迅速,显示流畅,就有很好的用户体验。04-25 14:15:10.803 7202-7202/com.js.test E/Test: app start at 149310091080204-25 14:15:12.200

2017-04-25 15:36:56 925

原创 Android高性能编码四:代码优化

1.选择ArrayList最佳的遍历方式 //方法1 Iterator it1 = list.iterator(); while(it1.hasNext()){ System.out.println(it1.next()); } //方法2 for(Iterator it2

2017-04-25 11:41:10 730

原创 Android高性能编码三:数据结构和算法优化

TPS(Transaction Per Second)TPS为每秒处理的事务数,是系统吞吐量的指标,在搜索系统中也用QPS(Query Per Second)衡量。TPS一般与响应时间反相关。通常所说的性能问题就是指响应时间过长、系统吞吐量过低。Android高性能编码一:多线程并发或分布式提高TPSAndroid高性能编码二:利用缓存提高TPSAndroid高性能编码

2017-04-24 16:09:44 2809

原创 Android 高性能编码二:利用缓存提高TPS

缓存主要包括对象缓存、IO 缓存、网络缓存、图片缓存等 。1.对象缓存gc执行的时候,系统是阻塞的,gc数据较大的时候,系统会很明显的卡顿。a.listview对象缓存listview快速滚动时,重复利用item,不必重新创建新的对象,也避免了对象的频繁销毁,减少了gc的数据的大小和时间。b.调用频繁的对象设为全局变量,或保存到容器中。c.在方法体中,如果频繁使用某一全

2017-04-24 00:28:44 972

原创 Android 高性能编码一:多线程并发或分布式提高TPS

TPS(Transaction Per Second)TPS为每秒处理的事务数,是系统吞吐量的指标,在搜索系统中也用QPS(Query Per Second)衡量。TPS一般与响应时间反相关。通常所说的性能问题就是指响应时间过长、系统吞吐量过低。多线程的优点:1.多线程并发,防止线程阻塞带来的性能损失Java线程存在创建、可运行、阻塞、运行中、死亡等生命周期,每个线程在

2017-04-23 01:21:10 2554 2

原创 Android studio 阅读Android源码

window环境下source insight 3工具是相当好用,但mac x10之后没有mac版可用了,无奈卸载了,好在现在Android源码考虑到了开发者的便捷,已经可以支持Eclipse阅读源码了。下面我们介绍如何使用Android studio加载Android源码。我采用的源码是Android 7.1.1的,在源码目录下development/ide/eclipse文件夹下,

2017-04-18 10:51:28 3159 1

原创 淘宝atlas框架初探atlas-core(二):Bundle插件化

上一篇《淘宝Atlas框架初探atlas-core(一)》我们研究了淘宝模块化apk:bundle体系,还有bundle体系配套的hook体系。本篇我们继续研究一下atlas框架的动态升级体系atlas-update。

2017-04-17 00:52:52 3107

原创 Android pluginMVPM 可插拔MVP框架

Github地址https://github.com/jasonwang18/pluginMVPMMVPM Model-View-Presenter-MethodCenter相较于MVP框架多一个M,这个M就是MethodCenter,它是所有plugin的presenter的方法集合,集中管理所有同步和异步的方法,这个框架比较适用于有许多小功能的模块的集合比如unit

2017-04-07 15:27:01 684

原创 淘宝Atlas框架初探atlas-core(一)

等待许久的淘宝Atlas框架终于开源了Github地址:https://github.com/alibaba/atlasHack 执行捕捉class method feild constructorAtlasHacks 捕捉并储存所有应捕捉的class method feild constructor AndroidHacks 捕捉和activity application

2017-03-31 11:46:54 7469

原创 Android Retrofit 2.0 注解的理解

Retrofit 2.0包含众多的注解,包括方法注解,包含@GET、@POST、@PUT、@DELETE、@PATH、@HEAD、@OPTIONS、@HTTP。标记注解,包含@FormUrlEncoded、@Multipart、@Streaming。参数注解,包含@Query,@QueryMap、@Body、@Field,@FieldMap、@Part,@PartMap。其他注解,

2017-03-30 23:22:06 4766 2

原创 Android 使用RxJava+Retrofit 2.0合并网络请求

在开发验证码的功能时,要求验证code的同时判断这个是不是服务码(万能码),这个就需要同时去请求两个接口,只要有一个功能就算成功。 @Override public void checkConfirmCode(String deviceId, String code, OnAPIListener listener) { Map map = new Has

2017-03-28 16:07:54 6318

原创 Android如何监听第三方应用的启动

个人总结的监听第三方应用启动的方法有以下几种:1.Root状态下监听ActivityManager的log2.参考程序锁的实现,监听后台运行的进程3.深入framework,通过反射等方式注入hook第一种方式监听应用的启动,restart都能监控到,不过这种方式限制很大,在最新的android版本中,再加上各手机厂商对于安全性的努力,使得Root变的很困难。第二种方式采用

2017-03-23 00:26:15 20853 1

转载 Android的swift语言Kotlin中文开发文档

转自GitHub https://github.com/huanglizhuo/kotlin-in-chinese?utm_source=tuicool&utm_medium=referral2016.3.4 gitbook 墙内访问速度很糟糕 现在有了 墙内地址 啦 :) 国内服务器由 掘金 赞助 稀土掘金:挖掘最优质的互联网技术 / 联合编辑每日精选内容 / 移

2017-03-20 23:20:09 383

原创 Android 如何获取已连接的蓝牙地址

项目中有一个需求,就是获取已连接的蓝牙地址private void getConnectBt() { LogUtil.i("getConnectBt"); int a2dp = _bluetoothAdapter.getProfileConnectionState(BluetoothProfile.A2DP); int headset = _b

2017-03-10 23:05:18 14127 5

原创 Android AccessibilityService源码分析

AccessibilityService首先你要继承AccessibilityService,你会被要求复写onKeyEvent、onIntercept、onAccessibilityEvent等方法。我们看这些方法在AccessibilityService中是如何实现的。public class AccessBackKeyService extends Accessibility

2017-02-25 20:16:55 3149 3

原创 Android Studio使用新的Gradle构建工具配置NDK环境(三)

上篇我们分析了如何采用gradle脚本就行ndk交叉编译,本篇我们将讨论如何用Android studio最新的cmake体系来进行Android ndk的交叉编译。CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平摊的安装编译过程。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。

2017-02-17 10:07:02 13808

原创 Android Studio使用新的Gradle构建工具配置NDK环境(二)

Android studio 2.2之前gradle的支持ndk的版本主要有两个,一个是1.3实验版本的model的写法,另一个是1.5之后ndk的写法,本篇主要介绍ndk的配置。apply plugin: 'com.android.application'android {    compileSdkVersion 25    buildToolsVersion "25.

2017-02-15 18:28:24 1338 2

原创 Android 6.0修改系统权限分析(一)

Android 6.0之后敏感权限默认是关闭的,必须显式的去请求这个权限。而在6.0之前,只要你在manifest里面声明过所需要的权限,安装之后默认是开启的,下面我们来分析一下遇到的问题。android:name="android.permission.WRITE_SETTINGS" />项目中需要写系统设置的权限,该权限可以设置音量,调节明暗,测试手机系统是Androi

2017-02-09 11:17:42 6416 1

原创 Android源码网站

Android源码网站提供两个比较常用的袁爱民网站https://www.androidos.net.cn/sourcecode网站有Android各个版本的全部源码,包括SDK、Framework、硬件驱动等,适合Framework开发人员http://androidxref.com/网站有Android 9之前的SDK源码,优点是可以做全局的搜索,不仅可以搜文件名,还可以搜方法名和调用情况,缺点是有点慢,源码下载下来看...

2021-04-06 19:02:58 2014

原创 Android 原生应用嵌入React-Native模块开发-环境配置及填坑记

1.Can't find variable: __fbBatchedBridge还是在项目的根文件夹下,命令行运行如下命令,启动测试服务器。$ npm start但是部分Android 6.0的机型,每次启动后依然会报错,必须打以下命令才可以adb reverse tcp:8081 tcp:80812.Caused by: java.lang.IllegalAc

2017-07-10 23:54:16 488

原创 Android架构师之路

很多Android的小伙伴在做了多年的开发之后,始终搞不清楚达到Android架构师需要何种技能,我们对比着Android高级工程师来说明。我们先来看一下Android高级工程师的招聘要求职位描述:Responsibility1. Android平台功能模块的设计与开发2. 移动端开发框架的研究与设计3. 移动端技术规范的制定与推广4. 移动端技术培训Require

2017-07-01 00:55:40 3999

原创 Android 状态机stateMachine的应用

研究Android源码发现很多状态机的应用,比如蓝牙,WiFi,事件处理等处,这些模块对于流程的要求很高,WiFi的连接到断开经历了一系列的操作 addState(mDefaultState); addState(mInitialState, mDefaultState); addState(mSupplicantStart

2017-06-24 02:30:05 1585

原创 Android 从源码分析BLE连接错误分析

项目中涉及低功耗蓝牙手柄的开发,GattCallback onConnectionStateChange接口返回状态status值有多个private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { @Override public void onConnection

2017-06-16 00:59:00 10750 4

原创 Android 蓝牙强度Rssi

1.什么是RssiRSSI(接收信号强度)Received Signal Strength IndicatorRss=10logP,只需将接受到的信号功率P代入就是接收信号强度(灵敏度)。[例1] 如果发射功率P为1mw,折算为dBm后为0dBm。[例2] 对于40W的功率,按dBm单位进行折算后的值应为:10lg(40W/1mw)=10lg(40000)=10lg4+10

2017-06-14 18:23:28 16705 1

原创 Android与YunOS 启动时间分析

阿里最近发布了YunOS 6系统,该系统其中一大特性是开机速度变的更快,比相同配置的Android系统手机缩短了一半时间。YunOS 6通过对开机服务依赖流水线化,更细定义系统的服务关系;发挥多核并发优势,可以让并行的程序跑得更快;消除冗余开机服务等措施,实现了15秒闪电开机,与谷歌Android N相比,在同等配置的手机上,YunOS开机时间缩短了一半。粗略测试一下华为P9开

2017-06-14 17:05:47 1261

转载 Android进程总结

一、概括系统启动架构图:上图在Android系统-开篇中有讲解,是从Android系统启动的角度来分析,本文是从进程/线程的视角来分析该问题。1.1 父进程在所有进程中,以父进程的姿态存在的进程(即图中的浅红色项),如下:kthreadd进程: 是所有内核进程的父进程init进程 : 是所有用户进程的父进程(或者父父进程)zygote进程 : 是所有上层Java进程

2017-05-24 13:40:54 530

原创 Android PhoneWindowManager WindowManagerGlobal WindowManagerImpl的作用和关系

WindowManagerService作为Window和输入事件的管理中心,这个是很容易理解的,而IWindowManager 的proxy端就不那么好理解的了,和WindowManager有关的就有PhoneWindowManager、WindowManagerGlobal和WindowManagerImpl三个,下面我们来简单分析一下三者的作用和关系。1.PhoneWindowM

2017-05-16 22:38:55 4423

原创 Android Home键之后启动Activity延迟5秒

按home键之后,所有activity的启动请求都延迟了5秒,下面我们分析一个系统是怎么做的 void launchHomeFromHotKey(final boolean awakenFromDreams, final boolean respectKeyguard) { if (respectKeyguard) { if (isKeyguard

2017-05-16 00:14:00 3479

转载 Android 插件化原理解析——Activity生命周期管理

之前的 Android插件化原理解析 系列文章揭开了Hook机制的神秘面纱,现在我们手握倚天屠龙,那么如何通过这种技术完成插件化方案呢?具体来说,插件中的Activity,Service等组件如何在Android系统上运行起来?在Java平台要做到动态运行模块、热插拔可以使用ClassLoader技术进行动态类加载,比如广泛使用的OSGi技术。在Android上当然也可以使用动态加载技术,

2017-05-10 17:32:18 361

转载 Android Fresco主要模块和特性

这是fresco官网的介绍,转自https://www.fresco-cn.org/Image PipelineFresco 中设计有一个叫做 Image Pipeline 的模块。它负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和CPU时间,它含有3级缓存设计(2级内存,1级磁盘)。DraweesFresco 中设计有一个叫做 Draw

2017-05-03 23:59:32 504

原创 Android 利用annotationProcessor生成Java代码

现在很多开源框架使用注解来解耦,但是利用反射来使用注解的方式很耗费性能,随着annotationProcessor和android-apt的出现通过注解根据反射机制动态编译生成代码的方式来解决在运行时不再使用发射机制,下面我们试着利用annotationProcessor和android-apt来替换反射的方式。 public static Map createPresenters(Ba

2017-05-03 11:29:43 1169

转载 让你彻底明白JAVA中堆与栈的区别

原文地址:http://www.2cto.com/kf/201302/190704.html简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即

2017-04-24 11:59:14 39443 12

原创 Android 获取蓝牙设备类型

之前我们分析了如何获取已连接的蓝牙设备地址http://blog.csdn.net/jasonwang18/article/details/61214431本篇我们分析如何获取对应蓝牙设备的类型,这个类型和profile不是同一个东西,而是具体蓝牙的设备类型,比如手机、电脑、手柄、蓝牙耳机等我们看到手机搜索到的蓝牙设备类型有三种,手机、电脑和普通蓝牙 /*

2017-04-17 16:55:38 12465 3

模块间通信源码

博客源代码

2017-07-26

空空如也

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

TA关注的人

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