美文网首页Android
使用Android Studio导入Android系统源码

使用Android Studio导入Android系统源码

作者: 似焰如火 | 来源:发表于2019-12-18 13:26 被阅读0次

    以下是转载文章,出自https://blog.csdn.net/turtlejj/article/details/83857897,感谢作者

    使用Android Studio导入系统源码

            在这里我们默认大家已经下载好了Android系统的源代码,关于如何下载,网上有很多详尽的教程,我这里就不再过多的赘述,不会的同学可以自行百度。

            PS: 使用Android Studio导入系统源代码需要对代码进行一定的编译操作,如果有些同学使用的是Windows系统,可以尝试在Cygwin下进行编译,或者将在Linux下编译生成的三个产物拷贝到Windows的源代码根目录下,也可以起到一样的效果。

            进入正题,在下载好代码之后,我们需要对代码进行编译操作,对于目前比较新的Android 8.0以及9.0版本,我这里推荐使用Ubuntu 16.04的版本进行编译,编译过程中一般不会遇到什么问题 (使用Ubuntu 18.04的话,可能会遇到一些坑,我在《Ubuntu 18.04 编译安卓系统源码 及 adb连接手机遇到的问题详解》里列举了所有我遇到的问题以及解决方法,有需要的同学可以参考)。

            这里需要执行以下四条命令:

            1. "source build/envsetup.sh" (source可以用 . 代替,即". build/envsetup.sh")

            2. "lunch",并选择要编译的项目

            3. "make idegen -j4" (这里的 -j4 表示用4线程来编译,可以不加)

            4. "sudo development/tools/idegen/idegen.sh" (我的电脑需要管理员权限才能执行成功,所以我一般会在前面加上"sudo")

            下面进行分布讲解:

            1. 进入系统源码的根目录(即可以看到frameworks、kernel等等文件夹的那一级目录),执行". build/envsetup.sh"命令:

    xxxxxx@xxxxxx-Ubuntu:~/code/android$ . build/envsetup.sh

    including device/generic/mini-emulator-arm64/vendorsetup.sh

    including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh

    including device/generic/mini-emulator-x86_64/vendorsetup.sh

    including device/generic/mini-emulator-x86/vendorsetup.sh

    including device/qcom/common/vendorsetup.sh

    including vendor/qcom/proprietary/common/vendorsetup.sh

    including sdk/bash_completion/adb.bash

            2. 而后,继续执行"lunch"命令,并选择你想要编译的那个项目,这里我选了2,即编译 aosp_arm64-eng:

    xxxxxx@xxxxxx-Ubuntu:~/code/android$ lunch

    You're building on Linux

    Lunch menu... pick a combo:

        1. aosp_arm-eng

        2. aosp_arm64-eng

        3. aosp_mips-eng

        4. aosp_mips64-eng

        5. aosp_x86-eng

        6. aosp_x86_64-eng

    Which would you like? [aosp_arm-eng] 2

    ============================================

    PLATFORM_VERSION_CODENAME=REL

    PLATFORM_VERSION=8.1.0

    TARGET_PRODUCT=aosp

    TARGET_BUILD_VARIANT=arm64-eng

    TARGET_BUILD_TYPE=release

    TARGET_PLATFORM_VERSION=OPM1

    TARGET_BUILD_APPS=

    TARGET_ARCH=arm64

    TARGET_ARCH_VARIANT=armv8-a

    TARGET_CPU_VARIANT=kryo300

    TARGET_2ND_ARCH=arm

    TARGET_2ND_ARCH_VARIANT=armv7-a-neon

    TARGET_2ND_CPU_VARIANT=cortex-a9

    HOST_ARCH=x86_64

    HOST_2ND_ARCH=x86

    HOST_OS=linux

    HOST_OS_EXTRA=Linux-4.15.0-38-generic-x86_64-with-Ubuntu-18.04-bionic

    HOST_CROSS_OS=windows

    HOST_CROSS_ARCH=x86

    HOST_CROSS_2ND_ARCH=x86_64

    HOST_BUILD_TYPE=release

    BUILD_ID=OPM1.171019.026

    OUT_DIR=out

    AUX_OS_VARIANT_LIST=

    ============================================

            3. 前面两步是对编译环境进行配置,接下来执行"make idegen -j4",并等待(屏幕会输出很多log,这里只贴出最后部分):

    xxxxxx@xxxxxx-Ubuntu:~/code/android$ make idegen -j4

    ......

    [100% 765/765] Install: out/host/linux-x86/framework/idegen.jar

    #### make completed successfully (03:16 (mm:ss)) ####

            4. 看到以上输出以后,执行"sudo development/tools/idegen/idegen.sh",并继续等待,这个过程可能比较长,不要着急

    xxxxxx@xxxxxx-Ubuntu:~/code/android$ sudo development/tools/idegen/idegen.sh

    [sudo] xxxxxx 的密码:

    Read excludes: 9ms

    Traversed tree: 127108ms

            完成以上四个步骤之后,会发现在源码根目录下出现了三个新的文件(也有可能是两个)

            1. android.iml (记录项目所包含的module、依赖关系、SDK版本等等,类似一个XML文件)

            2. android.ipr (工程的具体配置,代码以及依赖的lib等信息,类似于Visual Studio的sln文件)

            3. android.iws (主要包含一些个人的配置信息,也有可能在执行上述操作后没有生成,这个没关系,在打开过一次项目之后就会自动生成了)

            "android.iml"和"android.ipr"一般是"只读"的属性,我们这里建议大家,把这两个文件改成可读可写,否则,在更改一些项目配置的时候可能会出现无法保存的情况,执行如下两条命令即可。

    sudo chmod 777 android.iml

    sudo chmod 777 android.ipr

            如果你的电脑性能足够好(内存大于16G,代码下载在SSD上),那么可以直接打开Android Studio,点击"Open an existing Android Studio project"选项,找到并选中刚刚生成的"android.ipr"文件,点击OK,就可以开始导入项目了。 第一次导入,这个过程可能会持续很久,几十分钟或者超过一个小时。不过成功之后,以后再打开项目就会快很多了。

            如果电脑性能一般的话,我建议,可以在导入项目前,手动对"android.iml"文件进行一下修改,可以使我们导入的时间尽可能的缩短一些。

            首先,要保证"android.iml"文件已经添加了"可写入"的属性(上文中已经介绍了如何修改文件属性)。

            接下来,使用文本编辑器打开"android.iml"文件,并执行以下修改(仅代表我的个人习惯,也可以根据同学们的喜好自己调整):

            1. 搜索关键字"orderEntry",我一般会将所有带有这个关键字的标签项全部删除,仅保留以下三行,大概如下

    ......

        </content>

        <orderEntry type="sourceFolder" forTests="false" />

        <orderEntry type="inheritedJdk" />

        <orderEntryProperties />

      </component>

    </module>

            2. 搜索”excludeFolder“关键字,对这里进行一些修改,将我们不需要看的代码Exclude掉。通过这个步骤,能极大地提升第一次加载项目的速度。

            等项目加载完成后,我们还可以通过Android Studio对Exclude的Module进行调整,所以也不用害怕这里Exclude掉了有用的代码,或少Exclude了一部分代码,在项目加载完以后再进行调整就行了。

            以下是我的配置,大家可以参考(由于我比较关注Framework以及Telephony相关的代码,所以重点保留了这两部分,而其他一些如kernel、bootloader的代码,我就Exclude掉了,同学们也可以根据自己的需求来进行修改)。

    <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$/developers" />

    <excludeFolder url="file://$MODULE_DIR$/developers/samples" />

    <excludeFolder url="file://$MODULE_DIR$/development" />

    <excludeFolder url="file://$MODULE_DIR$/device/google" />

    <excludeFolder url="file://$MODULE_DIR$/device/sample" />

    <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$/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$/test" />

    <excludeFolder url="file://$MODULE_DIR$/toolchain" />

    <excludeFolder url="file://$MODULE_DIR$/tools" />

            完成之后,按照上面说的步骤,使用Android Studio选中"android.ipr"打开项目即可。

    优化Android Studio的配置

            在打开系统源代码后,我们还可以对Android Studio进行一些配置,使得我们可以更好的进行代码阅读。

        1. Exclude不需要的代码目录

            点击"File -> Project Structure...",中间的窗口选择"android"(首字母小写的那一个),在弹出的窗口中左边栏中选择"Modules",而后在右边的窗口中选择"Sources"。在这里我们可以看到项目的所有代码目录,我们可以选中不需要的module,并点击上面的"Excluded"按钮,当被选中的目录变为橙色,即表示完成Exclude操作;如果想要取消对某代码目录的Exclude操作,选中该目录,再次点击"Excluded"按钮,等待目录变为蓝色即可。

        2. 选择项目的SDK版本

            点击"File -> Project Structure...",中间的窗口选择"android"(首字母小写的那一个),在弹出的窗口中左边栏中选择"Modules",而后在右边的窗口中选择"Dependencies"。在下拉菜单中选择系统源代码相应的SDK版本(如:8.0的代码就选择API 26,9.0的版本就选择API 28)。

            如果在下拉菜单中没有找到相应的SDK版本,就打开Android Studio自带的SDK Manager下载即可。

            PS: 这步非常关键,如果这里不选择Android API,而是使用JDK 1.8之类的话,无法进行系统源码的单步调试。

        3. 指定项目的minSdkVersion

            在阅读源代码的时候,经常会看到类似的这种错误"Field requires API level xx (current min is 1): android.xx.xx",这是由于我们只对项目指定了targetSdkVersion,但没有指定minSdkVersion。

            解决办法如下:

            点击"File -> Project Structure...",在弹出的窗口中左边栏中选择"Modules",中间的窗口选择"Android"(首字母大写的那一个),而后在右边的窗口中选择"Structure"。如下图所示,将这三行配置改为你自己的代码目录即可(不一定非要使用这个AndroidManifest.xml文件以及res和assets目录,你可以选择你喜欢的任意一个),完成后点击Apply或者OK。

            接下来,找到刚刚选择的那个AndroidManifest.xml,打开并在manifest标签下的任意一行添加如下代码并保存即可

    <uses-sdk android:minSdkVersion="26" />

             这里的数字根据你源代码的版本来填写,比如你导入的是8.0的源代码,就写26;9.0的源代码就写28,以此类推。由于是系统源代码,所以minSdkVersion与前面第2步中设置的Android API版本保持一致即可。

        4. 增加打开代码文件的数量以及对代码标签页显示的优化

            Android Studio默认只能打开10个代码文件,且文件打开多了以后显示不开的文件还会被隐藏,需要点击最右边的箭头才能查看。而最致命的是,如果不小心修改了某个文件,在标签页上,不会有任何的提示。

            其实,我们可以通过修改设置改变这种情况,从而使得我们更好的阅读代码。

            点击"File -> Settings...",在弹出的窗口中左边栏中选择"Editor -> General -> Editor Tabs",而后在右边的窗口中修改三个选项:

            1. 取消勾选"Show tabs in single row"    ->   使得文件可以在多行进行显示,而不会被隐藏

            2. 勾选"Mark modified tabs with asterisk"    ->    在标签栏中,对被修改但尚未保存的文件加上一个星号进行提示

            3. 将"Tab limit"后面的数字修改为你希望最多同时打开文件的数量,比如"20"

            修改后效果如下:

            以上的修改,都是我在阅读Android源代码时遇到的不便,因而总结出来的解决方法,希望能对大家有所帮助。

    ————————————————

    版权声明:本文为CSDN博主「二二的二姐夫」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/turtlejj/article/details/83857897

    相关文章

      网友评论

        本文标题:使用Android Studio导入Android系统源码

        本文链接:https://www.haomeiwen.com/subject/wxfunctx.html