精简Android SDK(AOSP)的git项目提高git指令速度

文章目录

git指令卡住问题

每次git指令执行时会卡住很久不动,以git commit为例,

  1. 执行以下命令,把详细耗时情况打印出来:

    GIT_TRACE=1 GIT_TRACE_PERFORMANCE=1 GIT_TRACE_FSMONITOR=1 git commit -m "测试commit速度"

打印如下

复制代码
08:08:51.966310 git.c:344               trace: built-in: git commit -m 'feat:下拉栏去掉4g功能'
08:08:52.257098 read-cache.c:1925       performance: 0.289791430 s: read cache .git/index
08:08:52.512676 preload-index.c:112     performance: 0.255528931 s: preload index

08:22:19.311683 read-cache.c:1483       performance: 806.798828581 s: refresh index
08:22:20.244298 read-cache.c:2422       performance: 0.835387722 s: write index, changed mask = 22
08:22:21.128609 diff-lib.c:527          performance: 0.175184627 s: diff-index
08:22:21.308975 run-command.c:646       trace: run_command: git gc --auto
08:22:21.329933 git.c:344               trace: built-in: git gc --auto
08:22:21.542611 trace.c:420             performance: 0.212816631 s: git command: /usr/lib/git-core/git gc --auto

可以看到preload index这里卡了13分钟。

  1. 查看git index文件大小
bash 复制代码
 ls -lh .git/index

可以看到有175M,这个就太大了,会影响git指令执行的速度

复制代码
-rw-rw-r-- 1 alfnoso alfnoso 175M Dec  1 07:38 .git/index
  1. 查看哪些大文件被添加到git工程中了
bash 复制代码
git ls-files -s | awk '{print $4}' | xargs du -sh 2>/dev/null | sort -hr | head -n 50
复制代码
175M	device/google/coral-kernel/unstripped/wlan.ko
97M	frameworks/base/cmds/incidentd/testdata/morethan96MB.txt
94M	kernel/build/abi/abigail-inst/e6ca11d4/lib/libabigail.a
73M	external/chromium-webview/prebuilt/x86_64/webview.apk
70M	device/google/cuttlefish_vmm/x86_64-linux-gnu/bin/crosvm
69M	device/google/cuttlefish_vmm/aarch64-linux-gnu/bin/crosvm
67M	external/chromium-webview/prebuilt/arm64/webview.apk
62M	ccu_tool/md32ccu/Md32/etc/compiler
60M	external/deqp/external/vulkancts/mustpass/master/vk-default.txt
60M	external/deqp/external/vulkancts/mustpass/master/vk-default-no-waivers.txt
60M	external/deqp/android/cts/master/vk-master.txt
59M	frameworks/base/media/tests/contents/media_api/videoeditor/H264_BP_640x480_15fps_384kbps_60_0.mp4
57M	external/swiftshader/tests/regres/testlists/vk-master.txt
49M	external/tensorflow/tensorflow/lite/testing/nnapi_tflite_zip_tests/models.tar
43M	external/chromium-webview/prebuilt/x86/webview.apk
42M	external/swiftshader/tests/regres/testlists/vk-master-NOT_SUPPORTED.txt
42M	external/deqp/android/cts/master/vk-master-2019-03-01.txt
42M	external/deqp/android/cts/master/src/vk-master-2019-03-01.txt
39M	external/kotlinc/lib/kotlin-compiler.jar
38M	frameworks/base/docs/downloads/design/Android_Design_Downloads_20120823.zip
38M	frameworks/base/docs/downloads/design/Android_Design_Downloads_20120814.zip
38M	external/chromium-webview/prebuilt/arm/webview.apk
38M	device/linaro/hikey/mali/bifrost/lib64/egl/libGLES_mali.so
37M	kernel/build/abi/abigail-inst/e6ca11d4/bin/abilint
37M	kernel/build/abi/abigail-inst/e6ca11d4/bin/abidw
37M	frameworks/base/docs/downloads/design/Android_Design_Downloads_20130814.zip
37M	device/linaro/hikey/mali/bifrost/lib/egl/libGLES_mali.so
36M	external/swiftshader/third_party/llvm-7.0/configs/common/lib/Target/X86/X86GenDisassemblerTables.inc
35M	kernel/build/abi/abigail-inst/e6ca11d4/bin/kmidiff
35M	kernel/build/abi/abigail-inst/e6ca11d4/bin/abidiff
35M	device/mediatek/build/mcs/Q0.basic_hiddenapi-stub-flags.txt
33M	kernel/build/abi/abigail-inst/e6ca11d4/bin/abipkgdiff
32M	kernel/build/abi/abigail-inst/e6ca11d4/bin/abicompat
31M	frameworks/base/tools/aapt2/integration-tests/CommandTests/android-28.jar
31M	frameworks/base/media/tests/contents/media_api/video/H264_QVGA_500_NO_AUDIO.3gp
31M	frameworks/base/media/tests/contents/media_api/video/H264_HVGA_500_NO_AUDIO.3gp
31M	frameworks/base/media/tests/contents/media_api/video/H263_500_AMRNB_12.3gp
31M	device/linaro/dragonboard-kernel/android-5.4/msm.ko
30M	cts/tests/tests/graphics/res/raw/sample_cr2.cr2
28M	kernel-4.19-lc/scripts/abi/abi_xml/abi_k79v1_64_gki_debug_defconfig.xml
28M	frameworks/base/docs/downloads/design/Android_Design_OmniGraffle_Stencil_20120814.graffle
27M	frameworks/ml/nn/runtime/test/generated/maskrcnn/maskrcnn2go_quantized_const_data.cpp
26M	cts/tests/tests/graphics/res/raw/sample_nrw.nrw
25M	device/google/cuttlefish_kernel/5.4-arm64/kernel-5.4
24M	frameworks/base/media/tests/contents/media_api/video/H264_500_AAC_128.3gp
24M	external/noto-fonts/cjk/NotoSerifCJK-Regular.ttc
24M	external/icu/icu4c/source/stubdata/icudt66l.dat
24M	external/boringssl/crypto_test_data.cc
24M	cts/tests/tests/graphics/assets/b78120086.dng
23M	external/swiftshader/third_party/llvm-7.0/configs/common/lib/Target/X86/X86GenDAGISel.inc

指令慢的原因是因为git中文件太多了,且还有许多大文件,.git/index太大了导致。

有两种方法来解决:

  1. 使用repo管理,把git大项目拆分成若干个小项目。
  2. 通过精简Android SDK源码来解决。
    本文主要使用的是第2种方法。

精简device目录

device/ 目录下通常包含多个厂商或平台的设备配置(如 google/、linaro/、amlogic/ 等)。目录结构如下:

text 复制代码
device/
├── amlogic
├── common
├── generic
├── google
├── google_car
├── linaro
├── mediatek
├── mediateksample
├── sample
└── ti

这里以mtk的android 源代码为例,

查看这几个文件夹占用的磁盘空间:

bash 复制代码
cd device
du -hsc  amlogic/ google google_car/ linaro/ ti/
text 复制代码
116M	amlogic/
1.3G	google
436K	google_car/
339M	linaro/
9.7M	ti/
1.7G	total

有1.7个G,其中googl占据主要大小。

删除device目录下这几个文件夹

bash 复制代码
rm -r  amlogic/ google google_car/ linaro/ ti/

注意,删除文件夹后,最好先全新再编译一次固件,要编译通过才能把删除的操作提交到git上。

kernel文件夹精简

在android根目录下,可能会有好几个版本的kernel文件夹

比如

复制代码
kernel/         kernel-4.14/    kernel-4.19/    kernel-4.19-lc/
bash 复制代码
du -hsc kernel*

基本每个kernel都有1个G

text 复制代码
346M	kernel
1.2G	kernel-4.14
1.1G	kernel-4.19
1.1G	kernel-4.19-lc
3.6G	total

一般只会用到其中一个到两个,把其余的都删除,建议额外保留kenel,实测删除在mtk中会报错:

复制代码
FAILED: out/soong/.bootstrap/build.ninja
out/soong/.minibootstrap/minibp -t -l out/.module_paths/Android.bp.list -b out/soong -n out -d out/soong/.bootstrap/build.ninja.d -globFile out/soong/.minibootstrap/build-globs.ninja -o out/soong/.bootstrap/build.ninja Android.bp
error: hardware/interfaces/compatibility_matrices/build/Android.bp:15:1: "vintf-compatibility-matrix-soong-rules" depends on undefined module "kernel-config-soong-rules"
ninja: build stopped: subcommand failed.
09:29:15 soong minibootstrap failed with: exit status 1

假设只用到kernel-4.19,则使用以下指令删除其它kernel文件夹

bash 复制代码
rm -r kernel-4.14 kernel-4.19-lc

修改.gitignore

添加如下内容,让git忽略掉刚刚删除的这些文件夹

复制代码
/kernel-4.14/
/kernel-4.19-lc/
/device/amlogic/
/device/google/
/device/google_car/
/device/linaro/ 
/device/ti/

删除文件后,要提交git修改

bash 复制代码
git add .
git commit -m "feat:精简Android源码"

git add .后会完会把文件夹对应的git中的cache清掉并且重建index的,实现瘦身提高git指令速度了。

缩减index大小

如果只是rm 删除了大量不再需要的文件夹(如 device/google/、kernel-4.14/ 等)之后,虽然工作区变小了,但 .git/index 文件可能仍然很大,这是因为没有通过git add .把你删除的文件告之git:

Git 的 index(暂存区)仍然保留着这些已被删除但曾经被跟踪(tracked)的文件的元数据,直到你显式告诉 Git "它们不再属于版本控制"。

可以手动重建index:

bash 复制代码
# 备份
mv .git/index .git/index.bak

# 重置暂存区(重新扫描工作区)
git reset

# 正常重建后,删除备份
rm .git/index.bak

git reset(无参数)会:

  1. 重新读取 HEAD 中的 tree
  2. 扫描当前工作区文件
  3. 仅对仍被跟踪的文件重建 index 条目
  4. 自动忽略 .gitignore 中的文件

验证 index 大小是否下降

bash 复制代码
ls -lh .git/index

变成151M了, 删除了将近4个G,才从175M变成151M。

查看还有多少文件

bash 复制代码
git ls-files | wc -l
# 输出1091861,表示文件数有上百万。

精简test、x86目录

文章开头,有用指令列出了项目中的排列前面的大文件,通过分析这些大文件的目录,我们尝试再清理些SDK空间,以下这几个文件夹要么是带test字样,看起来是测试用,要么是名字为x86的webview,有很大概率编译是用不上的:

复制代码
frameworks/base/cmds/incidentd/testdata/
external/chromium-webview/prebuilt/x86_64
frameworks/base/media/tests
external/chromium-webview/prebuilt/x86
frameworks/base/docs/downloads/design/
cts/tests
external/tensorflow

计算占用大小

bash 复制代码
du -hsc frameworks/base/cmds/incidentd/testdata/  external/chromium-webview/prebuilt/x86_64  frameworks/base/media/tests   external/tensorflow   external/chromium-webview/prebuilt/x86  frameworks/base/docs/downloads/design/  cts/tests

总共1.9G大小

复制代码
97M	frameworks/base/cmds/incidentd/testdata/
73M	external/chromium-webview/prebuilt/x86_64
369M	frameworks/base/media/tests
263M	external/tensorflow
43M	external/chromium-webview/prebuilt/x86
154M	frameworks/base/docs/downloads/design/
928M	cts/tests
1.9G	total

实测删除tensorflow会报错:

复制代码
FAILED: out/soong/.intermediates/frameworks/ml/nn/common/libneuralnetworks_common/android_arm_armv8-a_cortex-a53_static_com.android.neuralnetworks/libneuralnetworks_common.a
echo "module libneuralnetworks_common missing dependencies: tensorflow_headers (required by philox_random), tensorflow_headers, libtflite_kernel_utils" && false
module libneuralnetworks_common missing dependencies: tensorflow_headers (required by philox_random), tensorflow_headers, libtflite_kernel_utils

除了external/tensorflow ,其它几个手动删除它们:

复制代码
rm -r frameworks/base/cmds/incidentd/testdata/  external/chromium-webview/prebuilt/x86_64  frameworks/base/media/tests    external/chromium-webview/prebuilt/x86  frameworks/base/docs/downloads/design/  cts/tests

剩余步骤与文章描述的相同,全新编译固件没问题后就可以提交到git并重建index。

实测这样清理后,git commit指令就不会卡住10来分钟了,比较流畅了。

作者:帅得不敢出门 原创文章谢绝转载

相关推荐
liu****2 小时前
10.排序
c语言·开发语言·数据结构·c++·算法·排序算法
爱写Bug的小孙2 小时前
Tools、MCP 和 Function Calling
开发语言·人工智能·python·ai·ai编程·工具调用
青蛙大侠公主2 小时前
Spring事务
java·数据库·spring
小小Fred2 小时前
FreeRTOS函数prvInitialiseNewTask解析
java·开发语言
2501_937189232 小时前
神马 9.0 2025 最新版源码系统:安全加固 + 二次开发友好
android·源码·开源软件·源代码管理·机顶盒
图表制作解说(目标1000个图表)2 小时前
Java通过BACnet协议读取和写入设备信息
java·楼宇自控·bacnet协议
老华带你飞2 小时前
校务管理|基于springboot 校务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·spring
利刃大大2 小时前
【JavaSE】十一、Stack && Queue && Deque && PriorityQueue && Map && Set
java·数据结构·优先级队列··哈希表·队列·集合类
小杜的生信筆記2 小时前
基于R语言绘制网络图,新人选手上手
开发语言·r语言·生物信息学·组学