自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(104)
  • 收藏
  • 关注

原创 Android Unit Test

测试金字塔(如图 2 所示)说明了应用应如何包含三类测试(即小型、中型和大型测试):小型测试是指单元测试,用于验证应用的行为,一次验证一个类。中型测试是指集成测试,用于验证模块内堆栈级别之间的互动或相关模块之间的互动。大型测试是指端到端测试,用于验证跨越了应用的多个模块的用户操作流程。沿着金字塔逐级向上,从小型测试到大型测试,各类测试的保真度逐级提高,但维护和调试工作所需的执行时间和工作量也逐级增加。因此,您编写的单元测试应多于集成测试,集成测试应多于端到端测试。。

2023-07-29 11:30:33 1797

原创 客户端日志打印规范

/ 正例:重写toString()方法,将实体类转换为JSON字符串@Override}

2022-08-13 01:46:04 1085 1

原创 iOS播放/渲染/解析MIDI

什么是MIDIMIDI:乐器数字接口, Musical Instrument Digital Interface。MIDI 是计算机能理解的乐谱,计算机和电子乐器都可以处理的乐器格式。MIDI 不是音频信号,不包含 pcm buffer。通过音序器 sequencer,结合音频数据 / 乐器 ,播放 MIDI Event 数据( 通过音色库 SoundFont,播放乐器的声音。iOS上一般称sound bank )。通过 AVAudioEngine/AVAudioSequencer 播放连接

2022-05-19 12:30:53 1274

原创 【Android】AudioRecord::getMinBufferSize源码分析

Android,音频,AudioRecord

2022-05-07 17:05:43 906

原创 sqlite锁机制和greenDAQ多线程

锁Android和iOS都是采用的sqlite作为默认数据库。在有并发业务的场景下,数据库需要提供锁机制来保证数据一致。sqlite3提供了五种级别的锁:未加锁(UNLOCKED)、共享 (SHARED)、保留 (RESERVED)、未 决(PENDING) 和排它(EXCLUSIVE)。SQLite 使用锁逐步上升机制,为了写数据库,连接需要逐级地获得排它锁,以最大限度的保证并发性。事务事务是与锁紧密关联的概念。SQLite有三种不同的事务,DEFERRED、 MMEDIATE和EXCLUSIVE,

2020-05-24 18:52:53 742

原创 XMPP的优点和不足

XMPP概览3月份刚换了工作,入职之后新东家让我负责IM SDK的维护和重构工作。想起8年前曾经也搞过一段时间IM,当时是基于XMPP协议做的二次开发。时间又过了将近十年,时代在发展,技术在进步,如今可以考虑重新研究一下xmpp协议,毕竟这是唯一开源的IM协议,它山之石可以攻玉。XMPP的特点闲言少叙,书归正传,我们先来看看xmpp的一些基本特点。xmpp官方对xmpp的定义是:“XMP...

2020-04-25 11:59:42 1566

原创 基于kafka和prometheus的无线APM报警系统设计和实现

基于kafka和prometheus的无线APM报警系统设计和实现移动APP是当下的主流。公司有很多业务线,有大量的APP。为了能够实现对这些APP性能的监控,为无线开发、测试人员提供性能诊断和分析工具,公司自行开发了无线APM系统。我们的APM系统设计是这样的![avatar][apmbase64]无线APM系统通过移动端的SDK收集性能数据并上报到无线服务后端。各业务方可以通过无线控制...

2019-11-08 11:43:36 930

原创 argus-apm-main中的task(2) —— Activity Task

argus-apm-main中的task(2) —— Activity TaskActivity Task实现对Activity的性能监控。我们在“开始”一篇里提到过,Activity的性能采集实现方式有两种,Instrumentation和AOP,而ActivitTask的start方法主要就做了一个判断:如果使能了ApmTask.FLAG_COLLECT_ACTIVITY_INSTRUMEN...

2019-02-15 19:31:38 362

原创 argus-apm-main中的task(1) —— FpsTask

argus-apm-main中的task(1) —— FpsTaskargus-apm-main中定义和实现了各个具体的监控task,包括Activity,网络,fps等等。这里我们先从fps作为例子入手分析。FpsTask类FpsTask类定义了fps监控的task,相当于是fps task的入口。先来看一下这个类的代码。public class FpsTask extends Base...

2019-02-15 12:08:30 354

原创 360 Argus APM 源码分析(4)—— argus-apm-okhttp源码分析

argus-apm-okhttp源码分析OkHttp3Aspect类OkHttp3Aspect类是OKHTTP3的切面文件。@Aspectpublic class OkHttp3Aspect { @Pointcut("call(public okhttp3.OkHttpClient build())") public void build() { } ...

2019-02-14 20:15:46 488

原创 360 Argus APM 源码分析(3)—— argus-apm-aop源码分析

argus-apm-aop源码分析argus-apm-aop主要实现了面向Activity的切面和面向HttpClient和URLConnection的切片。阅读代码需要有AOP和aspectj的基础知识。TraceActivityTraceActivity类实现对Activity(还有Application)的切面。@Aspectpublic class TraceActivity...

2019-02-13 20:39:06 754

原创 Android多媒体框架(7)—— stagefright中MediaMuxer源码分析

stagefright中MediaMuxer源码分析私有属性定义MediaMuxer.h中定义了一些类的属性:const OutputFormat mFormat; sp<MediaWriter> mWriter; Vector< sp<MediaAdapter> > mTrackList; // Each track has its...

2019-02-08 15:33:35 738

原创 Android多媒体框架(6)—— MediaMuxer的jni代码分析

MediaMuxer的jni代码分析jni方法的定义MediaMuxer jni方法的定义在frameworks/base/media/jni/android_media_MediaMuxer.cpp中。static const JNINativeMethod gMethods[] = { { "nativeAddTrack", "(J[Ljava/lang/String;[Lja...

2019-02-08 14:25:55 1272

原创 Android多媒体框架(5)—— MediaMuxer.jara源码分析

MediaMuxer.jara源码分析音视频通过Codec(编码器)编码之后,还需要经过MediaMuxer(混合器)“混合”。混合器在framework的实现就是MediaMuxer类。MediaMuxer中又个内部类OutputFormat:public static final class OutputFormat {80 /* Do not change these v...

2019-02-07 17:38:42 2715

原创 Android多媒体框架(4)—— AMessage,AHandler和ALooper源码分析

AMessage源码分析AMessage继承自RefBase类,它有AHandler和ALooper的成员mHandler和mLooper,并且ALooper还是它的友元。成员变量mWhat是消息id,成员变量mTarget指明消息的handler(只用于调试)。成员函数setWhat和setTarget分别设置这两个属性。void AMessage::setWhat(uint32_t wha...

2019-02-04 13:59:09 6286

原创 Android多媒体框架(3)—— libstagefright中MediaCodec源码分析

libstagefright中MediaCodec源码分析和前两篇一样,我们按照MediaCodec的各个状态来分析libstagefright中MediaCodec的源代码。configure首先我们看一下configure在libstagefright中MediaCodec中的定义:438status_t MediaCodec::configure(439 con...

2019-02-03 15:26:48 2388

原创 Android 多媒体框架(2)—— android_media_MediaCodec.cpp源码分析

android_media_MediaCodec.cpp源码分析这里我们来分析和MediaCodec.java对应的native层类:android_media_MediaCodec.cpp的源代码。在该类的最后,我们会看到这样的代码:static const JNINativeMethod gMethods[] = {1881 { "native_release", "()V", ...

2019-01-31 18:05:58 2184

原创 360 Argus APM 源码分析(2)—— argus-apm-gradle源码分析

argus-apm-gradle源码分析argus-apm-gradle工程定义了一个gradle plugin,主要有以下两个作用:支持AOP编程,方便ArgusAPM能够在编译期织入一些性能采集的代码;通过Gradle插件来管理依赖库,使用户接入ArgusAPM更简单。argus-apm-gradle使用kotlin语言开发。这里我们假定大家已经熟悉gradle plugin的开发...

2019-01-24 20:48:21 1449 2

原创 360 apm框架Argus源码解析(1)——开始

开始先看一个简单的代码示例,演示如何集成360 Argus APM:public class ArgusAPMApplication extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); ...

2019-01-23 20:15:20 1160

原创 Android多媒体框架(1)——MediaCodec.java源代码分析

概述MediaCodec勇于访问底层的编解码器,是Android底层多媒体支持框架的一部分。它可以操作三种数据:压缩后的,原始的音频数据,以及原始的视频数据。MediaCodec以异步的方式处理数据,会用到一组输入和输出缓冲区,后文会详细介绍。MediaCodec有内部类BufferInfo来描述缓冲区。BufferInfo的代码如下:public final static class B...

2019-01-12 22:02:22 3235

原创 android 支持webrtc

公司有个项目,需要在webview中加载视频,用到了webrtc技术。Android 4.4以后,浏览器内核采用的chromium,可以支持webrtc。所以基本上对于新出的手机,自动支持webrtc。使用webview时,只需要在代码中实现WebChromeClient的onPermissionRequest方法即可。只是为了针对特定网页申请的权限给予授权或者拒绝。代码如下:webView...

2018-11-15 16:06:48 5478

原创 python设计模式——工厂方法

工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。工厂方法模式将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。以下是工厂方法模式的UML类图:接下来我们看一段实现工厂方法模式的python代码。class GreekGetter(obje

2018-01-24 20:22:26 493

原创 Android OTA静默升级

1. 方案选择获取升级信息,有两种大方向可供选择:Push(服务端向服务器端推送更新)和Query(客户端主动查询)两种方案。Query实现比较简单,灵活;push需要长连接支持,以及全部设备id等信息,实现相对复杂。基于目前的需求和实际情况,决定采用客户端查询更新方式。2. 整体框架 图1. 升级示意图 图2. 升级时序图升级系统的示意图及时序图如上。主要流程上,大部

2018-01-16 14:21:42 6776 1

原创 Android h5全屏播放video

H5全屏播放,在iOS系统上基本没有什么问题,但是在android系统,却又各种各样的问题。H5自身对全屏的支持这个其实不难,只需在video标签加个webkit-playsinline属性即可,这个属性基本上在基于webkit内核的移动端都是没问题的,此全屏非彼全屏,它是在浏览器视窗内的全屏,并不是占居整个手机的全屏,当然我们做web端需要的就是在document的body内的视窗范围的

2017-10-25 10:51:01 5424

原创 google 官方ndk demo解析(二)——bitmap-plasma

本文将分析bitmap-plasma这个demo。这是一个使用c代码在bitmap上绘制细胞质效果的demo。CMakeList.txtcmake_minimum_required(VERSION 3.4.1)set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")add_library(plasma SHARED plas

2017-09-28 14:22:10 1164

原创 Android画不规则形状

经常会在移动应用中看到类似下图的各种图片:这样的图形在Android上要怎么实现呢?在Android系统中,目前主要有三种方式可以实现上图的形状,下面一一介绍。一、PorterDuffXfermode方式之前的博客曾经介绍过用这种方式画圆形头像,实际上,它不仅可以用来画圆形头像,还可以实现任意形状。首先来复习一下16中效果:1.PorterDuff.Mode.CLEAR    

2017-09-27 10:46:11 10023

原创 Python与设计模式(二)——builder

首先看源码:#!/usr/bin/python# -*- coding : utf-8 -*-"""@author: Diogenes Augusto Fernandes Herminio https://gist.github.com/420905#file_builder_python.py"""# Directorclass Director(object):

2017-09-20 17:08:27 1028

原创 Android引导页播放视频——使用VideoView

有时候大家看到QQ等软件的引导页,播放一段酷炫的视频,觉得很有意思,于是就会想要尝试自己去实现以下。其实很简单,用VideoView就可以实现。首先,创建定义的VideoView。public class CustomVideoView extends VideoView { public CustomVideoView(Context context) { sup

2017-09-20 15:14:58 2948 1

原创 Python与设计模式(一)——Abstract Factory

最近在重新学习Python,想找一些优秀的Python源代码阅读学习,加上前段时间一直在学习设计模式,所以选择了GitHub上这个项目作为学习对象:https://github.com/faif/python-patterns这里有用Python实现各个设计模式的源代码demo。本篇从Abstract Factory开始介绍。其源码如下:#!/usr/bin/env pytho

2017-09-19 17:19:32 508

原创 google官方android ndk demo解析(一)——audio echo

最近重新学习ndk,主要关注使用android studio进行ndk开发。google官方的demo无疑是最好的学习源码。首先分析audio echo这个项目。一、CMakeList.txtcmake_minimum_required(VERSION 3.4.1)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -W

2017-09-18 14:39:37 3224 1

原创 Android WebView设置cookie

Android中WebView加载网页,有时候需要通过cookie想网页传递信息,这时候这样操作。首先设置接收cookie:CookieManager.setAcceptFileSchemeCookies(true);CookieManager.getInstance().setAcceptCookie(true);CookieManager.setAcceptFileScheme

2017-09-15 17:23:18 2480

原创 Android开发(1)——第一个NDK应用

一、下载NDK1. 打开Android Studio,选择Tools->Android->SDK Manager。2. 选择SDK tools选项卡。3. 选中LLDB,CMake,以及NDK。4. 选中Apply,在下一个页面点击OK。5. 下载完成之后,点击finish,然后点击OK。二、创建包含C/C++的项目创建支持native代码的项目和创建普通项目的步骤基本

2017-09-15 15:22:32 324

原创 Android Camera2 拍照(四)——对焦模式

本篇将重点介绍使用Camera2 API进行手动对焦的设置,以及在手动对焦与自动对焦模式之间切换。一、手动对焦响应事件首先我们要实现点击preview区域进行手动对焦,这通过对TextureView注册touch事件实现。mTextureView.setOnTouchListener(new View.OnTouchListener() { @Override

2017-09-12 15:46:48 7202 2

原创 Android Camera2 拍照(三)——切换摄像头,延时拍摄和闪光模式

一、切换摄像头在前后摄像头之间切换,首先需要关闭之前打开的摄像头,关闭preview,之后重新打开新的摄像头,重新打开preview。public void switchCamera() { if (mCameraId.equals(CAMERA_FRONT)) { mCameraId = CAMERA_BACK; close

2017-09-06 17:28:11 14650

翻译 Android8.0新特性和API

本文翻译自google官方文档,原文链接:https://developer.android.com/about/versions/oreo/android-8.0.htmlAndroid 8.0(API level 26)位用户和开发者引入了一系列新特性和能力。本文将重点介绍针对开发者的新功能。用户体验画中画模式Android 8.0 允许Activity以画中画模式启动。PIP

2017-09-01 15:16:20 9118

原创 Android Camera2 拍照(二)——使用TextureView

上一篇博文简单介绍了使用Camera2 API拍摄照片,并使用SurfaceView作为预览界面。实际上,相对于SurfaceView, TextureView更适合用于视频和拍摄照片。SurfaceView也有它的使用场合,这将在另外一篇中阐述。本文将使用TextureView作为预览界面,再次向大家展示Camera2 API的简单应用。1,定义TextureView作为预览界面在布局文

2017-09-01 10:06:55 8508 2

原创 Android Camera2拍照(一)——使用SurfaceView

Camera2 API简介Android 从5.0(21)开始,引入了新的Camera API Camera2,原来的android.hardware.Camera被废弃(下面称为Camera1),还有一个android.graphics.Camera,这个android.graphics.Camera不是用来照相的,是用来处理图像的,可以做出3D的图像效果之类的,之前的Camera1则由

2017-08-31 09:56:20 12340 4

原创 Android实现自定义圆形ImageView

要实现圆形的ImageView,有一个重要的类:PorterDuffXfermode。PorterDuffXfermode 这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。该类的用法如下://创建PorterDuffXfermodePorterDuffXfermode mode=new Po

2017-08-30 12:07:04 909

原创 Android中的so库

Android设备的CPU类型目前Android设备已经支持多种CPU类型,包括:armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它.arm64-v8a: 第8代、64位ARM处理器。armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。x86: 平板用得比较多。x86_64: 64位的平

2017-08-28 10:35:32 371

原创 Android开发使用https及Webview访问https页面

HTTPS简介HTTPS(Hyper Text Transfer Protocol Secure),是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上进行传输的。HTTPS协议是在HTTP协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议。所以,研究HTTPS协议原理,最终其实就是研究SSL/TLS协议。SSL/TLS协议不使用

2017-08-23 12:50:46 5352

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除