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

简介: 本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。

一、 篇头

最近合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,在后面加入需要过滤的目录
<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

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)) {
   
   
//…… 略……

在这里插入图片描述

相关文章
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
1612 1
|
XML 搜索推荐 Android开发
Android改变进度条控件progressbar的样式(根据源码修改)
本文介绍了如何基于Android源码自定义ProgressBar样式。首先分析了系统源码中ProgressBar样式的定义,发现其依赖一张旋转图片实现动画效果。接着分两步指导开发者实现自定义:1) 模仿源码创建一个旋转动画XML文件(放置在drawable文件夹),修改图片为自定义样式;2) 在UI控件中通过`indeterminateDrawable`属性应用该动画。最终实现简单且个性化的ProgressBar效果,附带效果图展示。
784 2
|
NoSQL 应用服务中间件 PHP
布谷一对一直播源码android版环境配置流程及功能明细
部署需基于 CentOS 7.9 系统,硬盘不低于 40G,使用宝塔面板安装环境,包括 PHP 7.3(含 Redis、Fileinfo 扩展)、Nginx、MySQL 5.6、Redis 和最新 Composer。Swoole 扩展需按步骤配置。2021.08.05 后部署需将站点目录设为 public 并用 ThinkPHP 伪静态。开发环境建议 Windows 操作系统与最新 Android Studio,基础配置涉及 APP 名称修改、接口域名更换、包名调整及第三方登录分享(如 QQ、微信)的配置,同时需完成阿里云与腾讯云相关设置。
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
1124 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
Ubuntu Shell API
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
|
搜索推荐 Java 开发工具
【Framework】🤡 速通 Android AOSP基础(下)
本文并非笔者亲身实践,是借鉴了参考文献处几位大佬的文章总结得出。asop源码的下载费时,笔者没有编译扫写源码的需求,只是解BUG或了解底层机制时看看源码,SDK自带的android.jar和一些在线源码站点已经够用。环境搭建流程基本是一致的,遇到问题善用搜索引擎~
747 0
|
搜索推荐 Go 开发工具
【Framework】🤡 速通 Android AOSP基础(中)
本文并非笔者亲身实践,是借鉴了参考文献处几位大佬的文章总结得出。asop源码的下载费时,笔者没有编译扫写源码的需求,只是解BUG或了解底层机制时看看源码,SDK自带的android.jar和一些在线源码站点已经够用。环境搭建流程基本是一致的,遇到问题善用搜索引擎~
847 0
|
Ubuntu Java 开发工具
【Framework】🤡 速通 Android AOSP基础(上)
本文并非笔者亲身实践,是借鉴了参考文献处几位大佬的文章总结得出。asop源码的下载费时,笔者没有编译扫写源码的需求,只是解BUG或了解底层机制时看看源码,SDK自带的android.jar和一些在线源码站点已经够用。环境搭建流程基本是一致的,遇到问题善用搜索引擎~
1302 0
|
12月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1974 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡

热门文章

最新文章