源码目录
在线查看源码
https://www.androidos.net.cn/
http://androidxref.com/
Android.mk作用
编写简单Android.mk
===
1、在文件夹加入Android.mk和main.c
LOCAL_PATH := $(call my-dir) // 定义了当前模块的相对路径
include $(CLEAR_VARS) //清空当前环境变量
LOCAL_MODULE:= Test //编译生成的目标名称
LOCAL_SRC_FILES := main.c //编译该模块需要的源文件
LOCAL_MODULE_PATH := $(LOCAL_PATH) //在当前路径下生成编译文件
include $(BUILD_EXECUTABLE) //编译所生成的目标文件格式
===main.c
#include
int main(void)
{
printf("hello android main");
return 0;
}
===生成执行文件
Install: out/target/product/xxx/system/bin/test
===Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := nubiaTest
LOCAL_SRC_FILES := main.c \
test1.c
LOACL_MODULE_PATH := $(LOCAL_PATH)
include $(BUILD_EXECUTABLE)
===main.c
#include
int main(void)
{
printf("hello android main");
return 0;
}
===test1.c
#include
void call_test1(void)
{
printf("hello android test1");
return ;
}
多个源码文件编译-调用系统库
===
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := nubiaTest
LOCAL_C_ALL_FILES := $(call all-c-files-under)
LOCAL_SRC_FILES := $(LOCAL_C_ALL_FILES)
LOACL_MODULE_PATH := $(LOCAL_PATH)
include $(BUILD_EXECUTABLE)
===
#include
int main(void)
{
printf("hello android main");
return 0;
}
===
#include
void call_test1(void)
{
printf("hello android test1");
return ;
}
一个mk编译多个目标文件
===
#include
void call_test1(void)
{
printf("hello android test1");
return ;
}
int main(void)
{
printf("hello android main test1");
return 0;
}
===
#include
int main(void)
{
printf("hello android main");
return 0;
}
===
#分别编译main.c test1.c
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := nubiaMain
LOCAL_SRC_FILES := main.c
LOACL_MODULE_PATH := $(LOCAL_PATH)
include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
LOCAL_MODULE := nubiaTest1
LOCAL_SRC_FILES := test1.c
LOACL_MODULE_PATH := $(LOCAL_PATH)
include $(BUILD_EXECUTABLE)
编译生成动态库
===
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libtest
LOCAL_C_ALL_FILES := $(call all-c-files-under)
LOCAL_SRC_FILES := $(LOCAL_C_ALL_FILES)
LOACL_MODULE_PATH := $(LOCAL_PATH)
include $(BUILD_SHARED_LIBRARY)
===
out\target\product\NX629J\obj_arm\SHARED_LIBRARIES\libtest_intermediates
编译生成静态库
===
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libteststatic
LOCAL_C_ALL_FILES := $(call all-c-files-under)
LOCAL_SRC_FILES := $(LOCAL_C_ALL_FILES)
LOACL_MODULE_PATH := $(LOCAL_PATH)
include $(BUILD_STATIC_LIBRARY)
===
target StaticLib: libteststatic_32 (out/target/product/NX629J/obj_arm/STATIC_LIBRARIES/libteststatic_intermediates/libteststatic.a)
项目目录
---Android.mk
---bin
---src
---main.cpp
---test1.cpp
===main.cpp
#include
#define LOG_TAG "Main"
#include
int main(void)
{
ALOGE("test");
return 0;
}
===test1.cpp
===
2、编译时引入库:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) //清空当前环境变量
LOCAL_MODULE:= libtest //编译生成的目标名称
LOCAL_C_ALL_FILES := src/test1.cpp
LOCAL_SRC_FILES := $(LOCAL_C_ALL_FILES)
LOCAL_MODULE_PATH := $(LOCAL_PATH)/lib
include $(BUILD_SHARED_LIBRARY) //编译所生成的目标文件格式
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := src/main.cpp
LOCAL_SHARED_LIBRARIES += liblog
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE)
查找so位置
find out/target/product/ -name liblog.so
如上已生成libtest动态库,需要在main中使用
如何引入第三方库
1、main.cpp
#include
#define LOG_TAG "Main"
#include
extern void call_test(void);
int main(void)
{
call_test();
ALOG("test");
return 0;
}
2、test1.cpp
void call_test(void)
{
return;
}
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) //清空当前环境变量
LOCAL_MODULE:= libtest //编译生成的目标名称
LOCAL_C_ALL_FILES := src/test1.cpp
LOCAL_SRC_FILES := $(LOCAL_C_ALL_FILES)
LOCAL_MODULE_PATH := $(LOCAL_PATH)/lib
include $(BUILD_SHARED_LIBRARY) //编译所生成的目标文件格式
include $(CLEAR_VARS) //清空当前环境变量
LOCAL_MODULE:= test //编译生成的目标名称
LOCAL_SRC_FILES :=src/main.cpp
LOCAL_SHARED_LIBRARIES += liblog
LOCAL_LDFLAGS := -L./lib/ -ltest
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE) //编译所生成的目标文件格式
如何引入第三方头文件
inc/test1.h
#ifndef TEST_H
#define TEST_H
extern void call_test(void);
#endif
#include
#define LOG_TAG "Main"
#include
#include "test1.h"
int main(void)
{
call_test();
ALOG("test");
return 0;
}
include $(CLEAR_VARS) //清空当前环境变量
LOCAL_MODULE:= test //编译生成的目标名称
LOCAL_C_INCLUDES += $(LOCAL_PATH)./inc/
LOCAL_SRC_FILES :=src/main.cpp
LOCAL_SHARED_LIBRARIES += liblog
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE) //编译所生成的目标文件格式
如何使用静态库
include $(CLEAR_VARS) //清空当前环境变量
LOCAL_MODULE:= test //编译生成的目标名称
LOCAL_C_INCLUDES += $(LOCAL_PATH)./inc/
LOCAL_LDFLAGS := $(LOCAL_PATH)/lib/libtest1.a
LOCAL_SRC_FILES :=src/main.cpp
LOCAL_SHARED_LIBRARIES += liblog
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE) //编译所生成的目标文件格式
LOCAL_PATH := $(call my-dir) // 定义了当前模块的相对路径
include $(CLEAR_VARS) //清空当前环境变量
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := LocalPackage
include $(BUILD_PACKAGE) //编译所生成的目标文件格式
如何编译生成jar
LOCAL_PATH := $(call my-dir) // 定义了当前模块的相对路径
include $(CLEAR_VARS) //清空当前环境变量
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := com.test.myjar
include $(BUILD_STATIC_JAVA_LIBRARY)//静态jar
include $(BUILD_JAVA_LIBRARY) //共享jar
USED_SHARE := true
include $(CLEAR_VARS) //清空当前环境变量
LOCAL_MODULE:= test //编译生成的目标名称
LOCAL_C_INCLUDES += $(LOCAL_PATH)./inc/
ifeq ($(USED_SHARE),true)
LOCAL_LDFLAGS := -L./lib/ -ltest
else
LOCAL_LDFLAGS := $(LOCAL_PATH)/lib/libtest1.a
endif
LOCAL_SRC_FILES :=src/main.cpp
LOCAL_SHARED_LIBRARIES += liblog
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE) //编译所生成的目标文件格式
1、recovery 升级模式:启动recovery模式,内核和文件系统
2、正常启动模式:引导内核和启动Android系统
system/core/init/init.cpp
编译后在文件系统 init
main函数:
// Clear the umask.
umask(0);
// Get the basic filesystem setup we need put together in the initramdisk
// on / and then we'll let the rc file figure out the rest.
mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");
mkdir("/dev/pts", 0755);
mkdir("/dev/socket", 0755);
挂载分区
mount("devpts", "/dev/pts", "devpts", 0, NULL);
...
初始化log系统,重定向到
klog_init() 替换 InitKernelLogging(argv);
/system/core/init/log.cpp
调试init.c
cat proc/kmsg 查看init.cpp 日志打印
1、InitKernelLogging(argv);
2、property_init(); 初始化环境变量
3、get_hardware_name(hardware,&revision) 得到硬件信息和版本 未找到
在adb查看cpu信息 cat proc/cpuinfo
4、process_kernel_cmdline 解析内核参数
->import_kernel_cmdline(false, import_kernel_nv);
/system/core/init/util.cpp
读/proc/cmdline
->export_kernel_boot_props();
5、 property_load_boot_defaults(); 导入默认环境变量
/system/core/init/property_service.cpp
6、get_kernel_cmdline_partitions() 得到系统分区,创建链接
命令 ls /dev/block/by-name/ -l
system/core/rootdir/init.rc
grep "init.environ.rc" -r system/core/
system/core/rootdir/Android.mk
插入驱动
kill 1233 杀死守护进程,init会重启
ps | grep "netd"
stop netd 不会重启
start netd
init.cpp
->LoadBootScripts
-> parser.ParseConfig("/init.rc");
14.init脚本执行和进程守护(2)
1、根据Shell或者系统中消息设置系统Prop
2、守护系统服务,如果服务退出,重启退出的服务
->start_property_service();
-> property_set_fd = CreateSocket(PROP_SERVICE_NAME, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, false, 0666, 0, 0, nullptr);
->
在这里插入代码片
/frameworks/base/cmds/app_process/app_main.cpp
启动zygote
->runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
16第二章Zygote剖析与system_server启动
17.Zygote创建APP分析
18.zygote_load系统资源分析及优化
logcat | grep "preloaded"
19第二章开机界面分析
20第二章systemserver服务分析
21第二章ServiceManager服务分析
22第二章packageMangerService服务分析
23第三章AndroidSensor简介
24第三章Android_Sensor框架
25第三章SensorManger分析
2627SensorService分析
282930Android_input设备分析
31Anroid获取Input事件