自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SandHook 之 Native Inline Hook

简介在 SandHook ART Hook 稳定之后,抽空把 Native Inline Hook 实现了,虽然有重复造轮子的嫌疑,但确实是本人一行一行码出来的,基本所有的东西都是自己实现的。Github: https://github.com/ganyao114/SandHook支持目前支持ARM32ARM64其实 X86 非常好实现,但是想了一下还是往后稍稍吧,等 ARM 稳...

2019-05-27 11:26:18 3445 3

原创 Android ART Hook & 注入实现细节

author: Swift Gantitle: Android ART Hookdate: 2019/04/01SandHookAndroid Art HookSwift GanAgenda简介ART Invoke 指令生成基本实现指令检查Xposed 支持inline 处理Android Q架构图进程注入简介SandHook 是作用在 Android ...

2019-04-11 11:14:58 6885 1

原创 SandHook 第四弹,Android Q 支持 & Hidden API & Inline 的特别处理

SandHook目前支持 4.4 - 10.032/64 bit支持 Xposed APIGithub:https://github.com/ganyao114/SandHookAndroid Q 支持Hidden Api这个是从 Android P 就开始引入的反射限制机制。目前来说有几种方案:Hook 法,Hook 某些判断函数,修改 ART 对限制 API 的判断流程...

2019-03-15 21:08:08 3167 4

原创 Android ART invoke 代码生成

前言在前面 SandHook 系列我们知道 ArtMethod 入口替换并不能覆盖所有的方法,而且这个问题比预想的严重的多的多。而导致 Hook 不到的原因不仅仅是 inline 优化,Inline 只是小头,真正主要的原因是 Art Optimizing 代码生成的 Sharpening 优化。Quick & OptimizingART 中的 Compiler 有两种Quic...

2019-03-03 23:01:50 1633

原创 SandHook 第三弹 - 性能优化 & Xposed 模块 & 阻止 VM Inline

简介前面有提到过 SandHook 需要手动写一个 Hook 方法作为 Hook 的入口,所以想要兼容 Xposed Callback 式 API 就必须凭空生成一个 Hook 方法来转发 Xposed Callback 逻辑。所以我选择了 DexMaker,但是 Dexmaker 生成代码并且加载的时候还是太慢了,尽管只需要第一次生成(后面只需要加载即可),第一次 Hook 一个函数大概需要...

2019-02-22 22:38:17 5638

原创 SandHook 第二弹 - Xposed API 兼容 & 指令检查 & 进程注入

Xposed API 兼容由于 SandHook 需要手动写一个签名与目标方法相同的 Hook 方法,如果想把 API 包装成类 Xposed 的 Callback 式 API 是比较困难的,首先参数列表的解析就需要另外实现。Epic 是用写好的一堆 Stub 函数进行分发,SandHook 参考了 EdXposed(YHAFA 的封装) 使用 Dexmaker 动态生成 Hook 函数。动态...

2019-02-12 16:07:09 5850

原创 Android ART Hook 实现 - SandHook

简介Github: https://github.com/ganyao114/SandHook关于 Hook,一直是比较小众的需求。本人公司有在做 Android Sandbox(类似 VA),算是比较依赖 Hook 的产品,好在 Android Framework 大量使用了代理模式。所以也不用费劲在VM层作文章了,直接用动态代理即可。然而,VM 层的 Java Hook 还是有些需求的,...

2019-01-27 16:11:20 22799 4

原创 OS虚拟内存管理 - Zircon(ARM64)

前言

2019-01-19 21:02:22 2960 4

原创 Android ART hook 框架 YAHFA 的 Bug 修复以及改进建议

YAHFA目前简单找了一下 Android 上的 ART Hook Epic 和 YAHFA 较为流行,支持的版本也比较好 5.0 - 9.0,所以看了一下 YAHFA 源码并且跑了一下 demo。Bug使用中发现在 5.0 - 6.0 的 64 位机器上会挂掉,调试了一下发现 YAHFA 在试图获取 dexCacheResolvedMethods 列表时读到了非法地址。因为 ArtMet...

2019-01-15 17:52:45 2165

原创 Zircon - Fuchsia 内核分析 - 启动(内核初始化)

简介前面已经介绍了 Zircon 内核启动的汇编代码部分,主要是一些 CPU 的初始化。现在 prime CPU 已经来到了 C 世界的 lk_main() 函数其他 CPU 也来到了 arm64_secondary_entry() 函数lk_mainlk_main() 是打开 Zircon 内核世界的大门,由 prime cpu 敲开,一眼望去你就会发现 lk_main 一行行代码目的...

2019-01-10 16:14:25 12194 3

原创 Zircon - Fuchsia 内核分析 - 启动(平台初始化)

简介Zircon 是 Google 新操作系统 Fuchsia 的内核,基于 LK - Little Kernel 演变而来。而 Little Kernel 前面一直作为 Android 系统的 Bootloader 的核心而存在。Zircon 在此基础上增加了 MMU,System Call 等功能。Zircon 目前支持 X86/X64 和 ARM 两种 CPU 平台,下面我将以 ARM6...

2018-12-23 16:30:30 16563 1

原创 Fuchsia - 编译及运行

Fuchsia 的编译及运行是非常简单的,至少在 Mac 上如此,中间没有出现任何讨厌的错误获取源码首先需要安装 Homebrew,这个随便百度xcode-select --install安装最新 xcode,近期的版本也可以curl -s “https://fuchsia.googlesource.com/scripts/+/master/bootstrap?format=TEXT”...

2018-12-16 15:43:47 2601 2

原创 Fuchsia - 简析

一点猜测Fuchsia 是为了取代 Android 的吗?我觉得不是的,因为现在 Android 作为移动平台的操作系统已经非常成熟,暂时也没有遇到影响演进的瓶颈,Fuchsia 如果是为了代替 Android 而做的话则不合逻辑。那么 Fuchsia 为何而生?谷歌可能想让 Fuchsia 成为一个兼容 PC/平板/手机/IOT 的统一平台,虽然目前 Android 有能力运行在 平板/...

2018-12-15 21:39:57 7170

原创 JVM JIT(JAMVM)

简介为了提高虚拟机的执行效率,对于解释执行的虚拟机来说,解析字节码指令和指令分发的开销时非常巨大的。可以想象 Native Code 执行 1 + 2 仅仅需要一行机器指令,而栈则需要 取指令->匹配指令 handler -> 跳转到 handler -> 执行 handler 至少 4 条机器指令。简单来说,执行一条 jvm 指令需要耗费数倍于同等机器指令的周期。对于偶尔...

2018-11-30 10:44:28 931

原创 JVM 解释器优化(JAMVM)

简介在前面的文章中有介绍过 miniJVM 的具体实现,但是 miniJVM 的解释器部分仍然是比较简单的 Switch 指令分发,从执行效率上来说是比较落后的。同样是轻量级的 JVM,jamvm 在性能方面就要优秀很多,最新版本 2.0.0 支持了 openjdk8,并且支持 java 8 的所有特性,包括 miniJVM 不支持的 Reference。jamvm 已经非常古老了,Andr...

2018-11-21 17:48:36 1041

原创 记一次 JVM 源码分析(5.异常处理)

异常异常打印Java 如果发生异常,通常会调用 Throwable.printStackTrace 去打印堆栈信息。堆栈信息包括完整类名,方法名,java 文件名,行号而这样的信息根据发生 Crash 线程所经历的n个方法会打印出n行。整个过程被称为栈回朔栈回朔栈回朔的过程发生于异常被 New 出来的时候Throwable.backtrace 这个 Throwbale 的成员变量就...

2018-11-14 12:21:51 383

原创 记一次 JVM 源码分析(4.解释器与方法执行)

简介miniJVM 作为一个 mini 的 Java VM,实现了 Switch 解释器,并不支持主流 JVM 的 JIT 或者更为复杂的 AOT。但这样对于我们了解字节码的执行已经足够了。字节码指令基于堆栈字节码指令类似于汇编指令,但是不同的是:一行汇编代码的格式一般都是 - opcode 操作数1 操作数2然而字节码指令格式是 opcode + 栈字节码的所有操作数都存在运行...

2018-11-13 15:33:07 1229 4

原创 记一次 JVM 源码分析(3.内存管理与GC)

简介miniJVM 的内存管理的实现较为简单

2018-11-08 12:41:25 1377 1

原创 记一次 JVM 源码分析(2.初始化与类加载)

前言首先概括一下 JVM 运行流程:JVM 初始化  加载主类    运行 Main 方法      加载其他类        运行其他方法  GC 开始JVM 初始化JVM 的入口位于 /mini_jvm/main.c ----- main() 方法main 方法的主要任务是:解析参数并保存留到后面初始化的时候读取最后带着参数 List 进入到真正的入口:ret =...

2018-11-05 22:06:11 825 4

原创 记一次 JVM 源码分析(1.简介)

简介  本来打算直接看 ART 的源码,一看 Android P 的已经十分庞大了,所以打算找一个小型的 JVM 热热身,想起了以前功能机上的 Java KVM,但是又太过古老。翻 github 偶然翻到一个开源的 Mini Jvm,竟然还支持 Java8 标准,所以准备以此入手了解 JVM。Mini JVMMiniJVM 原始 repo:https://github.com/digital...

2018-11-05 20:59:22 652

原创 AppBarLayout + RecycleView 滑动后,item 在一段时间内无法点击的问题

1

2018-06-11 14:31:58 3049 11

原创 Android 被动依赖注入框架

1.lazyInject被动依赖注入框架 for Android Github2.配置关闭 Instant RunSetting->Build->Instant Run 此项功能与 AspectJ(本项目依赖 AsoectJ) 冲突 Gradle根目录/build.gradle buildscript { ... ...

2018-04-17 17:13:58 2104

原创 Android O 8.0 BroadcastReceiver 注册工具

关于 Android O   不出意外,为了控制 App 自动唤醒,Google 在新系统中又一次严格控制了 App 的后台行为,这一次在 Menifest 中注册的广播 Action 大部分都失效了。    为了方便在 8.0 上继续使用 Menifest 注册 Receiver,只能手动解析 Menifest 转为动态注册。所以顺手写了这么一个工具。  github     使用导入项目中

2017-08-08 13:05:39 3984 2

原创 Android 双开沙箱 VirtualApp 源码分析(六)ContentProvider

上一章:Android 双开沙箱 VirtualApp 源码分析(五)BroadcastReceiverProvider 注册回顾前面,Activity 启动的时候会检查 Application 是否初始化,会调用 bindApplication,里面执行了安装 Provider 的方法:private void installContentProviders(Context app, List<P

2017-07-28 15:07:50 6414 3

原创 Android 双开沙箱 VirtualApp 源码分析(五)BroadcastReceiver

上一章:Android 双开沙箱 VirtualApp 源码分析(四)启动插件 Service方案猜测同 Activity 一样,Client App 在 Menifest 中注册的静态广播外部 AMS 是无法知晓的,经过前几章的分析,相信大家已经是老司机了,我们可以先尝试提出自己的观点。 1. 和 Activity 一样使用 Stub 组件占坑?仔细想一想是无法实现的,因为你无法预先确定

2017-07-28 11:53:27 6785 2

原创 Android 双开沙箱 VirtualApp 源码分析(四)启动插件 Service

上一章:Android 双开沙箱 VirtualApp 源码分析(三)App 启动原生 Service 创建过程首先有必要了解一下原生 framework 对 Service 的创建,因为在 VA 中启动 Service 和 Activity 有很大的区别。首先入口 ContextWrapper.startService():@Override public ComponentName st

2017-07-27 17:23:27 7201 2

原创 Android 双开沙箱 VirtualApp 源码分析(三)App 启动

上一章:Android 双开沙箱 VirtualApp 源码分析(二) 在这之前,我们还是要先了解一下 VA Client Framework 和 VAService 之间的通讯方式VAService 与通讯VAService首先,VAService 是指 VA 仿造 Android 原生 framework 层 Service 实现的一套副本,举例有 VActivityManagerServic

2017-07-27 13:17:10 15371 10

原创 Android 双开沙箱 VirtualApp 源码分析(二)

上一章:Android 双开沙箱 VirtualApp 源码分析(一)VA 初始化先看一下代码: VirtualCore.startuppublic void startup(Context context) throws Throwable { if (!isStartUp) { // 确保 MainThread if (Loo

2017-07-26 16:00:10 14413 3

原创 Android 双开沙箱 VirtualApp 源码分析(一)

最近发现了一个非常好的开源项目,基本实现了一个 Android 上的沙箱环境,不过应用场景最多的还是应用双开。 VA github: https://github.com/asLody/VirtualApp VA 的源码注释: https://github.com/ganyao114/VA_Doc 第一章主要是分析一下项目的整体结构。包结构android.content主要是 PackageP

2017-07-26 14:46:15 39204 8

原创 Retrofit 原理简析

简介  Retrofit 所做的事情简单来说就是将你的 Http 业务 API --> Http 请求实现,类似于 Spring MVC 中的 Controller,它的主要任务是解析你的业务接口,从接口上获取你的 Http 接口协议,然后组装 Http 请求,进行异步 Request。  Retrofit 整合了多个组件,包括 JSON/XML 的 ORM 映射,用于解析返回值;Http

2017-07-20 15:20:37 1001

原创 Android 架构设计 本科《毕业论文》

不知不觉学生时代已经结束,由于在 Android 上面花了不少功夫,所以这次毕业论文也是对我 Android 学习的一次总结,基本上都是自己写的。有关 Android 架构设计的一些想法,当然也有一些主流 Android 框架的源码解析(biru可以下来看一看。文档下载地址:https://github.com/ganyao114/Android_Architecture目录:

2017-07-20 14:56:54 5059 2

原创 java 反编译器源码分析

简介由于工作需要反编译分析 java 源码,于是需要反编译器做些改动,所以就有了这篇文章。这次要分析的反编译器是 Femflower,是著名 IDE Idea 的反编译器。源码也是从 Idea 开源部分抠出来的。[Github](https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/

2017-04-30 23:27:57 5157

原创 Android MVP 实现。基于Dagger2 + RxJava + Retrofit2 + Realm + ButterKnife + EventBus

前言随着 Android 项目的越来越大,主流正在向 MVP 靠拢,但是一直没有一个比较好的较为通用的实现模式。那么下面结合一些人的做法介绍一下我的想法。基础模块1.Dagger 2 依赖注入模块项目各个模块使用 Dagger 2进行依赖的管理以解耦各个模块。MVP 三层间使用 Dagger 2进行生命周期以及依赖的管理。各个组件使用接口进行抽象,各种实现使用 Dagger 2 进行拼装,实现

2016-10-29 10:28:36 5195 3

原创 打造超越 EventBus 的事件管理框架

EventPoster一.目的 二.概述以及优势 1.模块化,易扩展 2.缓存管理 3.预加载 4.对于注册的实例的管理,防止 Leak 5.各模块 Handler 的管理 三.用法 1.与 MVP 结合使用 2.接口 3.扩展模块一.目的 纯粹的想做一个轮子,已经有 EventBus 了,为什么还要去做?

2016-10-18 11:53:40 1497

原创 Android ViewPage+Fragment伸缩实现菜单效果,仿Ifanr

先上Ifanr效果 实现效果 1.布局xml 设置android:clipChildren=”false” 使子View在ViewPage被缩放时允许超出ViewPage的范围 activity_main.xml<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.androi

2016-09-22 22:12:10 2122

原创 Android App架构设计

前言Web的架构经过多年的发展已经非常成熟了,我们常用的SSM,SSH等等,架构都非常标准。个人认为,Web服务逻辑比较清晰,目的明确,流程也相对固定,从服务器收到请求开始,经过一系列的的拦截器,过滤器->被转发到控制器手中->控制器再调用服务->服务再调用DAO获取想要的数据->最后把数据返回给web层。哪怕中间增加一些东西,如缓存什么的。他的模型依然是以用户请求的线程为生命周期,经过一个个切面(

2016-09-20 14:35:17 7650 1

原创 Android性能优化总结

简要总结一下Android性能优化。一.  加载预加载:1.反射注解框架Reflect信息,在Application内多线程预加载至缓存。2.资源预加载懒加载:1.Fragment懒加载2.资源懒加载二.  缓存1.    Http缓存,淘汰时间2.    图片缓存,bitmap压缩,Lru淘汰,持久化二级缓存3.    反射注解框架Reflect信息缓存,防止

2016-09-19 22:17:19 1039

原创 关于synchronized与lock的性能比较

记得当初看教程的时候大家都说lock性能比好不少,最近需要自己设计一个缓存终于要自己尝试一番了。1.关于两者的实现的比较A).一般认为synchronized关键字的实现是源自于像信号量之类的线程同步机制,涉及到线程运行状态的切换,在高并发状态下,CPU消耗过多的时间在线程的调度上,从而造成了性能的极大浪费。然而真的如此么? B).lock实现原理则是依赖于硬件,现代处理器都支持CAS指令,所谓C

2016-09-09 13:41:35 13291 4

原创 [Android源代码分析]Android消息机制,Handler,Message,Looper,MessageQueue

最近准备把Android源码大致过一遍,不敢私藏,写出来分享给大家,顺便记录一下自己的学习感悟。里面一定有一些错误的地方,希望广大看客理解理解。 网上也有不少分析文章,这里我尽量分析的更加细致详尽。不留死角。一.核心循环体:Looper.loop();我们知道,在线程run()中Looper.prepare();Looper.looper()。之后这个线程就是一个HandlerThread了。我们

2016-09-05 10:37:49 1843 2

原创 Android数据绑定,MVVM框架,SpringMVC for Android

最近研究怎么让自己的程序节省几行代码。仔细想一想,我们在做客户端类的APP时,最基础,大量重复的场景就是:1.从服务器请求数据2.解析得到的数据并处理加以封装3.将封装好的数据送到UI线程显示到View上。那么,不可避免的。一次流程我们需要编写:http数据请求,JSON解析处理,异步处理,Handler,业务异常处理,View显示,如果有集合控件,还得写ViewHolder,Adapte

2016-08-31 22:46:52 1717

刷刷Android B端早期demo

刷刷Android B端早期demo

2016-09-19

空空如也

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

TA关注的人

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