kOS不是一个全新操作系统,它基于Android。编译kOS app须要android NDK,版本至少是16b,至于android SDK则不须要了。
一、app层
1.1 预定义宏:_KOS
Android.mk
--------------------
LOCAL_CFLAGS += -D_KOS
kOS用Android NDK编译,于是kOS app继承了编译Android app时所有预义宏。为区别Android app,kOS app要求编译时多加上_KOS,该宏定义的地方是在Android.mk。注:基于Rose开发时,Rose已在给出的Android.mk中预定义了该宏。
1.2 头文件
<apps-src>/linker/kos/include
--------------------
camera2.h
gui2.h
mediacodec2.h
sys2.h
这4个头文件声明了app调用libkosapi.so时可使用的api。用Rose开发时,它们放在<apps-src>/linker/kos/include目录。
所有api是C语法,没用C++,而且都有extern "C"修饰。
编译kOS app时,不必向NDK增加或修改任何头文件。
1.3 库文件
<apps-src>/linker/kos/lib
--------------------
libkosapi.so
对app来说,kOS就一个新增库:libkosapi.so。用Rose开发时,它们放在<apps-src>/linker/kos/lib目录。注:基于Rose开发时,Rose已在给出的Android.mk中用“-L”链接了libkosapi.so。
注:libkosapi.so分32位和64位版本,它们复制于<aosp>/out/target/product/<device>/system/lib或lib64。
二、android源码层
2.1 让libkosapi.so成为系统库
须执行两个步骤。1)修改<aosp>/build/target/product/base.mk,让把libkosapi.so放入设备的/system/lib。2)修改public.libraries.android.txt,让成为系统库,即在调用android_init_namespaces时,public_libraries会有libkosapi.so。
<aosp>/system/core/rootdir/etc/public.libraries.android.txt
-----------------
libandroid.so
libc.so
...
libkosapi.so
public.libraries.android.txt在设备上的位置是“/etc/public.libraries.txt”。
2.2 libkosapi.so源码(frameworks目录。新增)
<aosp>/frameworks/native/include/kosapi。头文件。
<aosp>/frameworks/native/libs/kosapi。cpp文件。
源码去实现api时用的是cpp,为保证api能被C代码准确调用,cpp文件中需include相关api的头文件,以确保输出的api是extern "C"。
LOCAL_CFLAGS += -fvisibility=hidden -DNDK_EXPORT='__attribute__((visibility ("default")))'
为减少*.so尺寸,让只输出自个希望的api,Android.mk使用了“visibility”,希望输出的api前加上NDK_EXPORT宏。
NDK_EXPORT int gui2_get_surface()
2.3 systemserver源码(frameworks目录。新增)
<aosp>/frameworks/native/include/kos。头文件。
<aosp>/frameworks/native/services/systemserver。systemserver的cpp文件。
2.4 rose库(system目录。新增,用惯了Rose,从中提取kOS要用到部分,像tfile)
<aosp>/system/core/include/rose。头文件。
<aosp>/system/core/librose。rose库cpp。
2.5 zygote(frameworks目录。修改)
<aosp>/frameworks/base/cmds/app_process。
2.6 其它修改
- CameraService::getCameraServiceProxy()。不再通过IServiceManager,直接返回nullptr。media.camera.proxy服务由Java写的SystemServer实现,等将来改到C++后再放开。
- BatteryService::checkService()。不再通过IServiceManager,直接返回nullptr。batterystats服务由Java写的SystemServer实现,等将来改到C++后再放开。
- CameraService::BasicClient::startCameraOps()。注释掉开始到“mOpsActive = true”(包括它)的代码。AppOpsManager是反调app进行权限判断,它是Jave写的。
- <aosp>/frameworks/native/libs/binder/IServiceManager.cpp中的checkPermission。直接返回true。权限判断等将来实现。