摘要:
--摘自《Android进阶解密》 DVM和ART都是在Zygote进程中诞生的 *DVM和JVM的区别* 1.基于的架构不同 DVM是基于寄存器的,它没有基于栈的虚拟机在复制数据时而使用的大量的出入栈指令,同时指令更紧凑、更简洁。但是由于显式指定了操作数,所以基于寄存器的指令会比基于栈的指令要大, 阅读全文
摘要:
--摘自《Android进阶解密》 1.常说的JDK包含了Java语言、Java虚拟机和Java API类库这三部分,是Java程序开发的最小环境 2.JRE包含了JavaAPI中的Java SE API子集和Java虚拟机两个部分,是Java程序运行的标准环境 3.Java虚拟机上运行的语言不仅仅 阅读全文
摘要:
--摘自《Android进阶解密》 *WMS的职责* 1)窗口管理 WMS负责窗口的启动、添加和删除,另外窗口的大小和层级也是由WMS进行管理的 2)窗口动画 WMS的动画子系统WindowAnimator负责窗口间的切换动画 3)输入系统的中转站 InputManagerService会对触摸事件 阅读全文
摘要:
--摘自《Android进阶解密》 *WindowManger的关联类* 1.Window是一个抽象类,具体的实现类为PhoneWindow,它对View进行管理。WindowManager是一个接口类,继承自接口ViewManager,ViewManager是用来管理Window的,它的实现类为W 阅读全文
摘要:
--摘自《Android进阶解密》 *AMS家族* 1.Android 7.0的AMS家族 2.AMP和AMS进行通信 3.(Android 7.0)AMP是AMN的内部类,它们都实现了IActivityManager接口,这样它们就可以实现代理模式,具体来讲是远程代理:AMP和AMN是运行在两个进 阅读全文
摘要:
--摘自《Android进阶解密》 知识点: 1.Context的使用场景 1)使用Context调用方法,比如启动Activity、访问资源、调用系统级服务等 2)调用方法时传入Context,比如弹出Toast、创建Dialog等 2.Context的关联类 3.Context的关联采用了装饰模 阅读全文
摘要:
--摘自《Android进阶解密》 第一步:query方法到AMS的调用过程 1)ApplicationContentResolver是ContextImpl中的静态内部类,继承自ContentResolver,它在ContextImpl的构造方法中被创建,这说明我们调用ContentResolve 阅读全文
摘要:
--摘自《Android进阶解密》 一。广播的注册过程(动态注册) 1)静态注册在应用安装时由PackageManagerService来完成注册过程 2)IIntentReceiver是一个Binder接口,用于广播的跨进程的通信,它在LoadedApk.ReceiverDispatcher.In 阅读全文
摘要:
--摘自《Android进阶解密》 *Service启动过程* 第一步:ContextImpl到ActivityManagerService的调用过程 第二步:ActivityThread启动Service 1)ProcessRecord主要用来描述运行的应用程序进程的信息 2)LoadedApk是 阅读全文
摘要:
--摘自《Android进阶解密》 根Activity启动过程中会涉及4个进程,分别是Zygote进程、Launcher进程、AMS所在进程(SystemServer进程)、应用程序进程,关系图如下 其中步骤2采用的是Socket通信,步骤1和4采用的是Binder通信 如果是普通Activity启 阅读全文
摘要:
--摘自《Android进阶解密》 1.AMS在启动应用程序时会检查者应用程序需要的应用进程是否存在,不存在就会请求Zygote进程启动需要的应用程序进程 2.Zygote的Java框架层中会创建一个Server端的Socket,这个Socket用来等待AMS请求Zygote来创建新的应用程序进程 阅读全文
摘要:
--摘自《Android进阶解密》 一。启动电源以及系统启动 当电源按下时引导芯片代码聪预定义的地方(固化在ROM)开始执行。加载引导程序到BootLoader到RAM,然后执行 二。引导程序BootLoader 引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要 阅读全文
摘要:
--摘自《android插件化开发指南》 1.local.properties添加配置 2.gradle.properties添加配置 3.Android只支持3种CPU类型:x86体系、arm体系、mips体系,现在手机基本arm体系 4.arm体系分为32位和64位 1)armeabi/arme 阅读全文
摘要:
--摘自《android插件化开发指南》 1.制作插件的增量包:使用bsdiff(百度搜官网)最好在win系统下使用 然后把mypatch.diff放到服务器上供下载使用 2.下载解压记得申请SDCard的权限 3.App合并增量包 制作工具ApkPatchLibrary https://githu 阅读全文
摘要:
--摘自《android插件化开发指南》 1.插件不支持加固,宿主可以加固,此外,插件支持签名 2.一个正常的app在混淆时要遵守的规则如下 1)四大组件和Application要在AndroidManifest中声明,所以不能混淆 2)R文件不能混淆,因为有时要通过反射获取资源 3)support 阅读全文
摘要:
--《摘自android插件化开发指南》 1.有些项目,整个app只有一个Activity,切换页面全靠Fragment,盛行过一时,但有点极端 2.Activity切换fragment页面 第一步:FragmentLoaderActivity作为Fragment的承载容器 第二步: MainAct 阅读全文
摘要:
--摘自《android插件化开发指南》 1.一套完整的Android App打包流程(Gradle方案) 第一步:aapt。为res目录下的资源生成R.java文件,同时为AndroidManifest.xml生成Manifest.java文件 第二步:aidl。把项目中自定义的aidl文件生成相 阅读全文
摘要:
--摘自《android插件化开发指南》 1.当要传输的数据量大小不超过1M的时候,使用Binder;数据量超过1M时,Binder就搞不定了,需要ContentProvider 2.ContentProvider就是一个数据库引擎,向外界提供了CRUD的API ContentProvider插件化 阅读全文
摘要:
--摘自《android插件化开发指南》 1.静态广播和动态广播仅区别于注册方式的不同。静态广播的注册信息保存在PMS中,动态广播的注册信息保存在AMS中 2.发送广播,也就是Context的sendBroadcast方法,最终会调用AMN.getDefault().broadcastIntent, 阅读全文
摘要:
--摘自《android插件化开发指南》 1.ActivityThread最终是通过Instrumentation启动一个Activity的。而ActivityThread启动Service并不借助于Instrumentation,而是直接把Service反射出来就启动了。Instrumentati 阅读全文
摘要:
--摘自《android插件化开发指南》 1.宿主App加载插件中的类 2.最简单的插件化方案就是在宿主的androidmanifest.xml中申明插件中的四大组件 把插件dex合并到宿主dex中,那么宿主app对应的classloader就可以加载插件中的任意类 加载插件中的资源 以上方案有2个 阅读全文
摘要:
--摘自《android插件化开发指南》 fork了强哥的github代码到自己的github下 https://github.com/king1039/Dynamic3 将代码跑起来,Plugin1和Plugin2打成apk放到HostApp的assets下 贴下主要代码 简单来说,就是针对不同的 阅读全文
摘要:
--摘自《android插件化开发指南》 1.android资源文件分为两类: 第一类是res目录下存放的可编译资源文件,编译时,系统会自动在R.java中生成资源文件的十六进制值 第二类是assets目录下存放的原始资源文件,apk在编译时不会编译assets下的资源文件 2.Resources内 阅读全文
摘要:
--摘自《android插件化开发指南》 1.Activity的startActivity和Context的startActivity都是在app进程中通知AMS要启动哪个Activity,都是调用Instrumentation的execStartActivity。 方案一: 一般所有Activit 阅读全文
摘要:
--摘自《android插件化开发指南》 1.设计模式 2.远程代理(AIDL) 3.保护代理(权限控制) 比如:老板的秘书 4.虚代理(图片占位) 比如:微信图片查看,先用模糊的小图占位,然后替换成清晰的大图 5.协作开发 A要用到B中的方法,但是B还没有开发完,那么B就提供一个假的方法,返回假的 阅读全文
摘要:
--摘自《android插件化开发指南》 前面是基本封装,后面是进一步的封装 一。基本封装 No1: 构造函数 No2: 实例方法 No3: 调用静态方法 No4: 设置字段的值 二。进一步封装 其实就是重构了一下 只要掌握了基本的java反射,就能够封装出来 欢迎关注我的微信公众号:安卓圈 阅读全文
摘要:
--摘自《android插件化开发指南》 1.jOOR库就一个Reflect.java类很重要 2.Reflect.java包括6个核心方法 1)on:包裹一个类或者对象,表示在这个类或对象上进行反射 2)create:用来调用之前的类的构造方法 3)call:方法调用 4)get:获取(field 阅读全文
摘要:
--摘自《android插件化开发指南》 No1: No2: No3: No4: No5: Class的getDeclaredConstructors方法可以获取所有构造函数,包括public和private的 No6: Class的getConstructors方法只能获得所有的public构造函 阅读全文
摘要:
DexClassLoader可以加载外部的dex,而PathClassLoader只能加载内部的dex 双亲委托 双亲委托的意义是为了性能,每次加载都会消耗时间,但如果父亲加载过,就可以直接拿来使用了 1.混淆会将app中用不到的方法全部删除 2.android 5.0修复了方法数65536的爆棚问 阅读全文
摘要:
--摘自《android插件化开发指南》 1.PackageManagerService(PMS)是用来获取apk包的信息的 2.AMS总是会使用PMS加载包的信息,将其封装在LoadedApk这个类对象中,然后从中取出清单文件申请的四大组件信息 3.为什么app安装时,不把它解压呢?因为每次从ap 阅读全文
摘要:
--摘自《android插件化开发指南》 1.系统管理类app,比如手机助手,有机会频繁使用ContentProvider 2.通讯录或者短信数据,是以ContentProvider的形式提供的 3.ContentProvider的本质是把数据存储在SQLit数据库中 4.ContentProvid 阅读全文
摘要:
--摘自《android插件化开发指南》 1.动态注册过程是注册Receiver并通知AMS,发送内容包括IntentFilter、一个实现了IIntentReceiver接口的Binder对象、activity所在的进程。 2.AMS收到消息后,会把所有Receiver保存在一个列表中 3.静态R 阅读全文
摘要:
--摘自《android插件化开发指南》 一.在新进程启动Service 第一步:APP向AMS发送一个启动Service的消息 通过AMN/AMP把要启动的Service信息发送给AMS 第二步:AMS创建新的进程 这一步,AMS会检查Service是否在AndroidManifest中申明。AM 阅读全文
摘要:
--摘自《android插件化开发指南》 1.ContextWrapper只是一个包装类,没有任何具体的实现,真正的逻辑都在ContextImpl里面 2.应用程序中包含多个ContextImpl对象,而其内部变量mPackageInfo指向同一个PackageInfo对象 3.Context的st 阅读全文
摘要:
--摘自《android插件化开发指南》 1.AMS管理着四大组件 2.为什么Hook不能在AMS那边?因为AMS属于android系统,android系统可以被Hook,那就是病毒了。四大组件被Hook,只会影响某一个app 3.手机屏幕就是一个Activity,所在的app被称为Launcher 阅读全文
摘要:
--摘自《android插件化开发指南》 1.自定义一个aidl文件后,android会帮助生成一个java文件,其中包括一个接口IInterface,两个类Stub和Proxy。为什么不分开3个文件,是因为当有多个AIDL时,Stub和Proxy就有可能重名 2.Stub的asInterface判 阅读全文
摘要:
--摘自《android插件化开发指南》 1.Binder分为Client和Server两个进程: client和server是相对的。谁发消息,谁就是client;谁接收消息,谁就是server。 2.ServiceManager复责把Binder Server注册到一个容器中 3.Binder的 阅读全文
摘要:
No1: No2: No3: No4: ajax No5: handler No6: proxy No7: http No8: cookie No9: 抓取内涵段子 No10: 抓取百度贴吧美女图 No11: 抓取百度图片 No12: 知乎登录 No13: json解析 No14: xml解析 No 阅读全文
摘要:
No1: 引入MySql:python2是Mysqldb,python3是pymysql No2: Connection对象 用于建立与数据库的连接 创建对象:调用connect()方法 参数host:连接的mysql主机,如果本机是'localhost' 参数port:连接的mysql主机的端口, 阅读全文
摘要:
No1: 聚合 聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg() No2: 管道 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的输入 在mongodb中,管道具有同样的作用,文档处理完毕后,通过管道进行下一次处理 常用管道 $group:将集 阅读全文