Dorck's Blog

乾坤未定,你我皆是黑马。

Android上的Deep-Link技术调研

本文是两年前输出的文章,可能与现在的成熟方案存在部分细节上“代沟”,请诸位选择性阅读,适当参考即可。 一、需求背景 现在有很多 APP 支持从浏览器或其他地方唤起自家应用,并跳转至特定页面去提高用户黏性。在提高运营手段的背景下,应用也需要迫切提高自身的曝光入口以及活动场景。如果用户可以通过点击短信中的一个活动链接能够直接跳转到目标 APP 的特定页面,那么带来的好处也是不言而喻的...

Launcher进程启动过程剖析

上一篇文章我们对 Android 系统启动过程做了一定了解,本文将继续分析 Launcher 进程的启动流程。 本文基于 Android 13 最新代码来进行源码分析。 Launcher 进程启动 上文中,我们最终谈到了 system_server 进程的创建过程,并且该进程主要负责: 创建系统服务管理器——SystemServiceManager 启动各种服务(A...

回顾Java中经典的生产/消费者模型

概述 生产者-消费者模型是 Java 并发编程中比较常见的加锁应用场景之一,以下是维基百科的对于该名词的定义: 生产者消费者问题(Producer-consumer problem),也称有限缓冲问题(Bounded-buffer problem),是一个多进程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题...

Android系统启动流程剖析

Android 手机从长按开机到应用的启动阶段都经历了些什么呢?Android 启动过程涉及一系列操作,首先是启动 ROM,接着是引导加载程序、内核启动、init、Zygote 和 SystemServer 创建等过程。整个过程涉及到虚拟机的启动、Binder 线程池的创建以及各项系统服务启动等过程。熟悉 APP 启动过程还可以帮助我们打破性能优化瓶颈,助力于启动性能的提升。下面是启动过程涉...

AOSP在Mac上的编译实践(上)

AOSP,即 Android Open Source Project,对于 Android 开发者来说再熟悉不过的项目,本文将着重介绍如何在 MacOS Monterey 环境上下载完整的 AOSP 源码。 Git & Python 1. Git 安装和配置 在安装了 Homebrew 的情况下,安装 git 我们只需要执行如下命令: 1 brew install git ...

效率编程之快捷键篇

这是一个关于如何效率编程的系列专题,未来将会涉及诸如工具、脚本、插件、开源框架等各方面,只要能够帮助我们提升开发效率。 在日常当中,熟练地运用各种快捷键能够极大地提升我们的开发和工作效率。当看到其他同学通过快捷键两三下操作就帮你定位了问题代码并修改完毕,你是否也曾露出羡慕之色。正所谓磨刀不误砍柴工,快捷键也像宝刀一样,长时间弃而不用就会生锈,长此以往我们就会失去这一强大的臂助。 以...

Android系统中线程的创建过程

我们都知道,Android 中线程创建过程需要追溯到 Native 层面,最终是委托给一个 Linux 标准线程 pthread 来执行的,所以 Android 中线程状态本质上是 Native 线程的一种映射。Android 中运行的线程可以分为两种:一种是 attach 到虚拟机的,即虚拟机线程;另一种是没有 attach 到虚拟机的。今天我们就分别从源码层面来看看 Android 系统...

简单聊聊 ChatGPT

关于国内如何注册和使用 ChatGPT 可以参考这篇文章:国内注册一个属于自己的免费ChatGPT账号。本文不是扫盲贴,只是通过这两天对 ChatGPT 的使用体验来随便聊聊。 首先,对于他所具备的能力想必大家已经心照不宣了,从它(ChatGPT 3.0)问世以来的各项 DAU、MAU 数据就可以知道其火爆程度了。它的出现及发展代表着自然语言处理提升到了新的高度,甚至有人称其为第三次工业革...

Android系统中关于/proc目录的点滴

Android 系统有着这么一个神奇的“文件“目录存放着 CPU 及设备所运行进程的相关数据,这对于我们从事 APM 应用性能监控有着莫大的帮助。当然这种监控应用及手机系统信息的方式并非无中生有,早在 Android Framework 中就已经涉及它的踪迹,比如 ANR 发生时,系统会去 dump 及上报打印相关 CPU、进程、线程等信息到 log 中。而这些信息是借助 ProcessCp...

把数组排成最小的数

本文是对于 常用排序算法合集 的扩展应用。 题目内容 把数组排成最小的数。要求如下: 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 附加说明: 0 < nums.length <= 100 输出结果可能非常大,所以你需要返回一个字符串而不是整数 拼接起来的数字可能会有前导 0,最后结果不需要...