自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ZChongr

海岛冰轮初转腾

  • 博客(46)
  • 资源 (1)
  • 收藏
  • 关注

原创 binder学习笔记(十四)—— binder_thread_read(...)都干了什么?

在binder请求的发起端,binder_transaction(…)函数的结尾,第#198行,它将struct binder_transaction的work字段插入target_list的尾部,然后完成发起端的工作。 在接收端binder_loop(…)函数的第#19行,也在通过调用ioctl(bs->fd, BINDER_WRITE_READ, &bwr)等待着来自发起端的请求。在驱动层

2016-08-13 20:18:34 5305

原创 Binder学习笔记(十三)—— 小结

驱动层为什么要篡改binder_buffer内的数据?先给出这张图: 上图中标红的部分需要重点考虑,为什么驱动层要篡改这两个字段呢?我们结合前面的文章或许可以找出端倪。在Binder学习笔记(七)—— ServiceManager如何响应addService请求 ?一文中其实留下了挺多疑问。server端调用addService(…)向ServiceManager注册该Service,Serv

2016-08-07 23:41:06 1889 5

原创 Binder学习笔记(十二)—— binder_transaction(...)都干了什么?

binder_open(…)都干了什么?在回答binder_transaction(…)之前,还有一些基础设施要去探究,比如binder_open(…),binder_mmap(…),这些调用是在打开设备文件/dev/binder之后必须完成的程式化操作,而在它们内部需要做一些数据结构的准备。首先来看binder_open(…) kernel/drivers/staging/android/bin

2016-08-01 01:11:43 10344 3

原创 Binder学习笔记(十一)—— 智能指针

轻量级指针Binder的学习历程爬到驱动的半山腰明显感觉越来越陡峭,停下业务层的学习,补补基础层知识吧,这首当其冲的就是智能指针了,智能指针的影子在Android源码中随处可见。打开frameworkds/rs/cpp/util,RefBase.h和StrongPointer.h两个文件,代码多读几遍都能读懂,可是串起来总感觉摸不到骨架,把不住主线。闭上眼零零星星的点串不成一条线。究其原因应该是此处

2016-06-13 00:58:42 4451

原创 binder学习笔记(十)—— 穿越到驱动层

Binder驱动层的代码在kernel/goldfish/drivers/staging/android下的binder.c和binder.h。Android源码是不带Linux内核的,驱动正是在这个内核里,需要单独下载,出门左转参见《Anrdoid源码、内核编译》。驱动的相关知识先不在这里展开了,那又是一个庞大的体系,以后再啃。直奔我们的主题——客户端为test()组织的请求数据是: 驱动程

2016-05-28 22:53:01 1403

原创 Binder学习笔记(九)—— 服务端如何响应Test()请求 ?

从服务端代码出发,TestServer.cppint main() { sp < ProcessState > proc(ProcessState::self()); sp < IServiceManager > sm = defaultServiceManager(); sm->addService(String16("service.testservice"), new

2016-05-15 15:30:10 4686

原创 Binder学习笔记(八)—— 客户端如何组织Test()请求 ?

还从客户端代码看起TestClient.cpp:14int main() { sp < IServiceManager > sm = defaultServiceManager(); // new BpServiceManager(new BpBinder(0)); sp < IBinder > binder = sm->getService(String16("service

2016-05-15 15:27:18 672

原创 Binder学习笔记(七)—— ServiceManager如何响应addService请求 ?

有了《ServiceManager如何响应checkService请求》的探索,研究addService就轻车熟路了,中间过程不再多说,仅把关键节点列出: frameworks/native/cmds/servicemanager/service_manager.c:347int main(int argc, char **argv){ …… binder_loop(bs, sv

2016-05-15 15:25:33 861

原创 Binder学习笔记(六)—— binder服务端是如何组织addService数据的?

在checkService的调查中我们知道客户端向ServiceManager请求服务名,ServiceManager根据服务名遍历本地链表,找到匹配的handle返回给客户端。这个handle显然是由服务端注册的,这个handle究竟是什么?要先搞清楚这个问题,必须研究服务端和ServiceManager是如何共同完成一次addService操作的。我们从服务端代码出发。TestService.c

2016-05-15 15:24:08 528

原创 Binder学习笔记(五)—— Parcel是怎么打包的?

前文中曾经遇到过Parcel,从命名上知道他负责数据打包。在checkService的请求/响应体系中,Parcel只打包了基本数据类型,如Int32、String16……后面还要用于打包抽象数据类型flat_binder_object,这会稍微复杂一些,因此有必要拿出来单独研究。我们从Parcel::writeInterfaceToken(…)追起,它的层层调用关系如下,这些函数都在framewo

2016-05-15 15:22:50 991

原创 Binder学习笔记(四)—— ServiceManager如何响应checkService请求

这要从frameworks/native/cmds/servicemanager/service_manager.c:347的main函数说起,该文件编译后生成servicemanager。int main(int argc, char **argv){ struct binder_state *bs; bs = binder_open(128*1024); // 打开/dev/b

2016-05-15 15:20:45 5218

原创 inder学习笔记(三)—— binder客户端是如何组织checkService数据的 ?

起点从TestClient.cpp的main函数发起:int main() { sp < IServiceManager > sm = defaultServiceManager(); sp < IBinder > binder = sm->getService(String16("service.testservice")); sp<ITestService> cs = i

2016-05-15 15:15:46 1258

原创 使用hexo搭建博客并上传GitHub

之前在博客园、简书、CSDN等地儿都开过博,一篇文章写好了,我希望能在几个平台可以同步发布,可是操作起来成本不低。几个平台下的富文本编辑器比较起来还是博客园更顺手,看着更舒服,尤其是代码块的操作灵活、准确。而CSDN对代码块内的文字加粗、修改字色后就会出现html文无法解析的情况,混杂着代码和html文本实在太难看了,后来我知道原来是Markdown的代码块规则限制。而且CSDN刚刚才取消了提交文章

2016-05-14 20:23:39 1878

原创 Binder学习笔记(二)——defaultServiceManager()返回了什么?

不管是客户端还是服务端,头部都要先调用sp sm = defaultServiceManager();defaultServiceManager()都干了什么,它返回的是什么实例呢?该函数定义在frameworks/native/libs/binder/IserviceManager.cpp:33sp defaultServiceManager(){ if

2016-05-09 21:50:18 1988

原创 Binder学习笔记(一)

网上看了很多关于binder的文章,但我还是想把自己的心路历程记录下来,有些是跟着别人的脚步领略险峻风景,有些则是自己只身探入代码深处打捞出的收获。我不确定是否全部融会贯通,更担心一两个月后会完全不记得来时的路。最好的验证和留存的方法是把他们写成博文,几个月后回头再来读,看是否还能读得明白。如果可以,说明我两个担心已不复存在;如果又回到云里雾里,刚好可以带着新问题继续探索。文章很多地方会引用And

2016-05-08 23:47:43 1954

原创 Android6的Logger日志系统

Android2.x中Logger日志系统采用了字符设备驱动来支持,到了Android6.0已经找不到kernel/goldfish/drivers/staging/android/logger.c这一层的驱动程序了。不过上层接口还是没变的,所以顺着最顶层接口,可以一路找到6.0下Logger的实现机制。从最上层frameworks/base/core/java/android/util/

2016-03-06 12:42:19 1051

原创 Android emulator中C代码的调试——gdb/gdbservers时遇到的坑

先写个helloworld吧,在Android源码树中创建文件夹external/helloworld,加入文件:// helloworld.c#include #include int main(int argc, char** arv){ printf("Hello world~\n"); return 0;}# Android.mkLOCAL_PATH

2016-03-02 17:51:40 1072

原创 Android源码树中C代码的编译

侯 Sir说:“源码之下,了无秘密。” 但有些秘密还是要搞起来了看得更真切,仅从静态代码的体位很难体会到运动时的妙处。因此环境搭好了,下一步就是调试。gdbserver搭配gdb的调试环境走得很顺利,可是mmm出的C代码总是没有debugging symbol。在调研原因的过程中倒是熟悉了一些工具的用法,值得记录。首先,关于mmm的代码,它是写在build/envsetup.sh中的函数,内部

2016-02-29 23:50:22 727

原创 实现内核驱动程序模块

例子是从《Android系统源代码情景分析》第二章抄过来的,在学习的过程中还是遇到了不少的问题。个人体会:在学习第二章之前应该把《Linux设备驱动程序》这本书至少前四章要读一遍,理解一些基础概念和背景知识,不过这本书还是略旧,比如sysfs就没有解释,多google吧。本书第二章要理解透了再往下进行,因为这个简单的例子从下往上贯穿了Android系统各层,是理解后面各章的基础。下面列

2016-02-22 17:38:37 940

原创 工欲善其事——Sublime Text

一直在找mac下顺手的代码编辑器,要求能方便地查找和编辑,最好能再集成调试,最后选择了sublime。用了一段时间emacs,但是学习曲线过于陡峭。尤其是眼下的要务是啃代码时,玩弄emacs有点舍本逐末了,所以暂时还是先放一放神器,找个能尽快上手的玩吧~随着使用深入,我会不断更新,逐步把一些经验码到本篇博文后面。为了撸码更顺手,除了基本包以外,还需要装几个插件。首先要安装Packa

2016-02-22 17:38:34 592

原创 关于CRTP(Curiously Recurring Template Prattern)的使用

在阅读frameworks/rs/cpp/util/RefBase.h之LightRefBase时,我记得《C++设计新思维》里对这种用法是有过介绍的,可是今天翻箱倒柜,怎么都找不到那本奇书了。当年所谓的前卫,今天已经遍地开花,赶紧再把CRTP给复习一下。CRTP模式主要有两种使用场景:一、Meyers Countingtemplate class Counting

2016-02-22 17:38:30 639

原创 Android源码、内核编译

Android源码和内核的编译就是一场马拉松,每一个节点都耗时漫长,下载源码、编译源码、下载内核、编译内核,下载中途会断掉,编译中间会失败,求解再重来,又是一轮马拉松,于是每一步都要做好备份和记录,可是30G的源码(编译后已经达到70G)备份一次都需要好久。好在春节伊始我放弃了其他的学习,全力搞这个过程,终于算是拿下了。不过,漫漫长路,这只是一个开头。我编译的是Android最新稳定版本and

2016-02-22 17:38:25 1948

原创 写一个Android输入法02——候选窗、转换

上一篇介绍了完成Android输入法的最小化步骤,它只能将按键对应的字符上屏。一般的东亚语言都有一个转换的过程,比如汉语输入拼音,需要由拼音转成汉字再上屏。本文将在前文基础上加入完成转换过程所必需的候选窗。本文代码可参见https://github.com/palanceli/AndroidXXIME/tree/v2。如下图所示,用红框框出来的窗体是候选窗,其内的字符创叫做候选串,点击候选窗使

2016-02-22 17:38:21 2251

原创 写一个Android输入法01——最简步骤

本文演示用Android Studio写一个最简单的输入法。界面和交互都很简陋,只为剔肉留骨,彰显写一个Android输入法的要点。1、打开Android Studio创建项目,该项目和普通APP的不同之处在于它不需要添加任何Activity: 我给该输入法命名为AndroidXXIME。2、修改manifest文件如前文《Android下创建一个输入法》中

2016-02-22 17:38:16 4188 2

原创 SoftKeyboard在AndroidStudio下的配置和运行

前文翻译的《Android下创建一个输入法》一文中提到了来自Google的输入法例程SoftKeyboard,备忘下该程序的配置和运行。首先将SoftKeyboard导入AndroidStudio,选择Import project(Eclipse ADT, Gradle, etc.)然后打开虚拟机配置,并勾选底部的“Use virutal keyboard for text

2016-02-22 17:38:11 853

原创 MAC的开机启动

之前了解到MAC下的开机启动和定时自动运行不再沿用cron,而是有自己的launchctl:把启动文件放在/Library/LaunchDaemon/xxx.plist,里面可以记录运行的时间间隔、工作目录之类的。我在公司的笔记本使用无线网,每次重启后IP可能会变,变了以后我在家里就找不到它了,为了解决这个问题,我让机器每隔一段时间执行ifconfig命令,并把结果输出到云同步盘上去。只要查一

2016-02-22 17:38:07 709

原创 SourceTree——MAC OSX下的Git GUI客户端

在MAC下面为Git找一款用得顺手的GUI客户端还真不容易。学习工具使用还是先器而后道的路径比较适合我,当年上手CVS SVN都是如此,先通过tortoise客户端熟练了基本操作,之后在搭建构建平台的时候再熟悉各种命令。其实如果不是必须要用脚本调用,也没必要学习命令,通过GUI了解背后的原理就足够了。筛选还是颇花了些时间,有的收费,有的使用比较麻烦,如Collab,貌似还有bug,最后选择了S

2016-02-22 17:38:02 670

原创 刚到手的树莓派

前面我用小米路由搭建起了从外网可以访问的网站,并和域名绑定在了一起,但还是不完美。因为我发现无论怎么搞,从外网也无法ssh到路由器上去。猜测可能是小米出于安全的考虑,做了屏蔽。所以即使加了防火墙例外,也还是登不进来。如果我想随时随地的修改服务器文件,就没法做到了。于是买了个树莓派,把http服务架设在树莓派上,通过在小米路由上设置端口转发,这样外网的http和ssh请求就被转发到树莓派了。小米路由

2016-02-22 17:37:58 912

原创 Android下创建一个输入法

输入法是一种可以让用户输入文字的控件。Android提供了一套可扩展的输入法框架,使得应用程序可以让用户选择各种类型的输入法,比如基于触屏的键盘输入或者基于语音。当安装了特定输入法之后,用户即可在系统设置中选择个输入法,并在接下来的输入场景中使用该输入法。不过在任一时刻,只能使用一个输入法。为了在安卓系统下创建一个输入法,需要新建一个包含扩展了InputMethodService类的安卓应用,

2016-02-22 17:37:49 1319

原创 以证书的方式登录ssh

常常要登录多台Linux服务器,过去在Windows下使用SecureCRT,比较省心,配置还可以放到云盘,实时同步。现在改用MAC貌似就没有那么好用的东西了,每次ssh命令登录都需要输入密码,很烦。最终找到iTerm + 以证书方式登录ssh,基本能解决需要记忆ip和用户名密码的问题。具体步骤如下:一、以证书的方式登录ssh假设要从机器A ssh到 机器B,则称A为客户端,B为服务器。

2016-02-22 17:37:45 984

原创 JSPatch在MAC下的使用

简单调研JSPatch的使用,之所以在MAC下是因为可以创建一个命令行的应用,简化无关代码。具体做法如下:第一步,去https://github.com/bang590/JSPatch/tree/master/JSPatch下载JSEngine.h、JSEngine.m和JSPatch.js三个文件,并拖入工程,并选择Copy items if needed:第二步,添加一个被测试的类

2016-02-22 17:37:40 433

原创 sqlite3使用备忘

执行sqlite3进入sqlite3环境:$ sqlite3SQLite version 3.8.10.2 2015-05-20 18:17:19Enter ".help" for usage hints.Connected to a transient in-memory database.Use ".open FILENAME" to reopen on a persi

2016-02-22 17:37:36 328

原创 iOS模拟器录屏转gif神器

我发现苹果的Quick Time Player用来录屏就挺好用的。打开后选择 文件 - 新建屏幕录制 - 点击录制按钮, 划出要录制的模拟器窗体 - 点击录制就可以了。录制成mov格式还要再转成gif,因为很多地方上传视频如果要发布都还要再审核,有延迟。我用GIFBrewery,把Frame count调成100,播放速度不要太快,保存即可。

2016-02-22 17:37:31 738

原创 UINavigationController + UIScrollView组合,视图尺寸的设置探秘(三)

还是在苹果的 View Controller Catalog for iOS 文章中找到答案。文中提到了两点:1、If the navigation bar or toolbar are visible but not translucent, it does not matter if the view controller wants its view to be displayed us

2016-02-22 17:37:29 632

原创 UINavigationController + UIScrollView组合,视图尺寸的设置探秘(二)

承接上文,我想把view布局修改为如下模式,让ScrollView长在NavigationBar的下方,这总不会有遮挡的问题了吧:story board内容如下,主要是右侧视图蓝色区域添加了ScrollView:ViewController的代码如下:@interface ViewController ()@property (weak, nonatomic) IBOu

2016-02-22 17:37:24 467

原创 UINavigationController + UIScrollView组合,视图尺寸的设置探秘(一)

UINavigationController和UIScrollView是iOS下几种主要的交互元素,但当我搭配二者在一起时,UIScrollView的滚动区域出现了很诡异的现象。我希望UIScrollView横向可翻页,纵向与其frame等高不可滚动,但诡异的是:1、我把UIScrollView的contentSize设为和其frame高度相同,可结果是他总能上下滚动一小段。2、我在UIScrol

2016-02-22 17:37:22 659

原创 内容可循环重用的ScrollView

UIScrollView是iOS中最常用的交互控件之一,本文讨论当设定为翻页模式,内容页很多的时候,如果给每个页面都创建一个新View,会导致资源爆表。比较好的做法是参考UITableViewCell的做法,引入重用机制。原理非常的简单:不管有多少内容要显示,只要三个View就足够了,假设为A、B、C。为了后面方便操作,我把三个view放进一个大的容器视图containerView中,再把co

2016-02-22 17:37:17 661

原创 关于Logger

Logger是我在各类编程语言中使用最多,同时也是改进最多的一个函数,今天在iOS下又折腾了一番,终于找到我想要的一个版本,这里做一个总结。python版python对logger有专门的支持,只需要把log格式设置为自己想要的即可:import logging......loggingFormat = '%(asctime)s %(lineno)4d %(leveln

2016-02-22 17:37:13 374

原创 Git入门操作

仅学习Git的一些入门操作比较容易,平时更多地使用GitHub,不过今天我想自个搭个服务练练手。当看完一些材料合作了一些验证之后,才发现其实所谓的服务和之前的svn完全不一样了。过程记录如下:LinuxServer端安装git我把服务打在Linux机器上,这台破机器没有apt-get,没有yum,只好自己下载源码,自己编译 $ wget http://distfiles.macpo

2016-02-22 17:37:08 329

原创 iOS Programming GitHub

我把学习《iOS编程(第4版)》的相关代码放在了GitHub上:https://github.com/palanceli/iOSProgramming学了一段时间之后,当要用到某个知识点,需要回过头再看的时候,找到相关的章节太困难了。所以我把所有的章节都放在了同一个APP里面,需要用的时候,在这个APP里直接找就行了。内容包含每个章节中的例程以及后面的作业,但我并不是完全照抄了书上的代

2016-02-22 17:37:04 485

windbg windows下的经典调试工具

windows下的经典调试工具。这个版本的尺寸比较小。

2014-05-26

空空如也

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

TA关注的人

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