FileChannel 高速拷贝文件的秘密 最近在做性能优化,发现 Java NIO 中的 FileChannel 类的 transfer 相关方法,能显著提升文件拷贝速度(自测减少耗时 30-70% 左右)。 官方的说法是,利用了文件系统的缓存: This method is potentially much more efficient than a simple loop that reads from the source cha 2016-09-22 编程 Android Java NIO Linux 操作系统 DMA mmap
SQLite 并发读写问题 Android 中对 SQLiteDatabase 多线程并发读写时,很容易抛出以下异常: java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed. at android.database.sqlite.SQLiteConnectionPo 2016-09-07 编程 Android SQLite
JNI 引用问题梳理 最近项目中有个视频文件分块上传的模块,核心逻辑是 C/C++ 实现的,Android 上层调用自然又要写 JNI。 其中有个需求是 Native 层上传进度更新时需要回调 Java 代码,这里我用了 C++11 的 Lambda 表达式: std::function<void(unsigned)> cxx_progress_callback; if (jcallback) & 2015-11-19 编程 JNI
Java 内存分配与垃圾回收机制 程序计数器: 用于指示当前线程执行的指令行号,字节码解释器通过改变它的值选取下一条待执行的指令; 分支、循环、跳转、异常处理、线程恢复都需要依赖它; 它是线程私有的; 2015-07-16 编程 Java JVM
DexClassLoader 实现 Android 插件加载 Java 中的 ClassLoader:Java 中 ClassLoader 用于动态加载 Class 到 JVM,包含 BootstrapClassLoader(C++ 编写,用于加载系统核心类)、ExtClassLoader(用于加载 lib/ext/ 目录的扩展 API)、AppClassLoader(加载 CLASSPATH 目录下的类)。 双亲委托机制: 任何自定 2015-04-19 编程 Android Java
深入理解 Android:ActivityManagerService Linux 设置进程优先级函数:int setpriority(int which, int who, int prio); 参数 which 和 who 联合使用: which 为 PRIO_PROGRESS 时,who 代表进程; which 为 PRIO_PGROUP 时, who 代表进程组; which 为 PRIO_USER 时,who 代表 uid; 参数 prio 2015-04-14 编程 Android
深入理解 Android:PowerManagerService、BatteryService/BatteryStatsService PowerManagerService 简介: PowerManagerService 从 IPowerManager.Stub 类派生,并实现了 Watchdog.Monitor 和 LocalPowerManager 接口; 客户端使用 PowerManager 类,其内部通过代表 BinderProxy 端的 mService 成员变量与 PowerManagerService 进行 Bi 2015-04-07 编程 Android
深入理解 Android:PackageManagerService SystemServer 创建 PackageManagerService: 调用 PackageManagerService 的 main() 方法,得到 IPackageManager 对象; 调用 IPackageManager.isFirstBoot() 判断是否开机后第一次启动(Zygote 或 SystemServer 退出后,init 会再次启动它们); 调用 IPackageM 2015-04-05 编程 Android
深入理解 Android:Surface 系统 FrameBufferDevice: FrameBuffer 就是存储图像帧数据的缓冲区; FrameBufferDevice 是 Linux 平台的虚拟显示设备,为真实设备提供统一框架,这样应用层通过标准的 ioctl、mmap 系统调用就可以操作显示设备; FrameBuffer 中的缓冲区就是通过 mmap 把设备中的显存映射到用户空间的:在这块缓冲区写数据,就相当于在屏幕上绘制; 2015-04-03 编程 Android
深入理解 Android:Binder 通信机制 Native 层 Binder 通信:初始化 ProcessState: 单例模式,一个进程只能初始化一次; 构造函数初始化 mDriverFD 参数时,自动调用 open_driver(),打开 /dev/binder 设备,它是用于内核进程间通信的虚拟设备; 对 open_driver() 返回的 mDriverFD 对象,调用 nmap() 方法,为 Binder 分配内存用于接收数据 2015-03-31 编程 Android
深入理解 Android:线程、同步、消息 Linux 中的 epoll 机制: epoll 是 Linux 中高效的 IO 复用机制,显著提高大量并发连接下只有少数活跃时 CPU 的利用率; epoll 无需要遍历整个被监听的文件描述符集合,只需遍历被内核 IO 事件异步唤醒而加入 Ready 队列的文件描述符集合; epoll 不仅提供 select/poll 那种 IO 等待的水平触发(Level Triggered),还提供边缘 2015-03-28 编程 Android
深入理解 Android:系统初始化 系统初始化(init):加载并解析配置文件: 调用 parse_config() 解析 init.rc; init.rc 中包含一个个 section,调用 parse_new_section() 逐个解析; parse_new_section() 内部调用 parse_service() 和 parse_line_service(); 创建 zygote: zygote 被放在一个 2015-03-27 编程 Android
JNI 笔记 最近在看《深入理解 Android: 卷 I》,Framework 层要和 Native 层打交道,一开始肯定得介绍 JNI; 13 年项目中用到 WebP 的时候虽然接触过 JNI,但没有系统学习过,所以这里算是做个笔记。 JNI方法注册:静态注册: 对所有声明了 native 方法的 Java 类,运行 javah -o output packageName.className 生成 .h 2015-03-24 编程 JNI
Swift 初探:集 C++/Golang/Haskell/Rust 众多特性于一身 去年 WWDC 2014 苹果推出了全新的编程语言 Swift,不仅让全球 iOS 开发者为之兴奋,甚至让很多其他阵营的开发者都跃跃欲试。 Objective-C 确实很老了,感觉它就和 C++ 一样,历史包袱太重:本来就要兼容 C,还要不断添加新特性,支持各种编程范式,积重难返。 虽然作为一门新的语言 Swift 还需要逐步完善,一些 API 可能还有变动的可能,但毕竟大势所趋,未来它肯定是 2015-01-23 编程 Golang Rust Haskell C++ Swift
C++11/C++14 中的 Lambda 与 Objective-C 中的 Block 当年上大学我们专业分 C++ (包括 .NET ) 和 Java 两个方向,而我原本是 C++ 方向的,后来阴差阳错走上了 Java -> J2EE -> Android 这条“不归路”,以至于不少当年的同学都以为我一开始是 Java 方向的。 不过当年因为课程设置的原因,《面向对象程序设计( C++ )》和《面向对象程序设计( Java )》是相对应的,都过分强调面向对象那一块,除此 2014-11-15 编程 Objective-C C++ Lambda