- 博客(108)
- 资源 (7)
- 收藏
- 关注
原创 Android单元测试
Android 单元测试: 首先,从是什么开始 Android单元测试(二):再来谈谈为什么 Android单元测试(三):JUnit单元测试框架的使用 Android单元测试(四):Mock以及Mockito的使用 Android单元测试(五):依赖注入,将mock方便的用起来 Android单元测试(六):使用dagger2来做依赖注入,以及在单元测试中的应用 Android单元...
2018-09-03 11:01:56
363
原创 安卓知识汇总
1.Walle(瓦力,美团开源的)通过在Apk中的APK Signature Block区块添加自定义的渠道信息来生成渠道包,从而提高了渠道包生成效率,可以作为单机工具来使用,也可以部署在HTTP服务器上来实时处理渠道包Apk的升级网络请求。2.图片内存的计算 计算公式: 所占内存 = 图片长度 * 图片宽度 * 每个像素所占的内存 ALPHA_8:每个像素点占用1byte内存 ARG...
2018-03-06 13:51:27
498
原创 搭建Maven私有仓库
1.Nexus官网 2.下载All platforms - Nexus Repository Manager OSS 2.x - bundle.zip 3.解压 4.运行 打开终端,转移到nexus2/bin目录下 运行:./nexus startbogon:bin lisen$ pwd/Users/lisen/Desktop/n2/nexus2/binbogon:bin l
2018-01-25 17:45:07
1683
原创 Android开发艺术探索笔记之事件分发机制
View什么是ViewView是界面层控件的一种抽象,它代表一个控件。 ViewGroup继承自View,内部可以包含多个控件,即一组View。 View的位置参数 VelocityTracker 速度追踪VelocityTracker ve = VelocityTracker.obtain();在View的onTouchEvent方法中调用:ve.a
2018-01-15 11:31:51
518
原创 代理模式
静态代理定义抽象接口 public interface IRequest{ void request(String params); }被代理类1 static class Retrofit implements IRequest{ @Override public void request(String params) {
2017-12-21 20:16:30
316
原创 Git Submodule
场景:假如A项目团队,有一个项目A,里面有一个不错的网络模块NetModule,这时候B团队的B项目想直接用NetModule,这时候有两种方式进行导入: 方案一:下载A项目,然后将NetModule导入进去 方案二:git submodule的方式,cloneA项目到B项目的lib文件下假如后续过程中A对NetModule进行了修改 方案一需要下载A项目,还要根据哪里修改了,修改自己项目中的
2017-12-18 18:42:36
453
原创 Android跨进程通信
本文基于《Android开发艺术探索》,是一本不错的进阶书籍。多进程IPC(Inter-Process Communication):进程间通信或者跨进程通信,两个进程间进行数据交换的过程。 线程:CPU调度的最小单元。 进程:一个执行单元,比如一个程序活着应用。 一个进程可以包含多个线程。在Android中使用多进程的方法:在AndroidManifest.xml中指定android:pro
2017-12-12 17:01:46
811
原创 RxJava源码分析(二)
这次聊的是RxJava的线程切换流程,先看一张图: 这个时序图对应的RxJava代码: public void demo2(){ createObservable() .subscribeOn(Schedulers.newThread())//被观察者在新线程执行subscribe .observeOn(Andr
2017-12-08 19:00:54
310
原创 RxJava源码分析(一)
RxJava官网快速入门,推荐下面大神整理的教程: 给初学者的RxJava2.0教程(一) 给初学者的RxJava2.0教程(二) ….. 给初学者的RxJava2.0教程(九)AndroidStudio配置: implementation 'io.reactivex.rxjava2:rxjava:2.1.7' implementation 'io.reactivex.rxja
2017-12-06 20:06:29
410
原创 替换dex实现热修复
安卓App热补丁动态修复技术介绍本文就是对上面的原理进行简单实现。 主要思想: 首先一个确保apk是由多个dex组成的,dex1、dex2、dex3等。 dex1一般会包含application等。假如dex2中出现了bug,那么我们可以修复相应的bug,生成对应的newdex2,然后将newdex2放置到dexements数组的前面。那么其他方法调用dex2中的方法时,会先从数组的由前往后遍
2017-12-04 19:31:13
1336
1
原创 ijkplayer编译
ijkplayer安装homebrew、git、yasm# install homebrew, git, yasmruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"brew install gitbrew install yasm根据自己需要,进行如下设置If you
2017-12-04 15:14:39
1194
原创 AndFix实现原理
AndFix不需要重启app即可实现bug修复,AndFix是“Android hot-fix”的缩写。AndFix实现步骤: 1.通过注解的生成补丁包(.apatch) 2.通过获取.apatch中的补丁类,然后通过注解方式获取需要打补丁的方法。 3.补丁中的方法替换bug中的方法。补丁包暂且不考虑,现在实现2、3步骤获取补丁包中要替换的方法新建项目,项目最终结构如下: 注解方法Methd
2017-12-01 16:44:31
1997
原创 增量更新
实现思路实现增量更新的步骤: 1. old.apk和new.apk生成差异包patch 2. old.apk和patch合成更新包merge.apk 3. 安装merge.apk生成差异包patch1.进入bsdiff官网,下载bsdiff-4.3.tar.gz 2.解压下载好的bsdiff-4.3.tar.gz,然后编辑Makefile如下:CFLAGS += -O3 -lbz
2017-11-30 18:46:54
1814
原创 openCV人脸识别
1.下载编译好的SDK 2.解压后,新建项目,拷贝对应文件到项目中: 3.CmakeLists.txt修改如下:cmake_minimum_required(VERSION 3.4.1)include_directories(src/main/cpp/include)file(GLOB my_source_path src/main/cpp/*.cpp src/main/cpp/*.c)
2017-11-22 16:05:24
824
原创 opencv源码编译
GITHUB地址:https://github.com/opencv/opencv.git 官方网站:http://opencv.org/downloads.html 编译下载地址:https://sourceforge.net/projects/opencvlibrary/files/1.安装cmakebrew install cmake2.下载opencv源码在官网下载指定版本的源码 ht
2017-11-18 20:42:42
785
1
原创 插件换肤
插件换肤的重点在于如何加载插件包的资源。 插件包其实就是一个apk的压缩包,加载插件包的资源,其实就是加载apk的资源。如何才能加载apk中的资源呢? 首先android中的各种资源都对应一个唯一id,比如获取一个view,通过findViewById(int id)方法,就可以得到布局的唯一view。 同样, 设置图片 setBackground(getResources().g
2017-11-17 20:11:35
395
原创 java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "strtof" referenced by "libsuppo
as更新到3.0以后,运行程序发现如下报错:11-15 13:24:22.849 10388-10388/com.test.nginxpush E/AndroidRuntime: FATAL EXCEPTION: main Process: com.test.ngi
2017-11-15 13:36:37
4568
原创 nginx + rtmp 推流
环境安装Homebrowruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"安装nginx下载nginx项目到本地brew tap homebrew/nginx执行安装brew install nginx-full -with-rtmp-module到这一步,nginx和rt
2017-11-09 16:06:03
7289
原创 六、音视频同步
FFmpegAudio.h//// Created by ygdx_lk on 17/11/4.//#ifndef VIDEOPLAYER_FFMPEGAUDIO_H#define VIDEOPLAYER_FFMPEGAUDIO_H#include <queue>#include <jni.h>#include <unistd.h>#include <string>#include
2017-11-07 19:55:40
620
原创 生产者消费者及线程加锁
// 产品队列int ready=0;//互斥锁pthread_mutex_t mutex;//条件变量pthread_cond_t has_product;std::queue queue1;//生产者void * produce(void *arg){ char* name=(char*)arg; LOGI("生产 %s", name);
2017-11-04 19:44:23
654
原创 五、OpenSL ES音频播放
本文基于以下文章进行的开发:一、FFMPEG源码编译二、AndroidStudio集成FFMPEG三、FFMPEG视频解码及播放四、FFMPEG播放音频开发出色的音频应用OpenSL ES API 可以帮助您制定和提升应用的音频性能。 某些典型用例包括以下组成部分:数字音频工作站 (DAW)。合成器。电子鼓。音乐学习应用。卡拉 OK 应用。DJ 混合。音
2017-11-03 17:02:41
661
原创 四、FFMPEG播放音频
1.新建AudioPlayer类package com.test.ffmpeg;import android.media.AudioFormat;import android.media.AudioManager;import android.media.AudioTrack;import android.util.Log;/** * Created by ygdx_lk on
2017-11-02 16:05:44
848
原创 三、FFMPEG视频解码及播放
1.新建VideoView类package com.test.ffmpeg;import android.content.Context;import android.graphics.PixelFormat;import android.util.AttributeSet;import android.view.Surface;import android.view.Surfac
2017-11-01 20:28:26
1148
原创 二、AndroidStudio集成FFMPEG
1.新建android项目,勾选include C++ support2.勾选Exceptions Support (-fexceptions)、Runtime Type Information Support (-frtti)3.Finish后的项目目录4.libs下创建armeabi目录,拷贝ffmpeg编译后的so文件到armeabi下,拷贝i
2017-11-01 20:14:43
2728
原创 接下来的学习计划
11.1~2.15(除夕)学习概要:1.ffmpeg视频相关(源码编译、开发配置、图像编解码、音频处理、音视频同步播放)2.视频直播推流3.openCV图像识别4.热修复、插件化、增量更新5.RxJava、Glide、Retrofit原理6.kotlin7.android源码(老罗的Android之旅《安卓系统源代码情景分析》、《Android开发艺术探索》)安卓在线源码android/kerne...
2017-11-01 11:20:11
806
原创 一、FFMPEG源码编译
1.下载地址:http://ffmpeg.org/releases/2.下载完成解压3.修改configure文件将该文件中的如下四行:SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'SLIB_INSTALL_NAM
2017-10-31 20:13:22
1734
原创 滚动加载条效果
先上图: 效果也是比较简单的,直接上源码(具体步骤已经做了注释)package com.test.ndktest;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.gr
2017-09-27 12:54:01
381
原创 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。import java.util.Stack;public class lesson5 { class quene{ Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<I
2017-08-16 19:37:45
706
原创 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。二叉树 遍历即将树的所有结点访问且仅访问一次。按照根节点位置的不同分为前序遍历,中序遍历,后序遍历。前序遍历:根节点->左子树->右子树中序遍历:左子树->根节点-
2017-08-16 19:22:01
495
原创 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。public class Solution { public boolean Find(int target, int [][] array) { //数组行列数 int row = array.
2017-08-16 19:20:25
364
原创 java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__aeabi_memcpy"
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol “__aeabi_memcpy”在6.0手机上会出现原因: AndroidStudio生成so时,由于compileSdkVersion、targetSdkVersion版本过高,与ndk版本不匹配。 ndk生成的so是向上兼容的,而不是向下兼容。所以目前只能降
2017-08-02 12:21:29
12307
原创 Jenkins+Tomcat + Gradle + Tinker + Walle + 360加固 + fir.im 持续集成,自动构建
先介绍一下为什么要用这么一大堆东西。。。。阶段一 开发了一个简单的app 每次打包只需要./gradlew assembleRelease,然后等待几分钟,就可以得到一个安装包。使用360加固助手进行加固然后将安装包上传到fir.im然后通知测试安装测试阶段二 为了更好的用户体验,使用了热修复tinker ./gradlew assembleRelease打包生成的安装包上传到360
2017-07-13 20:01:05
7152
7
原创 Activity源码浅析-DecorView
使用Activity,我们会先在onCreate方法中,设置setContentView public void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID); initWindowDecorActionBar(); }getWin
2017-06-30 12:54:42
3248
原创 水波纹+旋转小球动画
实现效果:实现思路:1.首先绘制小圆的位置: 每个小圆的间隔为:2 * Math.PI / CIRCLE_COUNT 2.通过控制第一个小圆的角度变化,控制小圆的旋转。 通过控制大圆半径,实现小圆的聚合 3.水波纹实现:绘制一个空心圆,通过不断改变空心圆的半径和画笔宽度。代码实现:package com.test.paintdemo;import android.animation.An
2017-06-27 13:18:31
2344
原创 视频直播中的心形漂浮效果
实现效果:思路:1.首先要给心形图片创建一个平滑的悬浮路径,那就要用到贝塞尔曲线,这里采用自定义TypeEvaluator实现。 2.路径有了,就要考虑实现动画的两个步骤 a.缩放,伴随透明度变化 b.底部悬浮到顶部 这里是用的是Matrix 3.自定义View,然后绘制心形图片。 详细步骤,看源码代码:1.自定义BezierEvaluatorpackage co
2017-06-26 19:29:22
2289
原创 SVG
Android微信上的SVGSVG 即Scalable Vector Graphics 可伸缩矢量图形,这种图像格式在前端中已经使用的非常广泛了。 SVG的W3C的解释: http://www.w3school.com.cn/svg/svg_intro.asp矢量图像 SVG是W3C 推出的一种开放标准的文本式矢量图形描述语言,他是基于XML的、专门为网络而设计的图像格式,
2017-06-25 00:19:44
1730
原创 SVG绘制中国地图
效果如图,点击省份区域,即可蓝色高亮显示 实现思路:地图资源 Android SVG to VectorDrawable 1.首先获取SVG图片,然后将SVG转化为VectorDrawable,然后放入res/raw目录下(SVG图片代码在文章末尾) 2.通过DocumentBuilderFactory获取svg中的根节点rootElement 3.通过rootElement获取所有pa
2017-06-24 23:41:14
13209
原创 PathMeasure
PathMeasurePathMeasure是一个用来测量Path的类,主要有以下方法:构造方法 方法名 释义 PathMeasure() 创建一个空的PathMeasure PathMeasure(Path path, boolean forceClosed) 创建 PathMeasure 并关联一个指定的Path(Path需要已经创建完成)公共方法 返回值 方法名
2017-06-24 15:14:32
1409
原创 PathMeasure + 贝塞尔曲线实现过山车效果
先看效果图: 思路: 1.首先绘制红色的贝塞尔曲线 2.然后用PathMeasure,测量曲线某一点A的长度、倾斜度、坐标 3.根据坐标倾斜度,绘制图片 4.根据PathMeasure获得,起始点O到A点的路径,绘制走过的路径代码:package com.test.paintdemo.pathrelate;import android.animation.ValueAnimator;im
2017-06-24 14:38:14
3049
原创 Canvas模拟太阳地球月球的运动过程
先看效果图代码package com.test.paintdemo.pathrelate;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphi
2017-06-23 14:41:53
4433
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人