用Clion开发Android AOSP native代码(完整操作步骤)
创始人
2025-05-28 13:33:16

一、准备工作

先准备一个演示用的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 #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~.

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/lliblog

对应的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 
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

相关内容

热门资讯

C语言:文件的读写(fputc... 近段时间,在重新学习一下C语言程序设计,学习到了文件读写这一章节,觉得这方面的知识较复杂,于是把其中...
清华大学土木工程系包含哪些专业... 今天给各位分享清华大学土木工程系包含哪些专业的知识,其中也会对清华大学土木工程系包含哪些专业课程进行...
秦国卫鞅怎么死的(卫鞅最后有没... 今天给各位分享秦国卫鞅怎么死的的知识,其中也会对卫鞅最后有没有娶秦国公主进行解释,如果能碰巧解决你现...
美利达车架号(美利达车架号能查... 今天给各位分享美利达车架号的知识,其中也会对美利达车架号能查出什么信息进行解释,如果能碰巧解决你现在...
马杀鸡什么意思(日语马杀鸡什么... 本篇文章极速百科给大家谈谈马杀鸡什么意思,以及日语马杀鸡什么意思对应的知识点,希望对各位有所帮助,不...
一次 JVM 类加载异常 文章目录1. JVM 类加载异常1. 出现问题2. 解决过程1. JDK 7 版本过老2. JDK ...
Button(按钮)与Imag... 今天给大家介绍的Android基本控件中的两个按钮控件,Button普通按钮和ImageButton...
vue子组件无法根据prop属... 问题描述 在vue中,有一个父组件和一个子组件,在父组件里有一个变量&#...
雪佛兰SPARK是什么车?SP... 今天给各位分享雪佛兰SPARK是什么车?SPARK现在还有卖吗的知识,其中也会对2020雪佛兰spa...
全世界最贵的跑车(全世界最贵的... 今天给各位分享全世界最贵的跑车的知识,其中也会对全世界最贵的跑车是啥进行解释,如果能碰巧解决你现在面...
e哥什么意思(e哥是谁啊) e... 今天给各位分享e哥什么意思的知识,其中也会对e哥是谁啊进行解释,如果能碰巧解决你现在面临的问题,别忘...
推荐国内十大品牌润滑油(国内知... 今天给各位分享推荐国内十大品牌润滑油的知识,其中也会对国内知名品牌润滑油进行解释,如果能碰巧解决你现...
前端性能优化之HTTP缓存 前端缓存 前端缓存可分为两大类:HTTP 缓存和浏览器缓存。 我们今天重点是 HTTP...
Linux 端口号占用如何处理 在Linux中,可以使用以下命令来查看端口号的占用情况: sudo ne...
再探pytorch的Datas... 本文从分类、检测、分割三大任务的角度来剖析pytorch得dataset和dataloader源码&...
电影最爱剧情详细介绍,最爱电影... 电影最爱剧情详细介绍目录电影最爱剧情详细介绍最爱电影剧情最爱这部电影讲述的是啥情节电影最爱剧情详细介...
公斤力什么单位(公斤力等于多少... 今天给各位分享公斤力什么单位的知识,其中也会对公斤力等于多少公斤进行解释,如果能碰巧解决你现在面临的...
汽车压缩比是什么意思(汽车压缩... 今天给各位分享汽车压缩比是什么意思的知识,其中也会对汽车压缩比的定义进行解释,如果能碰巧解决你现在面...
小巧实惠又时尚7款市场在售微型... 本篇文章极速百科给大家谈谈小巧实惠又时尚7款市场在售微型电动车,以及微型电动车推荐对应的知识点,希望...
cdn服务器搭建步骤 CDN服务器是现代网络中不可或缺的一部分,其可以大大提高网站的访问速度和用户体验。许多...
Go项目(分布式事务) 文章目录简介分布式事务CAPBASE常见方案 简介 目前,项目的主要代码已经开发完毕&...
leetcode每日一题:45... 系列:贪心算法 语言:java 题目来源:Leetcode...
差速器工作原理是什么(差速器工... 本篇文章极速百科给大家谈谈差速器工作原理是什么,以及差速器工作原理是什么意思对应的知识点,希望对各位...
幸福花园纤细的爱故事内容是什么... 幸福花园纤细的爱故事内容是什么 目录幸福花园纤细的爱故事内容是什么 幸福花园有几部求幸福花园的第二个...
hisuite是什么 ,HiS... hisuite是什么 目录hisuite是什么 HiSuite什么意思?honest是什么意思“hi...
烈火战车刘德华骑的摩托是什么车... 本篇文章极速百科给大家谈谈烈火战车刘德华骑的摩托是什么车是P3还是P4,以及烈火战车中刘德华骑的是什...
Linux命令·diff diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是...
2021蓝桥杯真题公约数(填空... 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果...
智能马桶杀菌以及光传感方案 智能马桶杀菌模组,安装在马桶改版底部,实现座垫区域消毒、池内消毒、臀洗喷...
腿玩年是什么意思 ,腿玩年是什... 腿玩年是什么意思 目录腿玩年是什么意思 腿玩年是什么意思玩年腿什么意思啊?腿可玩年是什么意思腿玩年是...