AndroidStudio的编译笔记

1,310 阅读3分钟

Android Studio 进行android开发,但是编译的耗时又是很头疼的问题。所以决定拉取源代码编译一下他,研究下如何提升性能。过程很坎坷。 先贴下效果图:

WX20220311-173820@2x.png

image.png

但是我写这个的目的 不光记录下编译的过程,也想分享给需要的人,可以少走坑。所以我也从头来吧:

1.Clone代码,这个还是比较简单的

官方教程: source.android.com/source/down…

1.首先我们需要创建目录。 mac同学注意了,代码一定要存储在大小写敏感的磁盘里。 首先我们创建自己的目录:

mkdir android-studio-master 
cd android-studio-master

2.获取代码 repo init -u android.googlesource.com/platform/ma… -b 分支 我们这里编译的是2021.1.1版本 所以分支我们就填入studio-2021.1.1

repo init -u https://android.googlesource.com/platform/manifest -b studio-2021.1.1

关于版本管理可以参考Android Studio版本说明,当前的最新版本就是2021.1.1。 image.png

我们就等待他同步相关的仓库信息。

关于repo的安装 可以看官方的文档,这里我就贴出对应的命令。

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

image.png

当看到输出initialized 就表示同步成功。同步完成以后运行repo sync -j4,进行代码的拉取。时间比较久,我们就让他同步着吧。

image.png

我也是新拉取的,所以先写到这里,等代码拉取成功再更新。

2.项目介绍

image.png 当看到这个就说明代码拉取成功了,接下来就要导入项目了。 这里我就使用IntelliJ IDEA 2021.3.2版本了。 image.png

介绍下我们需要用到的目录: tools/base:这个库是Android Studio的公共库,构建系统gradle plugin和sdk组件。 包括:

  1. Instant-run
  2. SDKManager
  3. Manifest Merger
  4. 以及一些公共库、测试库 和性能分析工具profiler。

tools/base/adt/idea:这个库是IntelliJ平台的Android插件源代码,也是Android Studio最核心的部分。 包括:

  1. Android light classes
  2. Assistant
  3. Color picker
  4. Kotlin light-class
  5. Layout editor placeholder
  6. Logging
  7. Resources system等等。 我们主要导入tools/base/adt/idea。 导入后的界面:

image.png 从右上角的Configurations中下拉选中Android Studio 不过这个时候是报错的,是因为我们缺少了依赖环境。

3.依赖环境

  1. JDK: 我们不需要重新下载JDK,在我们拉取的项目中已经有了JDK。 prebuilts/studio/jdk/mac默认目录。需要在项目中导入该JDK环境。

image.png 设置JDK后,我们还需要设置插件的依赖库,也就是tools/base库的依赖。 2. 公共库依赖

image.png 缺了这么多库,不用慌张。我们直接构建一次Android Studio就会生成这些库了。 在tools/idea目录 运行build_studio.sh 脚本就会为我们构建Android Studio了。

$ cd tools/idea 
$ ./build_studio.sh

中间会出现很多问题,我们一步一步来解决。

开始:

image.png

image.png 🤣刚开始就报错了。 我们来看看错误

[java] [gant] The following modules from productProperties.productLayout.bundledPluginModules aren't found in the project: [intellij.c.clangd, intellij.c.plugin, intellij.cidr.debugger.plugin, intellij.cidr.base.plugin]

这是因为CIDR插件源码中是没有的,这些库源码中是没有的,所以我们需要注掉。具体的代码在构建Android Studio的groovy脚本中。

/Volumes/android_studio/android-studio-master/tools/idea/build/groovy/org/jetbrains/intellij/build/AndroidStudioProperties.groovy

我们注掉

image.png

image.png

搞定,我们继续。重新运行build_studio.sh 构建成功:

image.png

tools/idea/out/studio/dist/android-studio-211.7628.21.2111.__BUILD_NUMBER__.mac.zip

image.png 这就是编译出来的Android Studio了。

编译出来的Android Studio是不可以直接运行的,我们导入项目依赖:

image.png 还有报红的库,是因为我们还缺少android artifacts。需要使用bazel构建artifacts。

cd /tools/base/bazel
chmod u+x ./bazel
./bazel verion

image.png

./bazel build //tools/adt/idea/android:artifacts

image.png

🤣🤣🤣刚开始又挂了,是因为tools/vendor/google3/bazel 是内部使用的,我们没有,官方也做了处理,我们注掉就可以,不影响构建。 文件就在toplevel.WORKSPACE

image.png

修改内容如下: image.png

继续 ./bazel build //tools/adt/idea/android:artifacts

又挂了 image.png 缺少了BUILD文件 这个需要我们配置BUIlD。内容如下:


package(default_visibility = ["//visibility:public"])

java_import(
    name = "studio-sdk",
    jars = glob(["AI-211/iehshx/lib/*.jar","AI-211/iehshx/plugins/java/lib/*.jar"],
                ["AI-211/iehshx/lib/annotations-java5.jar"]),
)

java_import(
    name = "studio-sdk-plugin-Groovy",
    jars = glob(["AI-211/iehshx/plugins/Groovy/lib/*.jar"]),
)

java_import(
    name = "studio-sdk-plugin-Kotlin",
    jars = glob(["AI-211/iehshx/plugins/Kotlin/lib/*.jar"]),
)

java_import(
    name = "studio-sdk-plugin-git4idea",
    jars = glob(["AI-211/iehshx/plugins/git4idea/lib/*.jar"]),
)

java_import(
    name = "studio-sdk-plugin-webp",
    jars = glob(["AI-211/iehshx/plugins/webp/lib/*.jar"]),
)

java_import(
    name = "studio-sdk-plugin-junit",
    jars = glob(["AI-211/iehshx/plugins/junit/lib/*.jar"]),
)

java_import(
    name = "studio-sdk-plugin-properties",
    jars = glob(["AI-211/iehshx/plugins/properties/lib/*.jar"]),
)

java_import(
    name = "studio-sdk-plugin-gradle",
    jars = glob(["AI-211/iehshx/plugins/gradle/lib/*.jar"]),
)

java_import(
    name = "studio-sdk-plugin-gradle-java",
    jars = glob(["AI-211/iehshx/plugins/gradle-java/lib/*.jar"]),
)

java_import(
    name = "studio-sdk-plugin-platform-images",
    jars = glob(["AI-211/iehshx/plugins/platform-images/lib/*.jar"]),
)

java_import(
    name = "studio-sdk-plugin-IntelliLang",
    jars = glob(["AI-211/iehshx/plugins/IntelliLang/lib/*.jar"]),
)

继续... 挂

image.png

这是少配置了ndk的环境,需要配置下, 把ndk放在/Volumes/android_studio/android-studio-master/prebuilts/studio/sdk/darwin/ndk/。 默认使用的是20.1.5948944,推荐我们使用默认版本,在 /tools/base/bazl/repositories.bzl中配置ndk目录。

继续...

image.png 挂 这是因为缺少jvmti.h头文件,我们把他下载到 tools/vendor/google/android-ndk/includes目录下。

 curl https://android.googlesource.com/platform/art/+/master/openjdkjvmti/include/jvmti.h\?format\=TEXT | base64 -d >jvmti.h

image.png

创建BUILD: tools/vendor/google/android-ndk/BUILD文件 内容如下:

package(default_visibility = ["//visibility:public"])

cc_library(
    name = "jvmti",
    includes = ["includes"],
)

继续build...

image.png

挂: image.png 缺少android.jar 我们补充到prebuilts/studio/sdk:darwin/sdk 把platfroms拷贝进来,或者编辑指定目录 prebuilts/studio/sdk/BUILD

image.png

这里我就选择了拷贝进来

image.png 这样环境就齐全了。

4.运行

右上角下拉框选择AndroidStudio,点击哪个有点绿的播放按钮。开始~ image.png

成功~~~ image.png

附上已经编译好的:

链接: pan.baidu.com/s/1Na_Ws7yp…

提取码: r9yx

欢迎大家一起讨论

image.png