<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[lzqustc的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/lzqustc</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; lzqustc]]></copyright><item><title><![CDATA[Android Framework源码解读 - Audio - SoundTrigger(3) - Callback]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/118274396</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/118274396</guid><author>lzqustc</author><pubDate>Sun, 27 Jun 2021 17:46:56 +0800</pubDate><description><![CDATA[上一篇Android Framework源码解读 - Audio - SoundTrigger(2)已经完成了SoundTrigger的初始化流程，并在HAL层启动了callback_thread_loop线程来监听内核事件（也就是驱动检测到唤醒词后会上报uevent）。接下来就讲讲这个唤醒事件是如何通过callback方式一层层上报，最终被APK层收到的。

既然是callback方式，肯定是会涉及函数或是对象指针，而且是要从源头 - APK层开始一层层把指针设置到HAL层，最终被HAL层的callbac]]></description><category></category></item><item><title><![CDATA[Android Framework源码解读 - Audio - SoundTrigger(2)]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/117912667</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/117912667</guid><author>lzqustc</author><pubDate>Mon, 14 Jun 2021 22:02:56 +0800</pubDate><description><![CDATA[在上一篇中Android Framework源码解读 - Audio - SoundTrigger(1) - AIDL，提到startRecognition如何到达HAL层（主要本例中使用的唤醒词检测驱动来自厂商，HAL层的代码实现也是厂商提供），请看下图：



相关代码位于./frameworks/av/soundtrigger/ISoundTrigger.cpp 、./frameworks/av/services/soundtrigger/SoundTriggerHwService.cpp

共4步：]]></description><category></category></item><item><title><![CDATA[Android Framework源码解读 - Audio - SoundTrigger(1) - AIDL]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/117400134</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/117400134</guid><author>lzqustc</author><pubDate>Sun, 30 May 2021 18:53:14 +0800</pubDate><description><![CDATA[SoundTrigger语音识别架构是Android5.0才引入，在Android7.0逐步完善。

官方介绍：https://source.android.google.cn/devices/audio/sound-trigger

The Sound Trigger feature provides apps with the ability to listen for certain acoustic events, like hotwords, in a low-power and privacy-]]></description><category></category></item><item><title><![CDATA[Android Framework源码解读 - Audio - AudioRecord]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/117197263</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/117197263</guid><author>lzqustc</author><pubDate>Sun, 23 May 2021 18:27:35 +0800</pubDate><description><![CDATA[AudioRecord is a audio client for receiving data from an audio input device such as a microphone.

应用层调用AudioRecord的主要APIs，主要有getMinBufferSize()、new AudioRecord()、startRecording()、getRecordingState()、read()、getState()、stop()、 release()，大致调用步骤如下：



静态方法get]]></description><category></category></item><item><title><![CDATA[Android Framework源码解读 - Audio - audioserver启动流程(3)]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/117171560</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/117171560</guid><author>lzqustc</author><pubDate>Sun, 23 May 2021 10:36:49 +0800</pubDate><description><![CDATA[在上一篇Android Framework源码解读 - Audio - audioserver启动流程(2) - HIDL中已经基本上理清了audioserver启动以及它和另外两个关键进程android.hardware.audio@2.0-service， hwservicemanager的交互关系。

其中audioserver启动时创建了三个关键service，前两篇已经涉及到了AudioFlinger service和AudioPolicyService, 而SoundTriggerHwSer..]]></description><category></category></item><item><title><![CDATA[Android Framework源码解读 - Audio - audioserver启动流程(2) - HIDL]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/117166252</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/117166252</guid><author>lzqustc</author><pubDate>Sat, 22 May 2021 17:53:43 +0800</pubDate><description><![CDATA[图片来自http://gityuan.com/2019/03/20/android_future/

Android 8.0系统(Android Oreo简称 Android O)，Google开展了计划（Project Treble），为了解决Android 系统的碎片化问题和提高系统更新的效率，减少framework 和HAL 的耦合性，进而引出了HIDL 的概念。

Treble引入后，新增了一个vendor.img，即原先的system分区，被拆分为了system分区和vendor分区，SOC及..]]></description><category></category></item><item><title><![CDATA[Android Framework源码解读 - Audio - audioserver启动流程(1)]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/117164987</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/117164987</guid><author>lzqustc</author><pubDate>Sat, 22 May 2021 16:44:21 +0800</pubDate><description><![CDATA[main_audioserver.cpp

源码 ./frameworks/av/media/audioserver/main_audioserver.cpp 对应进程 audioserver， 对应的启动rc文件在 /etc/init/audioserver.rc


# cat audioserver.rc 
service audioserver /system/bin/audioserver
    class main
    user audioserver
    group audio c.]]></description><category></category></item><item><title><![CDATA[Android Framework源码解读 - Audio - 序]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/117163976</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/117163976</guid><author>lzqustc</author><pubDate>Sat, 22 May 2021 16:15:39 +0800</pubDate><description><![CDATA[https://source.android.google.cn/devices/audio

Media Server： The media server contains audio services, which are the actual code that interacts with your HAL implementations. The media server is located in /frameworks/av/services/audioflinger. 

Client...]]></description><category></category></item><item><title><![CDATA[Perl获取微信小程序用户信息(包含openid,unionid)]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/84910920</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/84910920</guid><author>lzqustc</author><pubDate>Mon, 23 Oct 2017 10:21:40 +0800</pubDate><description><![CDATA[涉及微信小程序相关AIP如下：
1、wx.login
2、wx.getUserInfo
3、用户数据的签名验证和加解密

接口wx.getUserInfo当中的 openId 和unionId属于敏感数据，所以接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据，就需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下：

对称解密使用的算...]]></description><category></category></item><item><title><![CDATA[MongoDB开发LBS应用]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/84910689</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/84910689</guid><author>lzqustc</author><pubDate>Wed, 18 Oct 2017 17:04:43 +0800</pubDate><description><![CDATA[
随着近几年各类移动终端的迅速普及，基于地理位置的服务（LBS）和相关应用也越来越多，而支撑这些应用的最基础技术之一，就是基于地理位置信息的处理。
关于LBS的详细介绍及通用的几个解决方案，可以参考：深入浅出Symfony2 - 结合MongoDB开发LBS应用
 
本文主要举例说明使用Perl语言 + MongoDB实现查找附近的人的实现方案。
涉及的官方API说明文档列表：
1、2...]]></description><category></category></item><item><title><![CDATA[Perl之Net::APNS实现苹果消息推送]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/84910684</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/84910684</guid><author>lzqustc</author><pubDate>Wed, 18 Oct 2017 16:26:42 +0800</pubDate><description><![CDATA[
Net::APNS is Apple Push Notification Service. Push message to iPhone and get unavalble-devicetoken.
 
苹果开发者官网说明：The APNs provider API lets you send remote notification requests to APNs. 
 
Net::A...]]></description><category></category></item><item><title><![CDATA[支付宝移动支付之服务端实现]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/84910669</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/84910669</guid><author>lzqustc</author><pubDate>Wed, 18 Oct 2017 15:30:38 +0800</pubDate><description><![CDATA[
支付宝（蚂蚁金服）移动支付的交互流程请参考：https://doc.open.alipay.com/doc2/detail?treeId=59&amp;amp;articleId=103658&amp;amp;docType=1
 
和微信支付的流程大体一致，即：
1、客户端提交订单内容信息
2、服务端根据订单内容信息（可以根据业务需要添加额外信息，而且要指定notify_url地址），按照签名规则生...]]></description><category></category></item><item><title><![CDATA[苹果应用内支付之服务端的实现]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/84910637</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/84910637</guid><author>lzqustc</author><pubDate>Wed, 18 Oct 2017 11:21:22 +0800</pubDate><description><![CDATA[
本文主要讲移动APP实现苹果支付的服务端实现步骤。
 
苹果应用内支付的流程可参考：
1、 官网说明：https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40...]]></description><category></category></item><item><title><![CDATA[PC网站通过微信扫码支付之服务端实现]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/84910593</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/84910593</guid><author>lzqustc</author><pubDate>Tue, 17 Oct 2017 17:28:28 +0800</pubDate><description><![CDATA[
支付申请说明参考：https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=3_1
 
微信扫码支付可分为两种模式，本示例选择模式二，具体流程及API文档参考：
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5
 
下面仅说明服务端的实现，主要包含两部分...]]></description><category></category></item><item><title><![CDATA[Perl获取微信小程序二维码]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/84910551</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/84910551</guid><author>lzqustc</author><pubDate>Tue, 17 Oct 2017 11:50:34 +0800</pubDate><description><![CDATA[
微信小程序API：
https://mp.weixin.qq.com/debug/wxadoc/dev/api/qrcode.html
 
# 参数 $path即页面路径，比如：&quot;pages/index?query=1&quot;
sub get_wxa_code {
    my ($fid, $path) = @_;
 
    my $ret = get_access_token()...]]></description><category></category></item><item><title><![CDATA[Perl之Linux::Inotify2]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/84910542</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/84910542</guid><author>lzqustc</author><pubDate>Tue, 17 Oct 2017 11:09:31 +0800</pubDate><description><![CDATA[
关于 inotify 机制的详细介绍可以参考文章：
inotify -- Linux 2.6 内核中的文件系统变化通知机制
文章写得很详细，而且还给出了c语言实现的例子。
 
下面我就来说说Perl里面，如何利用Linux::Inotify2 实现任务异步操作的例子。
比如 A进程（线程）将要完成的任务按一定规则 写到inotify监控的目录下，通过inotify机制自动解析并完成任...]]></description><category></category></item><item><title><![CDATA[Perl服务端通过CGI获取客户端ip地址]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/84910530</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/84910530</guid><author>lzqustc</author><pubDate>Tue, 17 Oct 2017 10:20:40 +0800</pubDate><description><![CDATA[
use CGI;
 
my $remoteip = $ENV{&quot;REMOTE_ADDR&quot;};   --&amp;gt; 客户端IP地址
my $remoteport = $ENV{&quot;REMOTE_PORT&quot;};  --&amp;gt; 端口
my $http_via = $ENV{&quot;HTTP_VIA&quot;};  --&amp;gt; VIA头部
 
可以根据下面方式，查看整个http头部内容：
my $ua...]]></description><category></category></item><item><title><![CDATA[Perl之Net::SMTP]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/84910496</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/84910496</guid><author>lzqustc</author><pubDate>Mon, 16 Oct 2017 16:54:25 +0800</pubDate><description><![CDATA[
用户Perl写个脚本，使用Net::SMTP模块发邮件：
 
#!/usr/bin/perl -w
use warnings;
use utf8;
binmode(STDIN, ':encoding(utf8)');
binmode(STDOUT, ':encoding(utf8)');
binmode(STDERR, ':encoding(utf8)');
 
use JS...]]></description><category></category></item><item><title><![CDATA[Perl之Spreadsheet::ParseExcel]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/84881035</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/84881035</guid><author>lzqustc</author><pubDate>Thu, 06 Apr 2017 11:37:57 +0800</pubDate><description><![CDATA[
转载：http://www.alonely.com.cn/CGI-Perl/20160908/29061.html
 
use strict;
use Spreadsheet::ParseExcel;
 
my $parser   = Spreadsheet::ParseExcel-&amp;gt;new();
my $workbook = $parser-&amp;gt;Parse('Book1...]]></description><category></category></item><item><title><![CDATA[Perl之Spreadsheet::WriteExcel]]></title><link>https://blog.youkuaiyun.com/lzqustc/article/details/84881026</link><guid>https://blog.youkuaiyun.com/lzqustc/article/details/84881026</guid><author>lzqustc</author><pubDate>Thu, 06 Apr 2017 11:13:27 +0800</pubDate><description><![CDATA[
一般导出excel功能是出现在后台管理系统中，运营人员为了便于统计，经常需要将大量数据导出。
本文主要描述如何将mongodb查询出来的数据写入excel表格。
 
一、安装相关模块：
1、MongoDB  -&amp;gt; 操作数据库
接口文档https://metacpan.org/pod/distribution/MongoDB/lib/MongoDB/Tutorial.pod
 ...]]></description><category></category></item></channel></rss>