技术标签: AS导入源码步骤 android-studio android Android 知识储备
我们做Android系统源码开发,在定位问题的过程中经常要从App层跟踪代码到Framework层中,为了更加方便的查找代码,这时候就需要把整个工程源码导入到Android Studio中,导入后我们也可以通过断点调试,更加快速和准确地定位分析解决问题。
开发环境: Ubuntu 20.4 Android Studio4.1.3 Android 11(R) 源码
步骤一
1. 进入源码根目录,初始化系统环境
source build/envsetup.sh
2. 源码根目录执行如下命令 ,生成idegen.jar
mmm development/tools/idegen/
[100% 1767/1767] Install: out/host/linux-x86/framework/idegen.jar
#### build completed successfully (03:15 (mm:ss)) ####
3. 源码根目录下执行 sudo development/tools/idegen/idegen.sh
# 这个步骤一般需要等几分钟,成功后在源码根目录下会生成android.ipr和android.iml两个文件
Read excludes: 9ms
Traversed tree: 24991ms
4. 修改android.ipr和android.iml 的文件读写权限,文件默认为只读权限,修改权限后,我们修改android.iml文件,可以自定义只加载哪些模块,这样子在导入整个源码过程中,速度会快一点
# android.iml (记录项目所包含的module、依赖关系、SDK版本等等,类似一个XML文件)
# android.ipr (工程的具体配置,代码以及依赖的lib等信息,类似于Visual Studio的sln文件)
# 也是在工程源码根目录下执行如下命令
sudo chmod 777 android.iml
sudo chmod 777 android.ipr
5. 使用文本编辑器打开"android.iml"文件,搜索关键字"excludeFolder ",把不需要加载的模块添加到此处,我一般关注app层和framework层,过滤掉以下模块,配置如下:
<excludeFolder url="file://$MODULE_DIR$/.repo" />
<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$/dalvik" />
<excludeFolder url="file://$MODULE_DIR$/cts" />
<excludeFolder url="file://$MODULE_DIR$/developers" />
<excludeFolder url="file://$MODULE_DIR$/developers/samples" />
<excludeFolder url="file://$MODULE_DIR$/development" />
<excludeFolder url="file://$MODULE_DIR$/device" />
<excludeFolder url="file://$MODULE_DIR$/docs" />
<excludeFolder url="file://$MODULE_DIR$/external" />
<excludeFolder url="file://$MODULE_DIR$/flashing-files" />
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/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$/out" />
<excludeFolder url="file://$MODULE_DIR$/pdk" />
<excludeFolder url="file://$MODULE_DIR$/platform_testing" />
<excludeFolder url="file://$MODULE_DIR$/prebuilt" />
<excludeFolder url="file://$MODULE_DIR$/prebuilts" />
<excludeFolder url="file://$MODULE_DIR$/shortcut-fe" />
<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" />
好了,接下来就是用Android Studio 打开工程源码下的 android.ipr 文件,此时就开始加载代码,整个过程大概需要十几分钟。
步骤二
这个时候代码加载完成后,但是会发现当你点击应用层中某个Activity调用Framework层 AMS,WMS 中的方法时, 会跳转到 Android SDK中的AMS,WMS文件中去,而不是项目代码中framework/base/对应的AMS,WMS文件。
再者,Activity中定义的成员变量为 String, ArrayList,HashMap类型,在使用的地方(比如String.replace(), ArrayList.add(), HashMap.put()方法)你想具体看看实现源码,发现点击进去跳转到JDK中的jar中包去了,而不是项目代码的/libcore/ojluni/src/main/java/java/io 下的文件。
这个时候,我们就需要新建一个没有任何jar包的自定义的AndroidSDK,然后关联到项目工程上(目的:不用官方的JDK,用项目代码中的jar包)。
好了,接下来开始配置项目所依赖的 JDK 和 SDK
配置自定义SDK的界面,打开路径为:右键项目名->Open Module Settings
图一:
图二:
图三:
图四:
图五:
好了,到这里,等待工程源码加载完毕,就可以正确跳转并阅读源码啦!
工欲善其事,必先利其器,用断点调试定位分析问题,也会让你事半功倍,去在平时的工作
中慢慢积累吧,加油!
【备注】:有些网友说按照步骤设置不成功,存在图二删除jdk jar包不成功 图四中点击apply之后自定义SDK还是会置顶到最上面,导致不能跳转到framework源码(Android Studio Dolphin | 2021.3.1 Patch 1 for Linux 64-bit这个版本存在这个问题), 可能是AS最新版本存在bug暂时没有修复,等修复稳定后再使用吧,本文中AS的版本号为4.1.3 。
官方Android Studio下载地址:https://developer.android.google.cn/studio/archive
【备注】:优化Android Studio启动速度,编译速度以及常规设置,请移步笔者另外一篇文章:
Android Studio开发环境设置汇总_broadview_java的博客-程序员秘密_android studio开发环境配置
这个最小生成树的算法倒是比Prim算法更容易理解并且更好实现,但是在此之前需要学习并查集的算法,主要思想是对边进行排序,然后依次选取n-1条最短的边就能把n个节点连接起来。但是如果有一条边将几个节点形成了一个环,那么这条边就不能加入最小生成树如下图:此时1 2 3号节点已经连接完成,假设接下来选取最小的边是2-3的边,将其连接的话就会形成环!但是很明显此时2-3的边完全不需要连接,因为不加入2-3...
五、系统设计系统设计要在此基础上设计出系统的物理方案,他要解决系统“怎么做”的问题。系统设计系统设计的主要任务就是以系统分析中所提出的逻辑方案为基础,根据系统实现的内外环境和主、客观条件,从技术的角度去考虑系统的划分、功能、结构问题,从提高系统的运行水平、工作效率和质量方面去完成系统物理方案的设计,使企业能够从信息系统的应用中获得最大的综合经济收益。主要内容:功能结构设计(划分系统模块)、...
当用户注册后,Web服务需要提供一个身份真实性认证的过程,比如发送确认邮件等等。只有用户点击了确认的邮件,注册的账号才能被激活。我们可以将http://www.site.com/auth/conmfirm/id的激活链接方式作为邮件内容发送给注册者,其中id是数据库分配给注册用户的自增编号。但是这种方式很不安全,恶意者可以伪造id值。因此,我们需要对信息进行加密处理,将id换成携带身份信息的令牌值。
声明关于访问控制,人民已经讨论了很多的方案,但是千万不要觉得某种方案是放之四海而皆准的,没有这样的东西!RBAC根本不适宏内核协议栈的操作系统(UNIX,Linux,and so on...我可能在之前的文章把它们弄反了,...),但是这并不是每个人民中的一员都知道,包括我自己! 总之,数据包在内核协议栈的处理过程中一定要符合“快,爽”的风格...
EasyDL部署到Jetson nano
Redis基于内存存储的非关系型数据库,存储速度快,支持主从复制,支持字符串(string)、列表(list)、集合(set)、散列(hash)、有序集合(zset)五种数据类型,一、数据库安装1、使用yum安装[[email protected] ~]# yum install redis[[email protected] ~]# redis-server --versionRedis serv...
create or replace function get_ope_popedom(sta_id varchar2) return varchar2 /* * NAME: * get_ope_popedom * * PARAMETER: * sta_id - 车站编号,多个站时以逗号分隔 * * RETURN: * --对应车站编号的车站名称,多个站时以逗号分隔 * *
一、自动渲染二、方法渲染在方法table.render()内部进行渲染render()内部有一些特殊的方法: 1、elem指定原始表格元素的选择器(推荐使用id选择器); 2、height:容器高度 3、url数据接口相关参数,获取表格数据(做的事异步请求) 4、toolbar:筛选列、导入/导出、打印在默认情况下,单元格的内容是完全按照数据接口返回的content原样输出...
1、覆盖率路测覆盖率 MR覆盖率
__cdecl__stdcallC 和 C++ 程序的缺省调用规范为了使用这种调用规范,需要你明确的加上 __stdcall(或 WINAPI )文字。即 return-type __stdcallfunction-name[(argument-list)]在被调用函数 (Callee) 返回后,由调用方 (Caller) 调整堆栈。1. 调用方的函数调用2. 被调用函数的执行3. 被调用函数的结果返回4. 调用方清除调整堆栈在被调用函数 (Callee) 返回前,由被调用函数
create table students( id int(4) auto_increment primary key, name varchar(50) not null, score int(4) not null );先简单的创建一个测试用的表,将数据插入表中。insert into students(name,score) values('curry', 100)...
1、auto关键字C++新标准引入auto关键词,此auto与之前C语言的auto意义已经不一样了。这里的auto是修饰未知变量的类型,编译器会通过此变量的初始化自动推导变量的类型。例如:auto i = 0 ;编译器会通过“0”值,推导出变量i是整型。如果初始值是引用,如:[cpp] view plain copy