源码

apk反编译安装工具

会有一股神秘感。 提交于 2019-12-27 02:14:56
一、需要工具 apktool:反编译APK文件,得到classes.dex文件,同时也能获取到资源文件以及布局文件。 dex2jar:将反编译后的classes.dex文件转化为.jar文件。 jd-gui:用于将.jar文件转换成java代码。 二、apktool安装: 下载地址: https://ibotpeaches.github.io/Apktool/install/ ,看页面说明安装。 apktool d -s xxx.apk //编译apk 三、dex2jar安装: 源码下载地址: https://github.com/pxb1988/dex2jar 。 这里做个说明:很多地方可以下载,如: https://sourceforge.net/projects/dex2jar/files/ , 但是这些使用的时候会报错,像一下这样的: dex2jar classes.dex -> ./classes-dex2jar.jar Detail Error Information in Fil 看错误日志说的是: java.lang.RuntimeException: can not merge I and Z 具体原因看: https://www.jianshu.com/p/0306cb947d7a 现在是需要下载源码,编译修复好的源码拿到工具。( 别人修复了

StreamAPI源码分析之二(Collectors工厂类内部设计分析篇)

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-27 01:49:33
前言 前一小结对Collector接口进行了总结介绍,并没有对其实现进行展开,接下来对Collectors进行展开,Collections本身提供了关于Collectors的常见汇聚实现,Collectors其实就是一个工厂。collector由四个函数指定,这些函数一起工作,将条目 累积到可变结果容器中,并可以选择对结果执行 最终转换,将会在Collectors看到Collector的实习内幕。本节主要分析层次设计,不对细节方法进行深入分析,Collectors工厂类将以两小节进行分析,当我们看清楚Collectors工厂类内部设计的时候,可能对于源码的理解会更好。 1、Collectors介绍 Collector的实现,实现各种有用的reduction汇聚操作,例如将元素累积到集合中,根据各种条件汇总元素等。 以下是使用预定义收集器执行*常见可变缩减任务的示例: // 将姓名累加到列表中 * List < String > list = people.stream ( ) * .map ( Person::getName ) * .collect ( Collectors.toList ( )) ; * * // 把名字累加成树集 * Set < String > set1 = people.stream ( ) * .map ( Person::getName ) *

StreamAPI源码分析之三(Collectors工厂类方法基础打底篇)

拜拜、爱过 提交于 2019-12-27 00:41:37
前言 上一小节总结了Collectors工厂类内部除方法之外的设计,这一小节接着Collectors工厂类继续分析,对于Collectors工厂类的静态方法进行深入分析。但是如果直接进入静态方法分析,会出现大家不知道它的那些参数是谁传入的,反正有些静态方法是没有传入参数的,但是方法里面的实现是有参数传递的,这个可能理解起来不再像是原来的,你看到的方法有传参,实现效果已经知道的情况了,而是函数式方法写的方法不知道,但是用的时候会明确是什么类型,传入参数确定。 接下来就先基础打底,把目前JDK的函数式接口进行简单分析,太细节的这里就不作分析了,后面如果有人希望看到更细致的这些内部函数式接口的总结,可以给我留言,我会在后面考虑安排更细致的。ok,现在就先开始我们的基础打底吧。 前传 首先需要大家普及一下基础的函数式接口,不然没法理解静态函数式方法,一些参数不知所以,为啥没有传入参数,在方法实现里面就会有参数的流通,中间确实是有参数传入的,但是并不是函数自己本身,而是使用的时候类型推断传入的。 而这些新的函数式接口在java.util.function包下。 一、Function<T, R> @FunctionalInterface public interface Function < T, R > { /** * 将此函数应用于给定参数。 * * @param t 函数参数 *

【源码分析】01-Spring源码-AOP

爱⌒轻易说出口 提交于 2019-12-27 00:41:19
知识点1:SpringAOP原理 1、 什么是AOP编程 AOP: Aspect Oriented Programming 面向切面编程。   面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面(方面)编程。   主要的功能是: 日志记录,性能统计,安全控制,事务处理,异常处理 等等。   主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。   可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。 假设把应用程序想成一个立体结构的话,OOP的利刃是纵向切入系统,把系统划分为很多个模块(如:用户模块,文章模块等等),而AOP的利刃是横向切入系统

Spring源码:AOP转文

无人久伴 提交于 2019-12-26 23:59:05
Spring源码分析-深入浅出AOP(图文分析) https://blog.csdn.net/c_unclezhang/article/details/78769426 Spring中AOP的配置从1.0到5.0的演进 http://cxis.me/2017/04/10/Spring%E4%B8%ADAOP%E7%9A%84%E9%85%8D%E7%BD%AE%E4%BB%8E1.0%E5%88%B05.0%E7%9A%84%E6%BC%94%E8%BF%9B/ 来源: CSDN 作者: xyzroundo 链接: https://blog.csdn.net/xyzroundo/article/details/103722115

RxJava2.0 源码剖析

和自甴很熟 提交于 2019-12-26 23:14:24
RxJava2.0 源码剖析 一.Observable(被观察者/发射器) 二.Subscribe(订阅事件) 三.Observer(观察者) 这里我们先以一个最基础的使用case,来分析RxJava的实现原理。 Observable . create ( ObservableOnSubscribe < Int > { emitter -> ( 1 .. 3 ) . forEach { emitter . onNext ( it ) } } ) . map { i -> "I am value $i " } . subscribeOn ( Schedulers . io ( ) ) . observeOn ( AndroidSchedulers . mainThread ( ) ) . subscribe { str -> log ( str ) } 这个例子很简单:在IO线程中,发射器(被观察者)连续发射数字1,2,3,经过map转换为字符串,最后在主线程中进行输出即可。 RxJava的实现思想就是流式传递和观察者模式,下面我们以这两种模式的实现思路,来看下源码是如何实现的。 一.Observable(被观察者/发射器) Observable是被观察者,是发起活动的对象。 先看这段代码 Observable.create(ObservableOnSubscribe<Int> {}

CentOS 7 源码编译安装 Nginx

两盒软妹~` 提交于 2019-12-26 20:24:33
这里安装的是nginx 1.14版本 1.下载源码 #下载 wget http://nginx.org/download/nginx-1.14.0.tar.gz #解压 tar -xzf nginx-1.14.0.tar.gz cd nginx-1.14.0 2.安装编译环境 yum update yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel 3.编译安装 #添加用户和组 groupadd www useradd -g www www #配置 ./configure \ --user=www \ --group=www \ --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_stub_status_module \ --with-http_realip_module \ --with-threads #编译 make #安装 make install 4.验证 /usr/local/nginx/sbin/nginx -V 输出如下: nginx version: nginx/1.14.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) built

使用树莓派搭建网站服务器【更新中】

倾然丶 夕夏残阳落幕 提交于 2019-12-26 17:13:40
  以下内容为使用树莓派搭建服务器的过程,因为个人还没有搭建完成,所以仅更新出已完成的部分,至于未完成的部分,以后会持续更新。 ===========================================================   具体环节分为这几个阶段:       1.给树莓派安装系统       2.使用电脑连接控并制树莓派       3.配置网站服务器环境       4.添加网站源码       5.配置网站环境设置 ============================================================ 【0x01:给树莓派安装系统】   我是用的是树莓派3B+一张16GB的MicroSD(就是手机内存卡),如果搭建的网站需要存储文件,例如搭建网盘需要存储用户上传的文件的话,建议准备一个稍微大一点的SD卡,这里因为我只有一张16GB的SD卡,所以就用它来安装树莓派系统了。(建议卡的质量选的稍微好点,否则卡一旦损坏,系统就GG了,所有过程重新来一遍,很酸爽……)   准备好MicroSD卡,在准备需要安装的树莓派系统,我给树莓派安装的是从官网下载的Ubuntu系统,从官网下载后,需要解压出.img文件,这就是树莓派的系统文件格式,我们一会儿就需要往卡里烧写这个.img文件。   直接把

OkHttp3源码详解之HTTP重定向&缓存的处理(二)

坚强是说给别人听的谎言 提交于 2019-12-26 17:11:01
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击: https://space.bilibili.com/474380680 本篇文章将继续从以下两个内容来解析OkHttp3源码: [HTTP重定向] [缓存的处理] 一、HTTP重定向 1.1 重定向 重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。 ----百度百科 1.2 原理 在 HTTP 协议中,重定向操作由服务器通过发送特殊的响应(即 redirects)而触发。HTTP 协议的重定向响应的状态码为 3xx 。浏览器在接收到重定向响应的时候,会采用该响应提供的新的 URL ,并立即进行加载;大多数情况下,除了会有一小部分性能损失之外,重定向操作对于用户来说是不可见的。 ​ image 不同类型的重定向映射可以划分为三个类别:永久重定向、临时重定向和特殊重定向。 1.3 永久重定向 这种重定向操作是永久性的。它表示原 URL 不应再被使用,而应该优先选用新的 URL。搜索引擎机器人会在遇到该状态码时触发更新操作,在其索引库中修改与该资源相关的 URL 。 注意了:浏览器自动重定向,不管代码怎么写都会自动重定向到第一次你永久重定向的URL,没办法,这时候你只能清楚浏览器缓存 编码 含义 处理方法

Java并发编程之CountDownLatch源码解析

百般思念 提交于 2019-12-26 16:29:21
一、导语 最近在学习并发编程原理,所以准备整理一下自己学到的知识,先写一篇CountDownLatch的源码分析,之后希望可以慢慢写完整个并发编程。 二、什么是CountDownLatch CountDownLatch是java的JUC并发包里的一个工具类,可以理解为一个倒计时器,主要是用来控制多个线程之间的通信。 比如有一个主线程A,它要等待其他4个子线程执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。 三、简单使用 public static void main(String[] args){ System.out.println("主线程和他的两个小兄弟约好去吃火锅"); System.out.println("主线程进入了饭店"); System.out.println("主线程想要开始动筷子吃饭"); //new一个计数器,初始值为2,当计数器为0时,主线程开始执行 CountDownLatch latch = new CountDownLatch(2); new Thread(){ public void run() { try { System.out.println("子线程1——小兄弟A 正在到饭店的路上"); Thread.sleep(3000); System.out.println("子线程1——小兄弟A 到饭店了"); /