Android从程序员到架构师之路1

源码目录
在线查看源码
https://www.androidos.net.cn/
http://androidxref.com/
Android从程序员到架构师之路1_第1张图片
Android.mk作用
Android从程序员到架构师之路1_第2张图片
编写简单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从程序员到架构师之路1_第3张图片
同项目多个源码文件编译-逐个增加文件名

===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从程序员到架构师之路1_第4张图片
如何引入系统库

项目目录
						---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)	//编译所生成的目标文件格式

Android从程序员到架构师之路1_第5张图片
如何编译生成apk

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

Android从程序员到架构师之路1_第6张图片
Android从程序员到架构师之路1_第7张图片
Android从程序员到架构师之路1_第8张图片
Android从程序员到架构师之路1_第9张图片
Android从程序员到架构师之路1_第10张图片

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)	//编译所生成的目标文件格式

Android 启动过程
Android从程序员到架构师之路1_第11张图片
Android从程序员到架构师之路1_第12张图片
Android启动模式

1、recovery 升级模式:启动recovery模式,内核和文件系统
2、正常启动模式:引导内核和启动Android系统

Android从程序员到架构师之路1_第13张图片
init启动分析

system/core/init/init.cpp
编译后在文件系统 init

Android从程序员到架构师之路1_第14张图片

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);
  	    ...

Android从程序员到架构师之路1_第15张图片

初始化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

Android从程序员到架构师之路1_第16张图片

6、get_kernel_cmdline_partitions() 得到系统分区,创建链接
命令 ls /dev/block/by-name/ -l

init启动脚本
Android从程序员到架构师之路1_第17张图片

system/core/rootdir/init.rc
grep "init.environ.rc" -r system/core/
system/core/rootdir/Android.mk 
插入驱动

Android从程序员到架构师之路1_第18张图片
Android从程序员到架构师之路1_第19张图片

kill 1233 杀死守护进程,init会重启
ps | grep "netd"
stop netd 不会重启
start netd

Android从程序员到架构师之路1_第20张图片
init脚本解析
Android从程序员到架构师之路1_第21张图片
Android从程序员到架构师之路1_第22张图片

init.cpp
->LoadBootScripts
-> parser.ParseConfig("/init.rc");

Android从程序员到架构师之路1_第23张图片
Android从程序员到架构师之路1_第24张图片
13.init脚本执行和进程守护(1)
Android从程序员到架构师之路1_第25张图片
Android从程序员到架构师之路1_第26张图片
Android从程序员到架构师之路1_第27张图片
Android从程序员到架构师之路1_第28张图片
Android从程序员到架构师之路1_第29张图片
Android从程序员到架构师之路1_第30张图片

14.init脚本执行和进程守护(2)

1、根据Shell或者系统中消息设置系统Prop
2、守护系统服务,如果服务退出,重启退出的服务

Android从程序员到架构师之路1_第31张图片
Android从程序员到架构师之路1_第32张图片

 ->start_property_service();
 -> property_set_fd = CreateSocket(PROP_SERVICE_NAME, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, false, 0666, 0, 0, nullptr);
 ->

Android从程序员到架构师之路1_第33张图片
15.android服务介绍与davlink启动
Android从程序员到架构师之路1_第34张图片

在这里插入代码片

Android从程序员到架构师之路1_第35张图片

/frameworks/base/cmds/app_process/app_main.cpp
启动zygote
->runtime.start("com.android.internal.os.ZygoteInit", args, zygote);

Android从程序员到架构师之路1_第36张图片
Android从程序员到架构师之路1_第37张图片

16第二章Zygote剖析与system_server启动
Android从程序员到架构师之路1_第38张图片
Android从程序员到架构师之路1_第39张图片
Android从程序员到架构师之路1_第40张图片
17.Zygote创建APP分析
Android从程序员到架构师之路1_第41张图片
Android从程序员到架构师之路1_第42张图片
Android从程序员到架构师之路1_第43张图片
18.zygote_load系统资源分析及优化
Android从程序员到架构师之路1_第44张图片
Android从程序员到架构师之路1_第45张图片
Android从程序员到架构师之路1_第46张图片
Android从程序员到架构师之路1_第47张图片
Android从程序员到架构师之路1_第48张图片

logcat  | grep "preloaded"

Android从程序员到架构师之路1_第49张图片
Android从程序员到架构师之路1_第50张图片
19第二章开机界面分析
Android从程序员到架构师之路1_第51张图片
Android从程序员到架构师之路1_第52张图片
Android从程序员到架构师之路1_第53张图片
Android从程序员到架构师之路1_第54张图片
Android从程序员到架构师之路1_第55张图片
20第二章systemserver服务分析
Android从程序员到架构师之路1_第56张图片
Android从程序员到架构师之路1_第57张图片
Android从程序员到架构师之路1_第58张图片
21第二章ServiceManager服务分析
Android从程序员到架构师之路1_第59张图片
Android从程序员到架构师之路1_第60张图片
Android从程序员到架构师之路1_第61张图片
Android从程序员到架构师之路1_第62张图片
22第二章packageMangerService服务分析
Android从程序员到架构师之路1_第63张图片
Android从程序员到架构师之路1_第64张图片
Android从程序员到架构师之路1_第65张图片
Android从程序员到架构师之路1_第66张图片
Android从程序员到架构师之路1_第67张图片
23第三章AndroidSensor简介
Android从程序员到架构师之路1_第68张图片
Android从程序员到架构师之路1_第69张图片
Android从程序员到架构师之路1_第70张图片
Android从程序员到架构师之路1_第71张图片
Android从程序员到架构师之路1_第72张图片
Android从程序员到架构师之路1_第73张图片
24第三章Android_Sensor框架
Android从程序员到架构师之路1_第74张图片
Android从程序员到架构师之路1_第75张图片
Android从程序员到架构师之路1_第76张图片
Android从程序员到架构师之路1_第77张图片
Android从程序员到架构师之路1_第78张图片
25第三章SensorManger分析
Android从程序员到架构师之路1_第79张图片
Android从程序员到架构师之路1_第80张图片
Android从程序员到架构师之路1_第81张图片
Android从程序员到架构师之路1_第82张图片
2627SensorService分析
Android从程序员到架构师之路1_第83张图片
Android从程序员到架构师之路1_第84张图片
Android从程序员到架构师之路1_第85张图片
Android从程序员到架构师之路1_第86张图片
Android从程序员到架构师之路1_第87张图片
Android从程序员到架构师之路1_第88张图片
Android从程序员到架构师之路1_第89张图片
Android从程序员到架构师之路1_第90张图片
Android从程序员到架构师之路1_第91张图片
Android从程序员到架构师之路1_第92张图片
282930Android_input设备分析
Android从程序员到架构师之路1_第93张图片
Android从程序员到架构师之路1_第94张图片
Android从程序员到架构师之路1_第95张图片
Android从程序员到架构师之路1_第96张图片
Android从程序员到架构师之路1_第97张图片
Android从程序员到架构师之路1_第98张图片
Android从程序员到架构师之路1_第99张图片
31Anroid获取Input事件
Android从程序员到架构师之路1_第100张图片
Android从程序员到架构师之路1_第101张图片
Android从程序员到架构师之路1_第102张图片

你可能感兴趣的:(framework)