文章目录
-
- [一、 篇头](#一、 篇头)
- [二、 操作步骤](#二、 操作步骤)
-
- [2.1 编译AOSP AS工程文件](#2.1 编译AOSP AS工程文件)
- [2.2 将AOSP导入Android Studio](#2.2 将AOSP导入Android Studio)
- [2.3 切到Project试图](#2.3 切到Project试图)
- [2.4 等待index结束](#2.4 等待index结束)
- [2.5 下载缺失的JDK 1.8](#2.5 下载缺失的JDK 1.8)
- [2.6 导入完成](#2.6 导入完成)
- [三、 导入AS的好处](#三、 导入AS的好处)
-
- [3.1 本文案例](#3.1 本文案例)
一、 篇头
最近合AOSP蓝牙相关patch,涉及apps,framework等多个部分,出现了编译不过的问题,错误看得一头雾水,想起来,可以用Android Studio导入AOSP代码来进行排查,透过AS的语法提示,补全功能,问题很容易就解决了,于是记录一下,分享给大家。
二、 操作步骤
2.1 编译AOSP AS工程文件
- 需要获得android.iml 和 android.ipr 这两个AS工程配置文件,常规编译是不会生成的
- 在编译服务器上,android源码根目录,执行如下命令
Plain
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
,在后面加入需要过滤的目录
Plain
<excludeFolder url="file://$MODULE_DIR$/art" />
<excludeFolder url="file://$MODULE_DIR$/bionic" />
<excludeFolder url="file://$MODULE_DIR$/bootable" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/compatibility" />
<excludeFolder url="file://$MODULE_DIR$/cts" />
<excludeFolder url="file://$MODULE_DIR$/dalvik" />
<excludeFolder url="file://$MODULE_DIR$/developers" />
<excludeFolder url="file://$MODULE_DIR$/development" />
<excludeFolder url="file://$MODULE_DIR$/device" />
<excludeFolder url="file://$MODULE_DIR$/external" />
<excludeFolder url="file://$MODULE_DIR$/docs" />
<excludeFolder url="file://$MODULE_DIR$/hardware" />
<excludeFolder url="file://$MODULE_DIR$/kernel" />
<excludeFolder url="file://$MODULE_DIR$/libcore" />
<excludeFolder url="file://$MODULE_DIR$/libnativehelper" />
<excludeFolder url="file://$MODULE_DIR$/longan" />
<excludeFolder url="file://$MODULE_DIR$/out" />
<excludeFolder url="file://$MODULE_DIR$/pdk" />
<excludeFolder url="file://$MODULE_DIR$/platform_testing" />
<excludeFolder url="file://$MODULE_DIR$/prebuilts" />
<excludeFolder url="file://$MODULE_DIR$/sdk" />
<excludeFolder url="file://$MODULE_DIR$/system" />
<excludeFolder url="file://$MODULE_DIR$/test" />
<excludeFolder url="file://$MODULE_DIR$/toolchain" />
<excludeFolder url="file://$MODULE_DIR$/tools" />
<excludeFolder url="file://$MODULE_DIR$/vendor" />
- 如下图所示:
2.2 将AOSP导入Android Studio
- 如下图,打开 Android Studio,选择 Open, 找到源码目录,点击 android.ipr,确定后开始导入
- 导入时间不到十分钟
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行处报了错误
Plain
@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
Plain
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对象的方式
java
//...... 略......
if (service.getApplicationContext().getResources().getBoolean(com.android.internal.R.bool.config_support_a2dp_dynamic_sink_source)) {
//...... 略......