使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题

admin
2025-10-15 07:43:29

一、 篇头

最近合AOSP蓝牙相关patch,涉及apps,framework等多个部分,出现了编译不过的问题,错误看得一头雾水,想起来,可以用Android Studio导入AOSP代码来进行排查,透过AS的语法提示,补全功能,问题很容易就解决了,于是记录一下,分享给大家。

二、 操作步骤

2.1 编译AOSP AS工程文件

需要获得android.iml 和 android.ipr 这两个AS工程配置文件,常规编译是不会生成的

在编译服务器上,android源码根目录,执行如下命令

szhou@bc01-R630:~/works/aw/android$ source build/envsetup.sh

szhou@bc01-R630:~/works/aw/android$ lunch

szhou@bc01-R630:~/works/aw/android$ mmm development/tools/idegen/

szhou@bc01-R630:~/works/aw/android$ ./development/tools/idegen/idegen.sh

执行结束后,会在根目录下生成android.iml 和 android.ipr 这两个AS工程配置文件,此时已可以直接导入,但会导入几乎所有源码模块,非常慢,必须有目的的打开,过滤掉一些不用的模块和目录。

如下,除了 frameworks 模块和 packages 模块,其他都给过滤掉

打开 android.iml 文件,搜下excludeFolder,在后面加入需要过滤的目录

如下图所示:

2.2 将AOSP导入Android Studio

2.3 切到Project试图

如下可见,左侧Project窗口内有两个目录是白色的,此正为此次实验没有排除的源码目录;其余黄色为已排除的目录

frameworks和packages目录

2.4 等待index结束

大约10分钟

2.5 下载缺失的JDK 1.8

选择Amazon的verison 1.8版本

2.6 导入完成

三、 导入AS的好处

3.1 本文案例

patch 后出现编译错误,直接读源码,看不出如何修改,导入AS之后,即可看到解法

演示源码

如下源码 getResources() 在同文件里,至少被使用6次,偏偏此1510行处报了错误

@Override

public long getSupportedProfiles() {

AdapterService service = getService();

if (service == null) {

return 0;

}

//error: non-static method getResources() cannot be referenced from a static context

if (getResources().getBoolean(com.android.internal.R.bool.config_support_a2dp_dynamic_sink_source)) {

long mask = Config.getSupportedProfilesBitMask();

if (SystemProperties.getBoolean("persist.bluetooth.a2dp.sink", false)) {

mask = mask & (~BluetoothProfile.A2DP);

} else {

mask = mask & (~BluetoothProfile.A2DP_SINK);

}

return mask;

} else {

return Config.getSupportedProfilesBitMask();

}

}

编译错误

注意:AdapterService.java:1510

packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterService.java:1510: error: non-static method getResources() cannot be referenced from a static context

if (getResources().getBoolean(com.android.internal.R.bool.config_support_a2dp_dynamic_sink_source)) {

^

1 error

18:07:24 ninja failed with: exit status 1

#### failed to build some targets (22 seconds) ####

szhou@bc01-R630:~/works/aw/android$

AS对比同文件其余地方的调用

getResources()在相同源码文件中,有7处类似调用,其余地方均未报错

getResources().getBoolean()在相同源码文件中,有3处类似调用

大致只到解法要给它弄个对象,但如果不实用AS提示,还真不会写……

AS错误提示

导入AS后,1510行确实看到错误

error: non-static method getResources() cannot be referenced from a static context

依赖AS做错误修正

使用AS的代码补全、方法提示功能,很快可以通过获得content对象的方式

//…… 略……

if (service.getApplicationContext().getResources().getBoolean(com.android.internal.R.bool.config_support_a2dp_dynamic_sink_source)) {

//…… 略……