- 博客(68)
- 收藏
- 关注
原创 Activity启动3-startActivityLocked方法
int startActivityLocked(IApplicationThread caller, Intent intent, Intent ephemeralIntent, String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo, IVoiceInteractionSessi...
2018-10-21 20:26:50
2443
2
原创 Activity启动2-startActivityMayWait方法
我们从上一节分析参数开始最终达到:result = mInterface.startActivityAndWait(null, null, intent, mimeType, null, null, 0, mStartFlags, profilerInfo, ...
2018-10-21 18:49:20
3054
原创 Activity启动1_参数解析
Am.javapublic static void main(String[] args) { (new Am()).run(args);}public void run(String[] args) { if (args.length < 1) { onShowUsage(System.out); return; } ...
2018-10-21 17:12:24
2393
原创 log分析
log分析用于定位一些无法断点调试的一些疑难杂症。所以需要熟悉bugreport到底有哪些内容,哪些模块都打印log。读完下文你会有不一样的认识。基于Android O源码命令:adb bugreport > bugreport.txt源码:#include <errno.h>#include <stdio.h>#include <sys/sock...
2018-10-14 19:48:22
3029
原创 Glide附件难点之上篇源码文章
注册Glide.Glide()GenericLoaderFactory的注册register(File.class, ParcelFileDescriptor.class, new FileDescriptorFileLoader.Factory());register(File.class, InputStream.class, new StreamFileLoader.Fact...
2018-10-14 14:44:53
268
原创 Glide源码基本流程跑通
withpublic static RequestManager with(Activity activity) { //单例返回RequestManagerRetriever对象,构造中对应主线程 RequestManagerRetriever retriever = RequestManagerRetriever.get(); //多个重载方法 return ...
2018-10-14 14:38:28
228
原创 主dex类的划分规则
执行task的入口代码:// ---------// create the transform that's going to take the code and the proguard keep list// from above and compute the main class list.Transform multiDexTransform;if (usingIncreme...
2018-10-05 17:09:52
817
原创 Volley源码分析
1. 创建一个请求队列RequestQueue queue = Volley.newRequestQueue(context)对应源码分析:public static RequestQueue newRequestQueue(Context context, BaseHttpStack stack) { BasicNetwork network; if ...
2018-08-14 13:34:23
206
原创 Android异步处理
Android异步处理大家好,我叫王菜鸟,今天给大家分享的内容是Android中异步的处理。那下面我们就从几个方面开始介绍Android中的异步操作。什么是同步,什么是异步。为什么要异步?Android中异步有哪些?对应这些异步操作的原理是什么?如何进行异步操作?什么是同步,什么是异步?同步,异步可以理解成是形容词,修饰一次方法的调用,同步方法一旦开始,调用者必须等到...
2018-06-24 18:33:34
2414
原创 VirtualAPK滴滴插件化框架源码深入解读
初始化部分PluginManager.getInstance(base).init();保证单例private static volatile PluginManager sInstance = null;public static PluginManager getInstance(Context base) { if (sInstance == null) { ...
2018-06-12 19:45:02
477
原创 LinkedBlockingQueue与生产消费模型
生产消费模型ReentrantLock提供了tryLock方法,tryLock调用的时候,如果锁被其他线程持有,那么tryLock会立即返回,返回结果为false;如果锁没有被其他线程持有,那么当前调用线程会持有锁,并且tryLock返回的结果为true。对于ReentrantLock来说,还有一个十分实用的特性,它可以同时绑定多个Condition条件,以实现更精细化的同步控制。 R...
2018-06-05 12:01:30
687
原创 最简单的生产者消费者demo
package demo1;import java.util.Queue;public class Consumer extends Thread { private final Queue sharedQ; public Consumer(Queue sharedQ) { super("Consumer"); this.sharedQ = ...
2018-06-04 18:07:42
1330
原创 ThreadLocal源码分析
我们不从把ThreadLocal源码直接复制到这里进行挨个分析,我们把使用列出来,找出突破点进行分析public static final ThreadLocal<String> mThreadLocal = new ThreadLocal<String>() ; public static void main(String[] args) { ...
2018-06-04 18:07:10
145
原创 Android View 绘制原理
我想了想,如果直接从ViewGroup里面的方法谈起,可能和网上很多博客一样了,但是如果只是向framework开发者分析哪些,又分析不到应用层,所以我觉得应该从performDraw()这个方法开始分析绘制,因为如果在向framework层深入,那就会接触到WindowManagerService,这个过程需要掌握Binder知识,但是Binder知识很多人一时半会掌握不了,尤其是对于appli...
2018-06-01 16:09:09
1430
原创 Android View排版原理
由于performLayout之前是performMeasure()操作,所以不熟悉测量的小伙伴看我上一篇博客Android View 测量原理 我想了想,如果直接从ViewGroup里面的方法谈起,可能和网上很多博客一样了,但是如果只是向framework开发者分析哪些,又分析不到应用层,所以我觉得应该从performLayout()这个方法开始分析测量,因为如果在向framework层深入,...
2018-06-01 14:52:33
358
原创 Android View 测量原理
MeasureSpec封装了父布局传递给子View的布局要求。MeasureSpec可以表示宽和高MeasureSpec由size和mode组成//获取大小或模式int specSize = MeasureSpec.getSize(measureSpec)int specMode = MeasureSpec.getMode(measureSpec)//设置int measu...
2018-06-01 10:37:38
539
原创 多次请求网络的小锅
bug描述今天有个bug需要我处理,业务逻辑是这样的:搜索框中的文本,对应一次请求。但是之前的代码逻辑是这样的,在子线程需要执行时进行判断是不是网络请求的结果可以从缓存中获取,如果不行则进行开启线程请求网络。用线程池管理,Executors.newSingleThreadExecutor(),乍眼看没什么问题,但是问题却很大,因为访问网络到结果放入缓存中这个过程是耗时的,但是其他部分的刷新...
2018-05-30 19:49:57
372
3
原创 Android中窗口添加的过程
Window的分类系统级Window : z-ordered为 2000-2999应用层Window : z-ordered为 1-99子Window : z-ordered为 1000-1999根据下面谷歌的Android层级图可以看出来WindowManager是在framework层掌管Window的 从代码上看WindowManager是一个接口,此接口继承自...
2018-05-29 11:43:38
1234
原创 include、merge、ViewStub分析
include、merge、ViewStub分析include的使用:<include android:id="@+id/my_layout" layout="@layout/include_layout" android:layout_width="wrap_content" android:layout_height="wrap_content...
2018-05-28 16:05:35
304
原创 通过堆栈看事件传输
如何调试事件传输在自己Activity中打印下堆栈 @Override public boolean dispatchTouchEvent(MotionEvent ev) { Thread.dumpStack(); return super.dispatchTouchEvent(ev);}W/System.err: java.lang.Throwabl...
2018-04-10 15:13:20
485
原创 Hook技术(五)如何Hook系统中任意服务
获取服务&注册 ServiceManager.getService()public static IBinder getService(String name) { try { IBinder service = sCache.get(name); //先从缓存中查看 if (service != null) { ...
2018-03-15 15:48:58
5948
3
原创 Hook技术(四)对系统启动Activity进行Hook之偷梁换柱Activity
引出问题我们如果要启动一个activity,我们的做法是1. 在AndroidManifest.xml中声明一个Activity 2. startActivity,如果不在AndroidManifest.xml中声明,启动activity会报错(android.content.ActivityNotFoundException)。但是我们想,我们使用插件化,按照正常的思维是不是要将插件化中的所...
2018-03-12 18:05:05
2400
3
原创 hook技术(三)对AMS&PMS进行Hook
本文基于Android系统源码8.0版本进行hook抛出问题AMS是什么?从启动Activity的角度看app如何和AMS交互hook点在哪里?AMS是什么?AMS是Android框架层用来管理四大组件的管家类并且负责进程的启动消亡和优先级的调度,是Android系统的核心服务。从启动Activity的角度看app如何和AMS交互我们知道activity...
2018-03-12 13:08:11
1782
原创 Hook技术(二)对系统服务Hook
上一次,我们用Hook技术对startActivity进行了操作。我们这一届继续Hook一些比较深入的东西。更加深入的理解Hook。通过上一次,我们小结,Hook就是用我们的代理去替换原本的服务,然后达到拓展的目的,甚至改变原有服务的目的。那我们今天就尝试改变系统剪贴板。要想改变系统剪贴板,我们就得了解剪贴板服务最基本的流程,从而我们好控制系统剪贴板的Hook点在哪里。 剪贴板服务的基...
2018-03-12 13:07:35
974
原创 Hook技术(一)对startActivity进行简单Hook
目的这篇文章是让大家体会hook技术大概是什么样子,在那些地方可以应用到。后面文章将深入hook技术,以及解析市面上现有的hook开源框架原理。在前面的文章中我们已经说过什么是代理模式,那我们就先使用最简单的静态代理模式应用在我们的hook技术中。我们先复习一下静态代理模式。/** * 定义Demo接口 */ public interface Demo { ...
2018-03-12 13:07:03
1709
原创 自定义注解
++如果没有基础的同学必须先看我前面的java动态代理模式和java注解基础和java反射总结这几篇文章++ 分析注解起到一个规范作用&获取值得作用,那么值拿到之后就需要操作值,怎么操作呢?当然通过反射,所以接下来就看如何搞。我们从最熟悉的调用开始展开。 特殊说明 其中Class,Constructor,Field,Method,Package都实现了A...
2018-03-11 10:49:03
157
原创 java动态代理模式
静态代理大家都明白,就是相当于包装了一次,在包装这一次的时候可以加一些业务逻辑。同样静态代理的特点是一个接口对应一个代理类,当然委托类可以多个。静态代理/** * 定义Demo接口 */ public interface Demo { public void save(); }/** * DemoImpl实现Demo接口并覆写save()...
2018-03-11 10:48:24
171
原创 java反射总结
所用到的类java.lang.Classjava.lang.reflect.Constructorjava.lang.reflect.Fieldjava.lang.reflect.Methodjava.lang.reflect.Modifier 作用: - 当一个类被加载以后,Java虚拟机就会自动产生一个Class对象。通过这个Class对象我们就能获得加载到虚拟机...
2018-03-11 10:47:47
265
原创 java注解基础
一:元注解元注解的作用就是负责注解其他注解1.@Target 说明: 用来指明注解所修饰的目标,包括packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数) 取值: 值 作用 英文描述 CONSTRUCTOR 用于描...
2018-03-11 10:47:01
229
原创 理解jvm如何加载类
简介 说道类加载器可能大家第一反应就是啊这个东西我没有接触过很难,而且一般情况下对于app开发应用也用不到类加载器,但是对于框架开发者来说类加载器就是家常便饭一样,那类加载器到底是什么东西,真的难道我们都不敢接触了吗?下面就听菜鸟给你慢慢解答!我会通过小标题的方式一步步让大家理解最终的答案因为小标题是理解最终答案的基础什么是类加载?jvm(java虚拟机)将xx.class文件读取到内存中,对
2017-12-17 20:38:03
1126
原创 apk资源打包过程分析
Android应用资源的分类assetsres animatoranimcolordrawablelayoutmenuraw:它们和assets类资源一样,都是原装不动地打包在apk文件中的,不过它们会被赋予资源ID java Resources res = getResources(); InputStream is = res .openRawResource(R.raw
2017-11-23 14:12:08
6885
原创 通过AMS.attachApplicationLocked()引入Binder.linkToDeath机制
当系统创建进程以后会调用AMS.attachApplicationLocked(),在这个方法内部会注册该进程的死亡回调//其中thread是ActivityThread通过夸进程通信获取Binder的代理对象,然后调用linkToDeath()AppDeathRecipient adr = new AppDeathRecipient(app, pid, thread);thread.asBin
2017-08-20 11:23:34
1319
原创 makefile编写
#设置当编译路径为当前文件夹所在路径LOCAL_PATH := $(call my-dir)#清空编译环境的变量(由其他模块设置过的变量)include $(CLEAR_VARS)其中:#BUILD_STATIC_LIBRARY:编译为静态库。 #BUILD_SHARED_LIBRARY :编译为动态库 #BUILD_EXECUTABLE:编译为Native C可执行程序 LOCAL_P
2017-08-14 20:21:30
537
原创 杀进程优先级
查看adj可以通过命令:adb shell//筛选进程ps | grep <包名|pid>//然后,其中oom_score_adj是内核计算过后的adjcat proc/<pid>/oom_score_adj 方法2adb shelldumpsys activity o//然后查看ProcessRecord中下面这些属性反应了oom_score_adj的值int maxAdj;
2017-08-14 20:20:08
1551
原创 Crash分析
adb shell//输出所有event_log中的tagcat /system/etc/event-log-tags 常用tag:am_low_memory:位于AMS.killAllBackgroundProcesses或者AMS.appDiedLocked,记录当前Lru进程队列长度。am_pss:位于AMS.recordPssSampleLocked(am_meminfo:位于AM
2017-08-14 20:19:15
4056
原创 标志性log关键词
adb shell//输出所有event_log中的tagcat /system/etc/event-log-tags 常用tag:am_low_memory:位于AMS.killAllBackgroundProcesses或者AMS.appDiedLocked,记录当前Lru进程队列长度。am_pss:位于AMS.recordPssSampleLocked(am_meminfo:位于AM
2017-08-14 20:18:11
813
原创 发生ANR之后的事情
触发ANR条件Service Timeout:前台服务20s内未完成执行,后台服务超过200sBroadcastQueue Timeout:前台广播在10s内未完成,后台广播超过60s未完成ContentProvider Timeout:内容提供者,在publish过超时10sInputDispatching Timeout: 输入事件分发超时5s,包括按键和触摸事件对应最后执行ANR记录
2017-08-06 12:59:48
1146
原创 H.264小结
由于毕设做视频直播技术,所以需要学习h.264只是以下内容来自网络少说话来一发H.264是干什么的? 首先我们得明白,我们研究h.264为的是什么,其次我们得明白一些基础概念,然后才是具体实施。下来我们说下h.264是做什么的。h.264具体是压缩视频的,如果不压缩视频,在网络环境中传输可能导致流量耗费特别严重,而且传输过程中容易出错,所以h.264就是针对这些问题产生的。H.264基本概念
2017-06-10 09:31:53
621
原创 Jni使用
概述jni(Java Native Interface)是什么?它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。jni主要解决java限制的事情,或者要进行高效开发。
2017-04-05 10:19:56
407
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人