精简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来分钟了,比较流畅了。

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

相关推荐
xcl092528 分钟前
北京24小时自助健身房系统软件开发实战:从架构到部署全流程指南
java·spring boot·架构
一 乐2 小时前
动漫书销售商城|基于springboot + vue动漫书销售商城(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
卓怡学长2 小时前
w214基于jsp知道特产网
java·intellij-idea
步行cgn3 小时前
Spring 注解使用详解
java·spring
其实防守也摸鱼3 小时前
Fastjson 反序列化漏洞(JNDI注入)
android·数据库·安全·oracle·自动化·fastjson·反序列化
一条小小yu3 小时前
Spring IoC的理解
java·后端·spring
落魄实习生3 小时前
Agent Scope Java 2.x 系列【7】工具使用
java·开发语言·ai
旺仔学长 哈哈3 小时前
springboot钓鱼爱好者交流平台APP设计与实现
java·spring boot·mysql·充电桩管理系统
茉莉玫瑰花茶4 小时前
GO [ 方法 ]
开发语言·后端·golang