先准备一个演示用的native工程,名为clion_demo。
工程所在目录:aosp/vendor/clion_demo
aosp/vendor/clion_demo$ tree
.
├── Android.bp
└── clion_demo.cpp
源码文件:clion_demo.cpp
目标可执行文件:clion_demo
cc_binary {
name: "clion_demo",
shared_libs: [
"libbase",
"libprocessgroup",
"libcutils",
"libutils",
"libbinder",
"liblog",
"libziparchive",
],
srcs: [
"clion_demo.cpp",
],
}
在代码里引用了Android native源码中的一些方法,目的是让生成的CMake项目中多包含一些include。
如果代码中没有引用到相关的类或方法,对应库的头文件就不会包含。下面有对比。
如果代码中,只调用一个printf,生成的CMake工程里面会包含
#pragma GCC diagnostic warning "-Wunused"
#define LOG_TAG "clion_demo"
#include
#include
#include
#include
int main(int /* argc */, char **/* argv */)
{
std::string msg = android::base::StringPrintf("Hello AOSP~");
ALOGD("The message is: %s.", msg.data());
return 0;
}
(以下编译和运行步骤不是准备CLion工程必须的,仅为验证代码编译正确)
直接在工程目录中执行编译:
$ mm
编译完成后,可执行文件生成目录:
aosp/out/target/product/hqcos/system/bin/clion_demo
push到开发板上运行测试:
adb push clien_demo /system/bin/
$ adb shell
# clion_demo
# logcat *:S clion_demo
03-11 19:54:09.307 28971 28971 D clion_demo: The message is: Hello AOSP~.
准备一个用Android.bp编译的工程。
也可以用已有工程。
使用简单的demo程序,相当于生成一个空的模板工程,可以从头开发程序。
通过环境变量,打开生成CMakeLists.txt的编译开发
$ export SOONG_GEN_CMAKEFILES=1
$ export SOONG_GEN_CMAKEFILES_DEBUG=1
$ mm
编译完成后,找到生成的CMakeLists.txt文件,保存在以下目录:
aosp_dir/out/development/ide/clion/
目录下各个工程的相对路径和aosp根目录保持一致。
例如:
源码目录为:
aosp/system/core/liblog
对应的CMakeLists.txt文件保存在:
aosp_dir/out/development/ide/clion/system/core/liblog/
在此目录下会有多个目录,对应不同的硬件平台,比如arm64、x86等。取决于bp文件中的配置。
在左侧project视图中可以看到导入的CMakeLists.txt和clion_demo.cpp文件,以及下方有大量的include头文件。
展开了一些头文件,可以看到包括C语言库,C++库(上面几个include,内容太多收缩起来)和很多Android源码中的库。
此时在编辑窗口,可以点击跳转,也可以在输入时自动提示补全。
作为对比,如果源码中引用的库比较少,生成的工程中include也相对较少。
例如,一下源码:
// clion_empty.cpp
#pragma GCC diagnostic warning "-Wunused"
#include
int main(int /* argc */, char **/* argv */)
{
printf("hello LION!");
return 0;
}
下图上,左侧是上面的clion_demo.cpp生成的工程,右侧是clion_empty.cpp生成的工程。可以看到include数量差别明显。
即使clion_empty.cpp这么简单的文件,除了C/C++的库,大部分基础的Android native和源码中的基础库也都已经包含进来了。
在开发过程中,在此基础上,增加所需的依赖库,可直接修改CMakeLists.txt文件。
CLion比vs code更好用,CLion仅支持CMake工程。
AOSP支持编译过程中自动生成CMakeLists.txt文件,导入CLion即可。默认开关是关闭的。
1)只有用Android.bp编译的项目才可以,Android.mk文件编译的项目不能用。
2)只能逐个项目导入,不支持导入整个AOSP工程。需要手动创建CMake工程,把需要的工程引入。
参考文档:aosp/build/soong/docs/clion.md