<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[读书未遍、未敢妄下雌黄]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/rambomatrix</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; rambomatrix]]></copyright><item><title><![CDATA[Android Hook 一 Hook CloseGuard]]></title><link>https://blog.csdn.net/rambomatrix/article/details/85715989</link><guid>https://blog.csdn.net/rambomatrix/article/details/85715989</guid><author>rambomatrix</author><pubDate>Thu, 03 Jan 2019 19:55:26 +0800</pubDate><description><![CDATA[一、抛出问题
在上一篇 dalvik.system.CloseGuard 介绍了CloseGuard的原理和作用，并在文中提到

APP端可以利用Hook REPORTER 在来实现客制化的上报提示信息

本章通过代码来学一下怎样Hook这个REPORTER来定制上报信息功能。
二、案例分析
直接上代码：
package com.peterzhang.androidhookdemo;

impor...]]></description><category></category></item><item><title><![CDATA[Gradle学习三 ：AS自定义Gradle插件]]></title><link>https://blog.csdn.net/rambomatrix/article/details/85603011</link><guid>https://blog.csdn.net/rambomatrix/article/details/85603011</guid><author>rambomatrix</author><pubDate>Wed, 02 Jan 2019 11:09:49 +0800</pubDate><description><![CDATA[一、定义插件
1.File-New Module-Android Library,取名plugin1
2.删除plugin1目录下所有文件，只保留build.gradle
编写build.gradle,代码如下：
apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    compile gradleApi()//gradle ...]]></description><category></category></item><item><title><![CDATA[声纹识别调研]]></title><link>https://blog.csdn.net/rambomatrix/article/details/85319718</link><guid>https://blog.csdn.net/rambomatrix/article/details/85319718</guid><author>rambomatrix</author><pubDate>Fri, 28 Dec 2018 11:45:18 +0800</pubDate><description><![CDATA[1. 基础概念
声纹(Voiceprint)，是用电声学仪器显示的携带言语信息的声波频谱。
现代科学研究表明，声纹不仅具有特定性，而且有相对稳定性的特点。成年以后，人的声音可保持长期相对稳定不变。实验证明，无论讲话者是故意模仿他人声音和语气，还是耳语轻声讲话，即使模仿得惟妙惟肖，其声纹却始终不相同。
2. 核心技术
声纹识别的主要任务包括：语音信号处理、声纹特征提取、声纹建模、声纹比对、判别决策等...]]></description><category></category></item><item><title><![CDATA[dalvik.system.CloseGuard 介绍]]></title><link>https://blog.csdn.net/rambomatrix/article/details/85316592</link><guid>https://blog.csdn.net/rambomatrix/article/details/85316592</guid><author>rambomatrix</author><pubDate>Fri, 28 Dec 2018 08:39:01 +0800</pubDate><description><![CDATA[
CloseGuard is a mechanism for flagging implicit finalizer cleanup of resources that should have been cleaned up by explicit close methods (aka “explicit termination methods” in Effective Java)

大致意思就...]]></description><category></category></item><item><title><![CDATA[Android Surface显示系统框架一概览]]></title><link>https://blog.csdn.net/rambomatrix/article/details/85228052</link><guid>https://blog.csdn.net/rambomatrix/article/details/85228052</guid><author>rambomatrix</author><pubDate>Mon, 24 Dec 2018 00:25:30 +0800</pubDate><description><![CDATA[
基于Android7.1源码和相关资料画了APP UI绘制显示的大致框架。
涉及安卓系统全栈内容:

APP层
framework层(WMS)
native层(SurfaceFlinger)
HAL层(hwcomposer/gralloc)

包括了如下概念：

进程通信组建：binder/Ashmem，作为模块之间沟通的桥梁，如果不清楚这两个实现机制，很难明白UI渲染如何从APP层发起请求经过...]]></description><category></category></item><item><title><![CDATA[Linux 进程通信-共享内存Shmem示例]]></title><link>https://blog.csdn.net/rambomatrix/article/details/85067110</link><guid>https://blog.csdn.net/rambomatrix/article/details/85067110</guid><author>rambomatrix</author><pubDate>Tue, 18 Dec 2018 15:46:23 +0800</pubDate><description><![CDATA[这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题，有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能，丰富你的文章UML 图表FLowchart流程图导出与导入导出导入
欢迎使用Ma...]]></description><category></category></item><item><title><![CDATA[Dalvik虚拟机内存碎片测试分析]]></title><link>https://blog.csdn.net/rambomatrix/article/details/84820227</link><guid>https://blog.csdn.net/rambomatrix/article/details/84820227</guid><author>rambomatrix</author><pubDate>Wed, 05 Dec 2018 10:02:29 +0800</pubDate><description><![CDATA[《移动App性能评测与优化》第一章1.3.3介绍了优化Dalvik内存碎片。文中列举了一段代码，可能会在GC后引起内存碎片问题，代码如下：
private Object result[] = new Object[100];
void fool(){
    for (int i = 0;i &amp;amp;amp;amp;lt; 100; i++){
        byte[] tmp = new byte[2000];
...]]></description><category></category></item><item><title><![CDATA[Android doze模式分析一]]></title><link>https://blog.csdn.net/rambomatrix/article/details/84455546</link><guid>https://blog.csdn.net/rambomatrix/article/details/84455546</guid><author>rambomatrix</author><pubDate>Sun, 25 Nov 2018 00:58:28 +0800</pubDate><description><![CDATA[一、引言
DOZE是安卓系统从6.0(API级别23)开始引入的对低电和应用待机模式的优化。具体介绍可以参考developers官方文档。
阅读完官文后，思考几个问题：

6.0之前，APP怎么处理可以让系统不休眠？
6.0开始，系统如何解决APP不让系统休眠的问题？

二、问题简答
6.0之前，如果不希望APP运行过程系统休眠，可以通过在APP内申请PowerManager.WakeLock保证...]]></description><category></category></item><item><title><![CDATA[Android native层发送广播]]></title><link>https://blog.csdn.net/rambomatrix/article/details/83791436</link><guid>https://blog.csdn.net/rambomatrix/article/details/83791436</guid><author>rambomatrix</author><pubDate>Tue, 06 Nov 2018 17:47:13 +0800</pubDate><description><![CDATA[github代码地址

]]></description><category></category></item><item><title><![CDATA[青蛙跳台阶算法,n m]]></title><link>https://blog.csdn.net/rambomatrix/article/details/83722031</link><guid>https://blog.csdn.net/rambomatrix/article/details/83722031</guid><author>rambomatrix</author><pubDate>Sun, 04 Nov 2018 23:10:29 +0800</pubDate><description><![CDATA[问题描述：一个青蛙，一次可以跳1级台阶，也可以跳2级，…也可以跳n级，总共有m级台阶，问青蛙总共有多少种跳法？
问题分析：
以n=2为例
当m =1 时f(1) = 1
当m =2 时f(2) = 2
当m =3 时f(3) = 3 = f(2)+f(1)
当m =4 时f(4) = 5 = f(3)+f(2)
因此当m&amp;amp;gt;2的时候f(m) = f(m-1)+f(m-2)
参考斐波那契数列
以...]]></description><category></category></item><item><title><![CDATA[java生产者消费者模型，需要考虑多线程安全]]></title><link>https://blog.csdn.net/rambomatrix/article/details/83654958</link><guid>https://blog.csdn.net/rambomatrix/article/details/83654958</guid><author>rambomatrix</author><pubDate>Fri, 02 Nov 2018 14:35:52 +0800</pubDate><description><![CDATA[方法一:使用synchronized做同步
`
package ProducerConsumer;
import java.util.LinkedList;
import java.util.Queue;
public class ProducerConsumerSynchronized {
private final int MAX_LEN = 100;
private Queue queue ...]]></description><category></category></item><item><title><![CDATA[《代码整洁之道》阅读笔记]]></title><link>https://blog.csdn.net/rambomatrix/article/details/82663123</link><guid>https://blog.csdn.net/rambomatrix/article/details/82663123</guid><author>rambomatrix</author><pubDate>Wed, 12 Sep 2018 16:01:56 +0800</pubDate><description><![CDATA[让营地比你来的时候更干净

1.pulic方法可以通过单元测试 
2.类的行数不要超出1000行，函数只做一件事，做好一件事 
3.函数内部缩进层级不超过4层 
4.函数参数个数不要超过6个 
5.方法的行数不要超出100行 
保持类、方法职责单一 
短小精悍的类和方法更具有可读性，随着时间的增加，代码依然具有很高的维护性 
6.方法不要返回空值，可以返回空集合，这样可以减少引用端非空判断的数量，...]]></description><category></category></item><item><title><![CDATA[安卓线程学习五 之 HelloWorld app运行时线程资源分析]]></title><link>https://blog.csdn.net/rambomatrix/article/details/81512838</link><guid>https://blog.csdn.net/rambomatrix/article/details/81512838</guid><author>rambomatrix</author><pubDate>Wed, 08 Aug 2018 17:54:27 +0800</pubDate><description><![CDATA[一 抛出问题

一个最普通的 HelloWorld app运行以后，总共会开启多少线程，这些线程分别是什么作用，线程的status是什么？



二 分析

helloworld app运行以后，打开Android Studio — Tools — Android — Android Device Monitor ,查看Threads信息，如图所示： 


总共有14个线程



2.1.虚拟机线...]]></description><category></category></item><item><title><![CDATA[安卓线程学习四 之 线程优先级和调度]]></title><link>https://blog.csdn.net/rambomatrix/article/details/81476145</link><guid>https://blog.csdn.net/rambomatrix/article/details/81476145</guid><author>rambomatrix</author><pubDate>Tue, 07 Aug 2018 10:08:51 +0800</pubDate><description><![CDATA[一 问题思考

安卓开发，如果想设置线程优先级有两种方法：

1 Android sdk也提供一个设置线程优先级的方法

2 Thread.java里面提供了设置线程优先级的方法

这两个方法有什么区别，应该选择使用哪一个呢？



二 线程优先级的原理



2.1. android.os.process.java设置线程优先级源码分析



/**
     * Set the priorit...]]></description><category></category></item><item><title><![CDATA[安卓线程学习三 之 线程状态]]></title><link>https://blog.csdn.net/rambomatrix/article/details/81436938</link><guid>https://blog.csdn.net/rambomatrix/article/details/81436938</guid><author>rambomatrix</author><pubDate>Sun, 05 Aug 2018 23:10:51 +0800</pubDate><description><![CDATA[一 源码分析

在Thread.java类中，有一个枚举类State描述了线程状态机：



/**
     * A thread state.  A thread can be in one of the following states:
     * &amp;lt;ul&amp;gt;
     * &amp;lt;li&amp;gt;{@link #NEW}&amp;lt;br&amp;gt;
     *     A thread...]]></description><category></category></item><item><title><![CDATA[安卓线程学习二 之 java线程启动分析]]></title><link>https://blog.csdn.net/rambomatrix/article/details/81294836</link><guid>https://blog.csdn.net/rambomatrix/article/details/81294836</guid><author>rambomatrix</author><pubDate>Tue, 31 Jul 2018 00:44:27 +0800</pubDate><description><![CDATA[安卓系统或应用开发，java多线程编程是非常重要也是比较难的一个知识点。掌握线程的实现原理、生命周期，合理的使用线程、线程池对于开发稳定、高效的程序是必须的基础。

结合安装系统、应用开发实践，我们先思考下面几个常见的问题：


安卓系统基于Linux实现，每一个java线程会对应一个pthread线程。
每一个app在启动之后都会启动一个binder线程用于监听消息事件，安卓系统是基于消息驱动。...]]></description><category></category></item><item><title><![CDATA[安卓系统之线程学习-概要]]></title><link>https://blog.csdn.net/rambomatrix/article/details/81294833</link><guid>https://blog.csdn.net/rambomatrix/article/details/81294833</guid><author>rambomatrix</author><pubDate>Tue, 31 Jul 2018 00:43:32 +0800</pubDate><description><![CDATA[安卓系统或应用开发，java多线程编程是非常重要也是比较难的一个知识点。掌握线程的实现原理、生命周期，合理的使用线程、线程池对于开发稳定、高效的程序是必须的基础。

结合安装系统、应用开发实践，我们先思考下面几个常见的问题：


安卓系统基于Linux实现，每一个java线程会对应一个pthread线程。
每一个app在启动之后都会启动一个binder线程用于监听消息事件，安卓系统是基于消息驱动。...]]></description><category></category></item><item><title><![CDATA[jdk native源码下载]]></title><link>https://blog.csdn.net/rambomatrix/article/details/81256499</link><guid>https://blog.csdn.net/rambomatrix/article/details/81256499</guid><author>rambomatrix</author><pubDate>Sat, 28 Jul 2018 02:27:54 +0800</pubDate><description><![CDATA[一 背景

java宣称一次编译，到处运行，主要功劳在jvm隔离了系统平台的差异性。jdk代码包括：


java 用于提供开发接口
c 用于jni调用
c++ 汇编 用于适配不同操作系统和芯片平台


在windows平台下载jdk安装包，安装成功之后，会在安装目录生成：



其中src是部分jdk开源源码，解压以后： 


可以看到jdk开源代码部分只包括java代码。开发过程如果需要了解j...]]></description><category></category></item><item><title><![CDATA[Android app 配置文件使用分析]]></title><link>https://blog.csdn.net/rambomatrix/article/details/81107387</link><guid>https://blog.csdn.net/rambomatrix/article/details/81107387</guid><author>rambomatrix</author><pubDate>Wed, 18 Jul 2018 23:53:30 +0800</pubDate><description><![CDATA[在安卓app开发中，常需要将一些数据放在配置文件，辅助程序开发和运行。依据数据复杂度、使用场景等条件，会存在不同种类的配置文件，比如最常见的xml文件，使用在Androidmanifest.xml,res资源定义等。其实除了xml之外还有其他格式的文件可以用作配置文件，比如json、properties等。下面来详细看一下：



1.Properties文件

常用于保存软件配置信息，类似has...]]></description><category></category></item><item><title><![CDATA[AirPlay Android接收端学习一  协议]]></title><link>https://blog.csdn.net/rambomatrix/article/details/80961060</link><guid>https://blog.csdn.net/rambomatrix/article/details/80961060</guid><author>rambomatrix</author><pubDate>Sun, 08 Jul 2018 17:43:16 +0800</pubDate><description><![CDATA[一 AirPlay 接收端描述

AirPlay是苹果的私有协议，苹果官方未开放api和sdk，目前相对权威的一份非官方协议文档。这篇文档详细描述了aiplay 服务发现、图片、音视频、镜像投屏的相关协议，给我们开发airplay设备提供了很好的参考。但是不足之处是文档已经有6年多时间没有更新过，对于IOS的新变化可能没有完全同步。在开发过程中我们可能会面临一些未知的坑，需要针对具体问题来逐一解决...]]></description><category></category></item></channel></rss>