Android是基于Linux的,使用Bionic
Libc库调用Linux系统调用的衍生发行版操作系统。其给内核添加了一些用来实现安卓所需特性的系统调用,将一些驱动实现为了可插拔的.ko模块,基于此实现了Hardware Abstract Layer/HAL层。
## 一、Android内核的制作流程
android-common或android-mainline分支,整合了Android特定功能与主线内核。autosleep和wakeup sources逐步替代)。logd替代)。incfs用于APK安装)。# 1. 从主线获取内核
git clone https://kernel.org/pub/scm/linux/kernel/git/stable/linux.git
cd linux
# 2. 合并Android通用内核补丁
git fetch https://android.googlesource.com/kernel/common android-mainline
git merge FETCH_HEAD
# 3. 添加设备特定代码(如Pixel内核)
git fetch https://android.googlesource.com/device/kernel/google/msm
git merge FETCH_HEADBootloader → Linux内核 → init进程 → Zygote → SystemServer → 应用
init进程(Android第一个用户空间进程)。init.rc,启动核心守护进程(如logd、hwservicemanager)。sysfs、procfs或字符设备向用户空间提供硬件访问。libhardware)通过ioctl或syscall与内核交互。DRM/KMS或FBDEV驱动显示输出。Sync驱动用于GPU-CPU同步。wakelock机制通过/sys/power/wake_lock与用户空间交互。/system/etc/selinux)。.ko)形式提供硬件驱动。ASHMem、ION部分功能被DMA-BUF替代。Binder主线化提案多次讨论,尚未完全合并。msm、exynos、tegra)。# 下载Pixel 6内核(Tensor芯片)
repo init -u https://android.googlesource.com/kernel/manifest -b android13-gs-pixel-5.10
repo sync
build/build.sh
# 输出:GKI内核 + 模块文件# 设备上电后的启动序列
Power On → Boot ROM → Bootloader → Kernel → AndroidBootloader(如U-Boot)主要任务: - 初始化硬件(时钟、内存、外设) - 加载内核镜像和设备树(DTB) - 设置启动参数 - 跳转到内核入口
// 内核启动流程示例
start_kernel()
→ setup_arch() // 架构相关初始化
→ setup_dt() // 解析设备树
→ init_IRQ() // 中断初始化
→ time_init() // 时钟初始化
→ rest_init() // 启动init进程# init.rc配置文件示例
on early-init
# 挂载文件系统
mount tmpfs tmpfs /dev
on init
# 创建设备节点
mkdir /dev/block
chmod 0755 /dev/block
on boot
# 启动核心服务
start servicemanager
start zygote
start surfaceflinger// ZygoteInit.java 核心逻辑
public static void main(String[] argv) {
// 1. 预加载类和资源
preload();
// 2. 启动SystemServer
if (startSystemServer) {
forkSystemServer();
}
// 3. 进入循环,等待创建应用进程
runSelectLoop();
}// SystemServer.java
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
// 启动核心服务
startBootstrapServices(); // ActivityManager, PowerManager
startCoreServices(); // Battery, UsageStats
startOtherServices(); // WindowManager, InputManager
}应用层 (Java/Kotlin)
↓
Framework层 (Java)
↓
JNI层 (C++)
↓
HAL层 (C/C++) ← 厂商实现
↓
Linux内核驱动
// 示例:Camera的JNI实现
// frameworks/base/core/jni/android_hardware_Camera.cpp
static const JNINativeMethod camMethods[] = {
{"native_setup", "(Ljava/lang/Object;ILjava/lang/String;)V",
(void*)android_hardware_Camera_native_setup},
{"native_release", "()V",
(void*)android_hardware_Camera_release},
};
// JNI函数实现
static void android_hardware_Camera_native_setup(
JNIEnv *env, jobject thiz, jobject weak_this,
jint cameraId, jstring packageName) {
// 创建Camera对象
sp<Camera> camera = Camera::connect(cameraId);
// 保存到Java对象
setCameraNative(env, thiz, camera);
}// AIDL接口定义
interface ICameraService {
ICamera connect(ICameraClient client, int cameraId);
}
// 服务端实现
public class CameraService extends ICameraService.Stub {
@Override
public ICamera connect(ICameraClient client, int cameraId) {
return new Camera(cameraId);
}
}// 内核读取设备树节点
struct device_node *node = of_find_node_by_path("/soc/camera");
const char *name = of_get_property(node, "compatible", NULL);
int irq = irq_of_parse_and_map(node, 0);# 系统属性定义
ro.hardware=qualcomm
ro.product.model=Pixel
persist.sys.timezone=Asia/Shanghai// 通过SystemProperties访问
import android.os.SystemProperties;
public class DeviceInfo {
public String getHardware() {
return SystemProperties.get("ro.hardware");
}
public String getModel() {
return SystemProperties.get("ro.product.model");
}
}// Camera HAL接口定义
public abstract class CameraDevice {
public abstract void configure(StreamConfiguration config);
public abstract CaptureResult capture(CaptureRequest request);
}
// 厂商实现
public class QualcommCamera extends CameraDevice {
@Override
public void configure(StreamConfiguration config) {
// 调用native层
nativeConfigure(config);
}
private native void nativeConfigure(StreamConfiguration config);
}时间轴:
│
├─ Boot ROM (芯片固件)
│ ├─ 加载Bootloader
│ └─ 验证签名
│
├─ Bootloader (U-Boot/ABL)
│ ├─ 初始化DDR、时钟
│ ├─ 加载内核和DTB
│ └─ 传递cmdline
│
├─ Linux Kernel
│ ├─ 解析DTB,创建设备
│ ├─ 初始化驱动
│ └─ 启动init进程
│
├─ Android init
│ ├─ 解析init.rc
│ ├─ 启动ueventd、logd
│ ├─ 挂载文件系统
│ └─ 启动Zygote
│
├─ Zygote
│ ├─ 预加载类
│ ├─ 启动SystemServer
│ └─ 监听socket
│
├─ System Server
│ ├─ 启动AMS、PMS、WMS
│ ├─ 注册服务到ServiceManager
│ └─ 启动Launcher
│
└─ 应用启动
├─ Zygote fork进程
├─ 加载应用类
└─ 执行Activity生命周期
// 服务注册
sp<IServiceManager> sm = defaultServiceManager();
sm->addService(String16("activity"), new ActivityManagerService());
// 服务获取
sp<IBinder> binder = sm->getService(String16("activity"));
sp<IActivityManager> am = interface_cast<IActivityManager>(binder);class SurfaceFlinger : public BnSurfaceComposer {
void createSurface(String8 name, DisplayId display) {
// 创建Layer
sp<Layer> layer = new Layer(this, name);
mCurrentState.layers.add(layer);
}
void onMessageReceived(int32_t what) {
switch (what) {
case MessageQueue::INVALIDATE:
handleMessageTransaction();
handleMessageInvalidate();
break;
}
}
};// Zygote中初始化ART
public class ZygoteInit {
static void preload() {
// 预加载类
preloadClasses();
// 初始化ART
VMRuntime.getRuntime().startBootImageProfile();
}
}# Android.bp示例
cc_binary {
name: "camera.hal",
srcs: ["*.cpp"],
shared_libs: [
"liblog",
"libhardware",
"libutils",
],
cflags: ["-DLOG_TAG=\"CameraHAL\""],
}这种架构设计使得Android能够: 1. 硬件抽象:通过HAL隔离硬件差异 2. 安全隔离:每个应用在独立进程运行 3. 性能优化:JIT/AOT编译提升执行效率 4. 可扩展性:通过Binder IPC实现模块化