android r 编译找不到头文件_kOS(1):编译
kOS不是一個全新操作系統,它基于Android。編譯kOS app須要android NDK,版本至少是16b,至于android SDK則不須要了。
一、app層
1.1 預定義宏:_KOS
Android.mk -------------------- LOCAL_CFLAGS += -D_KOSkOS用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.sopublic.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。權限判斷等將來實現。
總結
以上是生活随笔為你收集整理的android r 编译找不到头文件_kOS(1):编译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++代码好玩_Py之pygame:有趣
- 下一篇: django安装_pip安装Django