精简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文件大小
ls -lh .git/index

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

-rw-rw-r-- 1 alfnoso alfnoso 175M Dec  1 07:38 .git/index
  1. 查看哪些大文件被添加到git工程中了
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/ 等)。目录结构如下:

device/
├── amlogic
├── common
├── generic
├── google
├── google_car
├── linaro
├── mediatek
├── mediateksample
├── sample
└── ti

这里以mtk的android 源代码为例,
在这里插入图片描述
查看这几个文件夹占用的磁盘空间:

cd device
du -hsc  amlogic/ google google_car/ linaro/ ti/
116M	amlogic/
1.3G	google
436K	google_car/
339M	linaro/
9.7M	ti/
1.7G	total

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

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

rm -r  amlogic/ google google_car/ linaro/ ti/

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

kernel文件夹精简

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

kernel/         kernel-4.14/    kernel-4.19/    kernel-4.19-lc/
du -hsc kernel*

基本每个kernel都有1个G

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文件夹

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修改

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:

# 备份
mv .git/index .git/index.bak
# 重置暂存区(重新扫描工作区)
git reset
# 正常重建后,删除备份
rm .git/index.bak

git reset(无参数)会:

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

验证 index 大小是否下降

ls -lh .git/index

变成151M了, 删除了将近4个G,才从175M变成151M。
查看还有多少文件

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

计算占用大小

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来分钟了,比较流畅了。
作者:帅得不敢出门 原创文章谢绝转载

posted on 2026-01-09 10:19  ljbguanli  阅读(2)  评论(0)    收藏  举报