用Clion开发Android AOSP native代码(完整操作步骤)

一、准备工作

先准备一个演示用的native工程,名为clion_demo。
工程所在目录:aosp/vendor/clion_demo

1. 文件目录结构

aosp/vendor/clion_demo$ tree
.
├── Android.bp
└── clion_demo.cpp

2. Android.bp文件

源码文件:clion_demo.cpp
目标可执行文件:clion_demo

cc_binary {
    
    
    name: "clion_demo",

    shared_libs: [
        "libbase",
        "libprocessgroup",
        "libcutils",
        "libutils",
        "libbinder",
        "liblog",
        "libziparchive",
    ],

    srcs: [
        "clion_demo.cpp",
    ],
}

3. native源文件:clion_demo.cpp

在代码里引用了Android native源码中的一些方法,目的是让生成的CMake项目中多包含一些include。
如果代码中没有引用到相关的类或方法,对应库的头文件就不会包含。下面有对比。
如果代码中,只调用一个printf,生成的CMake工程里面会包含

#pragma GCC diagnostic warning "-Wunused"
#define LOG_TAG "clion_demo"

#include <string>

#include <android-base/file.h>
#include <android-base/stringprintf.h>
#include <utils/Log.h>

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~.

4. 准备工作总结

准备一个用Android.bp编译的工程。
也可以用已有工程。
使用简单的demo程序,相当于生成一个空的模板工程,可以从头开发程序。

二、生成CMake工程

1. 打开编译开关

通过环境变量,打开生成CMakeLists.txt的编译开发

$ export SOONG_GEN_CMAKEFILES=1
$ export SOONG_GEN_CMAKEFILES_DEBUG=1

2. 编译工程

$ mm

3. 在CLion中导入生成的CMakeLists.txt

编译完成后,找到生成的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文件中的配置。

4. CLion中查看导入的工程

在左侧project视图中可以看到导入的CMakeLists.txt和clion_demo.cpp文件,以及下方有大量的include头文件。
展开了一些头文件,可以看到包括C语言库,C++库(上面几个include,内容太多收缩起来)和很多Android源码中的库。
此时在编辑窗口,可以点击跳转,也可以在输入时自动提示补全。
在这里插入图片描述
作为对比,如果源码中引用的库比较少,生成的工程中include也相对较少。
例如,一下源码:

// clion_empty.cpp
#pragma GCC diagnostic warning "-Wunused"
#include <stdio.h>
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文件。
在这里插入图片描述

三、总结一下

1. 操作步骤

  1. 先已有一个可以用Android.bp正常编译的工程。
  2. 打开环境变量开关。
  3. 在aosp中编译工程,生成CMakeLists.txt文件。
  4. 导入CLion中使用。

2. 动机

CLion比vs code更好用,CLion仅支持CMake工程。

3. 原理

AOSP支持编译过程中自动生成CMakeLists.txt文件,导入CLion即可。默认开关是关闭的。

4. 限制

1)只有用Android.bp编译的项目才可以,Android.mk文件编译的项目不能用。
2)只能逐个项目导入,不支持导入整个AOSP工程。需要手动创建CMake工程,把需要的工程引入。

参考文档:aosp/build/soong/docs/clion.md

猜你喜欢

转载自blog.csdn.net/yinminsumeng/article/details/129522402
今日推荐