android r 编译找不到头文件_kOS(1):编译

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。权限判断等将来实现。

v2-13f97a3a0da35a20d117f84214a4696b_b.jpg
kOS和Android源码树区别
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值