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

文章目录

    • 一、 篇头
    • 二、 操作步骤
      • 2.1 编译AOSP AS工程文件
      • 2.2 将AOSP导入Android Studio
      • 2.3 切到Project试图
      • 2.4 等待index结束
      • 2.5 下载缺失的JDK 1.8
      • 2.6 导入完成
    • 三、 导入AS的好处
      • 3.1 本文案例
          • 演示源码
          • 编译错误
          • AS对比同文件其余地方的调用
          • AS错误提示
          • 依赖AS做错误修正

一、 篇头

最近合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

  • 如下图,打开 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行处报了错误
        @Overridepublic long getSupportedProfiles() {AdapterService service = getService();if (service == null) {return 0;}//error: non-static method getResources() cannot be referenced from a static contextif (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 contextif (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)) {
//…… 略……

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/224271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PNG和JPG格式图片的区别

JPEG的文件格式一般有两种文件扩展名&#xff1a;.jpg和.jpeg&#xff0c;这两种扩展名的实质是相同的&#xff0c;我们可以把*.jpg的文件改名为*.jpeg&#xff0c;而对文件本身不会有任何影响 但是PNG&#xff08;Portable Network Graphics&#xff09;和JPEG&#xff08;Jo…

逆向经历回顾总结

逆向经历回顾总结 一、前言 将自己的逆向经验做个总结&#xff0c;希望新手对逆向大方向能快速了解。高手有啥不一样的经验也可以讨论讨论。 二、个人经历 本人入行逆向全因一部韩剧“幽灵”&#xff0c;里面涉及渗透、病毒分析、取证的攻防对抗&#xff0c;我觉得对新手来说…

图片转HTML-screenshot-to-code

Github地址 https://github.com/abi/screenshot-to-code 在线站 Screenshot to Code 简介 这是一个基于GPT4开发的一个工具站&#xff0c;它可以基于截图生成站点代码&#xff0c;生成速度快且准确。

C语言——const函数

一、定义常量&#xff1a;const关键字用于定义常量&#xff0c;这意味着该变量的值在程序运行期间不能被改变。 const int a 10; 二、修饰指针&#xff1a;const关键字可以修饰指针&#xff0c;表示指针指向的内容是常量&#xff0c;不能通过该指针修改所指向的内容。 i…

SpringBoot 究竟是如何跑起来的

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《SpringBoot》。&#x1f3af;&#x1f3af; &…

【MySQL 索引】InooDB 索引实现

1 索引定义 维基百科对数据库索引的定义: 数据库索引是数据库管理系统&#xff08;DBMS&#xff09;中的一个排序数据结构, 以协助快速查询和更新数据库表中的数据。 MongoDB对索引的定义: 索引是一种特殊的数据结构, 以有序和便于遍历的形式存储数据集合中特定字段或一组字段…

jmu-PTA Java答案汇总(上)

目录 Java练习第二章 7-21 统计符合条件元素的个数 7-210 sdut-array2-1-矩阵转置&#xff08;I&#xff09; 7-211 JAVA-输入输出入门 7-212 sdut-入门-三个整数和、积与平均值 7-213 jmu-java-m01-System.out.printf入门 7-214 jmu-java-m02-循环求和 7-215 编程题&am…

第22节: Vue3 可写计算

在UniApp中使用Vue3框架时&#xff0c;你可以使用可写计算属性来封装复杂的计算逻辑&#xff0c;并将结果保存到一个响应式引用对象中&#xff0c;以便在其他地方使用。 下面是一个示例&#xff0c;演示了如何在UniApp中使用Vue3框架使用可写计算&#xff1a; <template&g…

开源项目-

无人机跟踪移动平台并降落 基于YOLOARUCO的无人机目标检测及位置计算 ego_v2 移动物体的跟踪

Vue2面试题:说一下对vuex的理解?

五种状态&#xff1a; state: 存储公共数据 this.$store.state mutations&#xff1a;同步操作&#xff0c;改变store的数据 this.$store.commit() actions: 异步操作&#xff0c;让mutations中的方法能在异步操作中起作用 this.$store.dispatch() getters: 计算属性 th…

基于ssm服装定制系统源码和论文

idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 环境&#xff1a; jdk8 tomcat8.5 开发技术 ssm 基于ssm服装定制系统源码和论文751 1.1项目研究的背景 困扰管理层的许多问题当中,服装定制将是广大用户们不可忽视的一块。但是管理好服装定制又面临很多麻…

EasyV易知微助力智慧城市未来趋势发展——数字孪生城市

“智慧城市的未来趋势就是数字孪生”——《基于数字孪生的智慧城市》 城市数字化管理、智慧城市和数字孪生城市的发展是相互促进、逐步深化的过程。 城市数字化管理作为起点&#xff0c;奠定了信息化、数据化的基础&#xff1b;而智慧城市则将数字城市管理进一步升级&#xff…

RabbitMQ死信队列详解

什么是死信队列 由于特定的**原因导致 Queue 中的某些消息无法被消费&#xff0c;**这类消费异常的数据将会保存在死信队列中防止消息丢失&#xff0c;例如用户在商城下单成功并点击支付后&#xff0c;在指定时间未支付时的订单自动失效死信队列只不过是绑定在死信交换机上的队…

Springboot集成支付宝支付---完整详细步骤

网页操作步骤 1.进入支付宝开发平台—沙箱环境 使用开发者账号登录开放平台控制平台 2.点击沙箱进入沙箱环境 说明&#xff1a;沙箱环境支持的产品&#xff0c;可以在沙箱控制台 沙箱应用 > 产品列表 中查看。 3.进入沙箱&#xff0c;配置接口加签方式 在沙箱进行调试前…

Python (十) operator

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

第77讲:二进制方式搭建MySQL数据库5.7版本以及错误日志管理

二进制方式搭建MySQL数据库5.7版本 前面是使用的yum的方式安装的MySQL数据库,在企业生产环境中大多数都用二进制方式安装。 本次使用二进制方式搭建MySQL 5.7.36版本。 1.二进制安装MySQL5.7版本 1.1.下载MySQL5.7版本的二进制文件 [root@mysql ~]# wget https://downloads.…

理想汽车校招内推--大量hc等你来

投递链接: https://li.jobs.feishu.cn/s/i8BLJE1j 欢迎大家投递

端口复用的SPI控制

概要 SPI总线通常为三线构成时钟CLOCK、数据DATA和使能LE,实际工程中经常会遇到功能相同的多个SPI总线器件需要工作在不同的控制状态,如果每个器件依然采用独立的三线SPI,则控制位需要很多,本文给出了通过复用SPI总线简化控制的方法(需要用到额外的CSB片选位)。 通过复…

测试:Postman中Tests的用法

Postman是一款流行的API开发工具&#xff0c;它为API的测试、设计和管理提供了一个平台。 在Postman中&#xff0c;"Tests"是一种功能&#xff0c;允许用户在发送请求后对响应进行验证。 这通过编写JavaScript代码实现&#xff0c;该代码在Postman的沙盒环境中运行…

找不到vcomp100.dll,无法继续执行代码怎么解决

在计算机编程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到vcomp100.dll&#xff0c;无法继续执行代码”。这个错误通常出现在使用Visual Studio进行C开发时&#xff0c;它表示程序无法找到vcomp100.dll文件。vcomp100.dll是Visual C 2015 Redist…