文章目录
git指令卡住问题

每次git指令执行时会卡住很久不动,以git commit为例,
-
执行以下命令,把详细耗时情况打印出来:
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分钟。
- 查看git index文件大小
bash
ls -lh .git/index
可以看到有175M,这个就太大了,会影响git指令执行的速度
-rw-rw-r-- 1 alfnoso alfnoso 175M Dec 1 07:38 .git/index
- 查看哪些大文件被添加到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太大了导致。
有两种方法来解决:
- 使用repo管理,把git大项目拆分成若干个小项目。
- 通过精简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(无参数)会:
- 重新读取 HEAD 中的 tree
- 扫描当前工作区文件
- 仅对仍被跟踪的文件重建 index 条目
- 自动忽略 .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来分钟了,比较流畅了。
作者:帅得不敢出门 原创文章谢绝转载