Android系统 —— 源码编译错误整理(持续更新)

Android Studio编译错误:Error while generating the main dex list,系统学Android从零开始 这里我希望可以帮助到大家提升进阶。Android学习PDF+架构视频+面试文档+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。喜欢本文的话,不妨给我点个小赞、评论区留言或者转发支持一下呗~《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!源码讲义》点击传送门即可获取!** 阅读详情
AI摘要

本文详细列举了在Android编译过程中遇到的各种问题及其解决方案,包括源码目录名更改导致的错误、VNDK库添加报错、头文件重复包含、链接库文件丢失、Soong进程唯一性检查、TEMPORARY_DISABLE_PATH_RESTRICTIONS问题、tmp空间不足、flex词汇分析器错误、Jackserver连接失败和缺少libssl-dev。每个问题都分析了原因并给出了具体的解决方法。

记录一些日常遇到的编译问题及解决方法,查找的时候可以直接搜索问题描述的关键部分。

1. 更改源码目录名引发的错误

FAILED: out/target/product/gin/abl.elf
/bin/bash -c "\$(pwd)/prebuilts/build-tools/linux-x86/bin/make -C bootable/bootloader/edk2 BOOTLOADER_OUT=../../../out/target/product/gin/obj/ABL_OBJ all PREBUILT_HOST_TOOLS=CC=/home/sun/project/Android10_Project/prebuilts/clang/host/linux-x86/clang-r353983c1/bin/clang\\ CXX=/home/sun/project/Android10_Project/prebuilts/clang/host/linux-x86/clang-r353983c1/bin/clang++\\ LDPATH=\"-fuse-ld=/home/sun/project/Android10_Project/prebuilts/clang/host/linux-x86/clang-r353983c1/bin/ld.lld\"\\ AR=/home/sun/project/Android10_Project/prebuilts/clang/host/linux-x86/clang-r353983c1/bin/llvm-ar PREBUILT_PYTHON_PATH=\$(pwd)/prebuilts/python/linux-x86/2.7.5/bin/python2 MAKEPATH=\$(pwd)/prebuilts/build-tools/linux-x86/bin/ BUILD_SYSTEM_ROOT_IMAGE=0 VERIFIED_BOOT=0 VERIFIED_BOOT_2=1 VERIFIED_BOOT_LE=0 USER_BUILD_VARIANT=0 DISABLE_PARALLEL_DOWNLOAD_FLASH=0 AB_RETRYCOUNT_DISABLE=0 DYNAMIC_PARTITION_SUPPORT=1 TARGET_SUPPORTS_EARLY_USB_INIT=0 CLANG_BIN=/home/sun/project/Android10_Project/vendor/qcom/proprietary/llvm-arm-toolchain-ship/8.0/bin/ CLANG_PREFIX=/home/sun/project/Android10_Project/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android- ABL_USE_SDLLVM=true ABL_SAFESTACK=true SAFESTACK_SUPPORTED_CLANG_VERSION=6.0 CLANG_GCC_TOOLCHAIN=/home/sun/project/Android10_Project/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9 TARGET_ARCHITECTURE=AARCH64 BOARD_BOOTLOADER_PRODUCT_NAME=gin USERDATAIMAGE_FILE_SYSTEM_TYPE=f2fs"

make: Entering directory '/home/sun/project/Android10_Project/bootable/bootloader/edk2' Loading previous configuration from /home/sun/project/Android10_Project/bootable/bootloader/edk2/Conf/BuildEnv.sh
WORKSPACE: /home/sun/project/Android10_Project/bootable/bootloader/edk2
EDK_TOOLS_PATH: /home/sun/Project/Android10_Project/bootable/bootloader/edk2/BaseTools

CONF_PATH: /home/sun/project/Android10_Project/bootable/bootloader/edk2/Conf
make[1]: Entering directory '/home/sun/project/Android10_Project/bootable/bootloader/edk2/BaseTools'
/home/sun/project/Android10_Project/prebuilts/build-tools/linux-x86/bin/make -C Source/C
make[2]: Entering directory '/home/sun/project/Android10_Project/bootable/bootloader/edk2/BaseTools/Source/C'
Attempting to detect ARCH from 'uname -m': x86_64
Detected ARCH of X64 using uname.
mkdir -p .
/home/sun/project/Android10_Project/prebuilts/build-tools/linux-x86/bin/make -C Common make[3]: Entering directory '/home/sun/project/Android10_Project/bootable/bootloader/edk2/BaseTools/Source/C/Common'
make[3]: *** No rule to make target '/home/sun/Project/Android10_Project/prebuilts/clang/host/linux-x86/clang-r353983c1/lib64/clang/9.0.3/include/stdint.h', needed by 'BasePeCoff.o'. Stop.

make[3]: Leaving directory '/home/sun/project/Android10_Project/bootable/bootloader/edk2/BaseTools/Source/C/Common'
make[2]: *** [GNUmakefile:79: Common] Error 2
make[2]: Leaving directory '/home/sun/project/Android10_Project/bootable/bootloader/edk2/BaseTools/Source/C'
make[1]: *** [GNUmakefile:25: Source/C] Error 2
make[1]: Leaving directory '/home/sun/project/Android10_Project/bootable/bootloader/edk2/BaseTools'
make: *** [makefile:138: EDK_TOOLS_BIN] Error 2
make: Leaving directory '/home/sun/project/Android10_Project/bootable/bootloader/edk2'
17:08:52 Disallowed PATH tool "pkg-config" used: []string{"pkg-config", "--cflags", "ncursesw"}
17:08:52 See https://android.googlesource.com/platform/build/+/master/Changes.md#PATH_Tools for more information.

错误一: “EDK_TOOLS_PATH: /home/sun/Project/Android10_Project/bootable/bootloader/edk2/BaseTools”

(1) 问题描述:
同步代码的时候我建的文件夹确实叫做"Project",但是后来我把"P"改成小写的"p",而在编译的时候edk2的路径EDK_TOOLS_PATH并不会重新生成,所以路径无效最终导致编译失败。

(2) 解决办法:
进入EDK_TOOLS_PATH的上一级目录,即/home/sun/project/Android10_Project/bootable/bootloader/edk2,然后执行下面命令重新生成edk2的路径

rm -rf Conf/BuildEnv.sh   #EDK_TOOLS_PATH就在这个文件中
unset EDK_TOOLS_PATH
./edksetup.sh BaseTools

错误二: “make[3]: *** No rule to make target ‘/home/sun/Project/Android10_Project/prebuilts/clang/host/linux-x86/clang-r353983c1/lib64/clang/9.0.3/include/stdint.h’, needed by ‘BasePeCoff.o’. Stop.”

(1) 问题描述:
这个其实和上面的错误一个道理,都是旧目录名称没有更新(旧目录叫“Project”,新目录叫“project”)

(2) 解决办法:
上个错误已解决的基础上,在EDK_TOOLS_PATH目录,执行make clean即可。

使用git clean -df和git checkout .重置仓库再编译也会报这个错误,原因是 edk2/Conf 包含.gitignore,这个文件中忽略了Conf目录的新增文件,所以使用git是无法重置的。
在这里插入图片描述


2. 添加VNDK库(Vendor Native Development Kit)报错

[ 5% 634/10974] build out/target/product/trinket/obj/PACKAGING/vndk_intermediates/check-list-timestamp
FAILED: out/target/product/trinket/obj/PACKAGING/vndk_intermediates/check-list-timestamp /bin/bash -c "(( diff --old-line-format=\"Removed %L\" --new-line-format=\"Added %L\" --unchanged-line-format=\"\" build/make/target/product/gsi/29.txt out/target/product/trinket/obj/PACKAGING/vndk_intermediates/libs.txt || ( echo -e \" error: VNDK library list has been changed.\\n\" \" Changing the VNDK library list is not allowed in API locked branches.\"; exit 1 )) ) && (mkdir -p out/target/product/trinket/obj/PACKAGING/vndk_intermediates/ ) && (touch out/target/product/trinket/obj/PACKAGING/vndk_intermediates/check-list-timestamp )"
Added VNDK-core: libturbo_jpeg.so
error: VNDK library list has been changed.
Changing the VNDK library list is not allowed in API locked branches.

问题描述: 看报错内容,可以知道是用diff命令对29.txt和libs.txt的内容进行了逐行比较,因两个文件内容不一致而导致的问题。至于为什么不一样,那是因为由于项目原因,需要添加一个名为libturbo_jpeg的VNDK动态库,在编译的时候新库名字被写到了libs.txt,而29.txt还是原先内容
动态库的创建是在external/libjpeg-turbo/Android.bp中,如下

cc_library {
    name: "libturbo_jpeg",
    host_supported: true,
    vendor_available: true,  //VNDK库需要设置为true
    vndk: {
        enabled: true,      //VNDK库需要设置为true
    },
    defaults: ["libjpeg-defaults"],
    export_include_dirs: ["."],
    target: {
        windows: {
            enabled: true,
        },
    },
    srcs: [
        "jdatadst-tj.c",
        "jdatasrc-tj.c",
		"turbojpeg.c",
		"transupp.c",
		"rdbmp.c",
		"rdppm.c",
		"wrbmp.c",
        "wrppm.c",
            ],
    cflags: [
        "-DBMP_SUPPORTED",
        "-DPPM_SUPPORTED",
        "-Werror",
        "-Wno-unused-parameter",
    ],
}

解决方法:
将libs.txt的内容直接全部拷贝到29.txt中即可


3. 头文件被重复包含

FAILED:
build/make/core/main.mk:1158: warning: "zxh : _modules_xxx_cut" =
build/make/core/Makefile:76: warning: Duplicate header copy: out/target/product/myproject/obj/include/mycarcam/mycarcam.h
build/make/core/Makefile:76: warning: _ Using vendor/qcom/proprietary/mm-camera/ais/API/inc/mycarcam.h
build/make/core/Makefile:76: warning: __ from vendor/qcom/proprietary/mm-camera/ais/libais_client.mk
build/make/core/Makefile:76: warning: _ Ignoring vendor/qcom/proprietary/mm-camera/ais/API/inc/mycarcam.h
build/make/core/Makefile:76: warning: __ from vendor/qcom/proprietary/mm-camera/ais/libais_client.mk
build/make/core/Makefile:76: warning: Duplicate header copy: out/target/product/myproject/obj/include/mycarcam/mycarcam_types.h
build/make/core/Makefile:76: warning: _ Using vendor/qcom/proprietary/mm-camera/ais/API/inc/mycarcam_types.h
build/make/core/Makefile:76: warning: __ from vendor/qcom/proprietary/mm-camera/ais/libais_client.mk
build/make/core/Makefile:76: warning: _ Ignoring vendor/qcom/proprietary/mm-camera/ais/API/inc/mycarcam_types.h
build/make/core/Makefile:76: warning: __ from vendor/qcom/proprietary/mm-camera/ais/libais_client.mk
build/make/core/Makefile:95: error: duplicate header copies are no longer allowed. For more information about headers, see: https://android.googlesource.com/platform/build/soong/+/master/docs/best_practices.md#headers.

问题描述: 看error那行,意思是不再允许拷贝重复的头文件,然后我们再看上面的warning,发现编译过程中mycarcam.h和mycarcam_types.h被重复拷贝了,这是不被允许的(不过我试过只重复一个文件就没问题,费解。。。)

解决方法: 经过排查是mk文件中,这两个头文件被重复拷贝了,可根据项目实际情况进行添加条件避免重复拷贝


4. 无法链接库文件,库文件丢失

[ 99% 365/366] finishing build rules ...
FAILED:
vendor/qcom/proprietary/pis/test/test_util/Android.mk: error: "libpis_test_util (native:platform) can not link against libimg (native:vendor)"
vendor/qcom/proprietary/pis/test/test_util/Android.mk: error: "libpis_test_util (SHARED_LIBRARIES android-arm64) missing libjpeg (SHARED_LIBRARIES android-arm64)"
You can set ALLOW_MISSING_DEPENDENCIES=true in your environment if this is intentional, but that may defer real problems until later in the build.
...
build/make/core/main.mk:959: error: exiting from previous errors.
14:45:48 ckati failed with: exit status 1

#### failed to build some targets (02:46 (mm:ss)) ####

错误一: “libpis_test_util (native:platform) can not link against libimg (native:vendor)”
(1) 错误分析:
  这个error表达的是库libpis_test_util(native:platform)不能链接库libimg (native:vendor)。看下面两个Android.mk文件,libpis_test_util(native:platform)用链接系统库的方式链接了vendor库,这个肯定是不行。

libpis_test_util的Android.mk:

...//省略
LOCAL_MODULE := libpis_test_util
LOCAL_HEADER_LIBRARIES := libtest_headers
LOCAL_SHARED_LIBRARIES += libtest libimg libjpeg      //LOCAL_SHARED_LIBRARIES这个flag是用来链接系统库的
...//省略

libimg的Android.mk:

...//省略
include $(CLEAR_VARS)
LOCAL_MODULE        := libimg
LOCAL_MODULE_CLASS  := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
LOCAL_STRIP_MODULE  := false
LOCAL_MULTILIB      := 64
LOCAL_MODULE_OWNER  := qcom
LOCAL_MODULE_TAGS   := optional
LOCAL_SRC_FILES     := ../../.././target/product/xxx/system/lib64/libimg.so
LOCAL_MODULE_PATH   := $(PRODUCT_OUT)/system/lib64
LOCAL_PROPRIETARY_MODULE := true     //这里可以看到libimg库是属于proprietary的,也就是vendor的模块
include $(BUILD_PREBUILT)
...//省略

(2) 解决方法:
 把libimg的Android.mk中的LOCAL_PROPRIETARY_MODULE置为false,或者把libpis_test_util的Android.mk中的LOCAL_SHARED_LIBRARIES改为LOCAL_LDFLAGS(就是把链接方式由链接系统库改为链接第三方库)

错误二: “libpis_test_util (SHARED_LIBRARIES android-arm64) missing libjpeg (SHARED_LIBRARIES android-arm64)”
(1) 错误分析:
  这个error表达的是编译系统没有找到libjpeg库,通过查看是没有为libjpeg库添加编译规则

(2) 解决方法:
  在对应的Android.mk中加入编译规则,对应内容如下所示:

include $(CLEAR_VARS)
LOCAL_MODULE        := libjpeg
LOCAL_MODULE_CLASS  := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
LOCAL_STRIP_MODULE  := false
LOCAL_MULTILIB      := 64
LOCAL_MODULE_OWNER  := qcom
LOCAL_MODULE_TAGS   := optional
LOCAL_SRC_FILES     := ../../.././target/product/xxx/system/lib64/libjpeg.so
LOCAL_MODULE_PATH   := $(PRODUCT_OUT)/system/lib
include $(BUILD_PREBUILT)

5. 检查Soong进程唯一性报错

刚开始编译就报了下面的错误:

13:46:41 Waiting up to 10s to lock out/.lock to ensure no other Soong process is running in the same output directory
13:46:51 Tried to lock out/.lock, but timed out polling every 1s until 10s . Make sure no other Soong process is using it

(1) 问题分析:
Android 7以后在编译系统方面,谷歌使用了Soong+Blueprint+Android.bp替代Makefile+Android.mk的方案(并未完全替代)。
在真正开始编译源码之前,会检查Soong进程是否唯一,核心代码如下:

//路径:build/soong/ui/build/proc_sync.go
func lockSynchronous(lock lockable, waiter waiter, logger logger.Logger) (err error) {
	waited := false
	for {
	  //[part 1]:使用tryLock()上锁,如果成功代表soong进程只有一个,则return nil,退出for循环
		err = lock.tryLock()  //成功返回空(nil)
		if err == nil {
			if waited {
				// If we had to wait at all, then when the wait is done, we inform the user
				logger.Printf("Acquired lock on %v; previous Soong process must have completed. Continuing...\n", lock.description())
			}
			return nil
		}
		
		//[part 2]:如果上边上锁失败,则会执行下面的代码。
		done, description := waiter.checkDeadline()  //waiter先检查是否超时,超时done置为true
		if !waited {
			logger.Printf("Waiting up to %s to lock %v to ensure no other Soong process is running in the same output directory\n", description, lock.description())
		}
		waited = true
		if done {        //如果done为true,则return错误信息,退出for循环
			return fmt.Errorf("Tried to lock %s, but timed out %s . Make sure no other Soong process is using it",
				lock.description(), waiter.summarize())
		} else {
			waiter.wait()   //如果done不为true,则继续等待,进入下一次循环
		}
	}
}

(2) 解决方法:
保证不要对同一套代码同时编译多次,比如下面这个错误的编译指令就会造成同时编译两次。使用管道符连接make update-api和make -j8,众所周知,管道符两侧的命令是并行执行的,所以这样相当于同时执行两次make,而锁的机制大家也都知道,不能在锁没有释放的情况下再次上锁,所以后执行的make会报错退出。

错误的编译命令:

make update-api | make -j8 | tee build-android.log

正确编译命令:

make update-api && make -j8 | tee build-android.log

※ 上面的错误例子只是抛砖引玉,只要记住同一套代码,在编译还没完成的情况下,禁止再开个终端进行编译该套代码。


6. TEMPORARY_DISABLE_PATH_RESTRICTIONS问题

TEMPORARY_DISABLE_PATH_RESTRICTIONS was a temporary migration method, and is now obsolete

(1) 问题分析:
上面的问题翻译过来是:临时禁用路径限制是一种临时迁移方法,现已过时。报错脚本源码如下:
在这里插入图片描述在终端用echo命令打印TEMPORARY_DISABLE_PATH_RESTRICTIONS的值,发现确实为true。

(2) 解决方法:
方法一: 不知道是什么原因导致TEMPORARY_DISABLE_PATH_RESTRICTIONS被设置为了true,导致编译到这里报错。在终端执行下面的语句临时将TEMPORARY_DISABLE_PATH_RESTRICTIONS设置为false即可。

export TEMPORARY_DISABLE_PATH_RESTRICTIONS=false

方法二: 新打开一个终端,重新执行source build/envsetup.sh和lunch <设备平台>后,再次执行make命令即可。


7. 高通平台在打包阶段报/tmp空间不足

2022-08-09 13:27:22 - build_image_standalone.py - INFO    : Script Version : 1.2
2022-08-09 13:27:22 - build_image_standalone.py - INFO    : Starting up builds merge..
2022-08-09 13:27:22 - build_image_standalone.py - INFO    : QSSI build path = /home/sun/sata/home/sun/project/AOSP/QSSI
2022-08-09 13:27:22 - build_image_standalone.py - INFO    : Target build path = /home/sun/sata/home/sun/project/AOSP/VENDOR
2022-08-09 13:27:22 - build_image_standalone.py - INFO    : Merged build path = /home/sun/sata/home/sun/project/AOSP/VENDOR
2022-08-09 13:27:22 - build_image_standalone.py - INFO    : Free Space available on /tmp = 15.3445320129G
2022-08-09 13:27:22 - build_image_standalone.py - ERROR   : Not enough free space available on /tmp, aborting, min free space required = 24G !!
2022-08-09 13:27:22 - build_image_standalone.py - ERROR   : Free up /tmp manually, and/or Increase it using: sudo mount -o remount,size=24G tmpfs /tmp
2022-08-09 13:27:22 - build_image_standalone.py - ERROR   : Or Alternatively, Use --no_tmp option while triggering build_image_standalone, to not use /tmp if it is a low RAM machine

(1) 问题分析:
上面的build_image_standalone.py正常会调用vendor下的build.sh脚本中的打包功能。这期间检查用于存放临时文件的/tmp目录,发现只剩下16G左右,少于最低24G空间。

sun@sun-pc:~$ df -h
文件系统        容量  已用  可用 已用% 挂载点
udev             16G     0   16G    0% /dev
tmpfs           3.2G  4.1M  3.2G    1% /run
/dev/nvme1n1p3   47G   29G   16G   66% /      #分区的时候只分了47G给根目录,剩下的空间仅有16G,所以/tmp最大只能申请到16G
...

(2) 解决方法:
上面报错的地方已经提供了两个解决方法,下面说明一下
● 方法一(不建议)
如果内存空间够大,可以将tmpfs挂载到/tmp上。

sudo mount -t tmpfs -o size=24G tmpfs /tmp

注:tmpfs是一种基于内存的文件系统,android系统打包期间产生的临时文件还是比较大的,这样会占用内存,导致ubuntu系统卡顿。这里倒是可以在磁盘剩余空间上再做一个分区出来,挂载到/tmp上使用。

● 方法二
直接在调用build_image_standalone.py的时候添加–no_tmp选项即可,这样产生的临时文件都会被放到项目根目录下的tmp目录中,打包完成后此tmp目录会被清理。

function packagesupper()
{
  cd ${ROOT_DIR}/../..
  python VENDOR/vendor/qcom/opensource/core-utils/build/build_image_standalone.py \
 --image super \
 --qssi_build_path QSSI \
 --target_build_path VENDOR \
 --merged_build_path VENDOR \
 --target_lunch xxx \
 --output_ota \
 --skip_qiifa \
 --no_tmp   #添加--no_tmp选项
  return 0
}

8. flex词汇分析器与本地化字符集不匹配导致编译出错

[ 32% 1301/3980] Lex: aidl <= system/tools/aidl/aidl_language_l.ll
FAILED: /bin/bash -c "prebuilts/misc/linux-x86/flex/flex-2.5.39 -oout/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_l.cpp system/tools/aidl/aidl_language_l.ll"
flex-2.5.39: loadlocale.c:130:_nl_intern_locale_data: ?? 'cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' ???
Aborted (core dumped)
ninja: build stopped: subcommand failed.
build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed
make: *** [ninja_wrapper] Error 1

(1) 问题分析:
● bash执行命令:

prebuilts/misc/linux-x86/flex/flex-2.5.39 -o out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_l.cpp system/tools/aidl/aidl_language_l.ll

flex-2.5.39是个词汇分析器,上述命令成功后,会将aidl_language_l.ll翻译为aidl_language_l.cpp。

● 提示语句:

flex-2.5.39: loadlocale.c:130:_nl_intern_locale_data: ?? ‘cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))’ ???

可以看到flex-2.5.39在加载locale.c的时候,locale.c中有语句乱码,这个其实就是当前系统的字符集不能对这条语句正确解码。(locale.c我也没找到在哪里,有知道的同学可以告诉我一下谢谢。)

(2) 解决方法:
既然是字符集的问题,直接使用下面命令去除本地化配置,再次编译即可。

export LC_ALL=C  或者  export LC_ALL=POSIX

有关本地化配置的知识后续有时间会进行整理。


9. 连接jack server失败导致编译停止

FAILED: /bin/bash -c "(prebuilts/sdk/tools/jack-admin stop-server 2>&1 || (exit 0) ) && (prebuilts/sdk/tools/jack-admin kill-server 2>&1 || (exit 0) ) && (prebuilts/sdk/tools/jack-admin uninstall-server 2>&1 || (exit 0) ) && (prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar  2>&1 || (exit 0) ) && (mkdir -p \"out/dist/logs/jack/\" ) && (JACK_SERVER_VM_ARGUMENTS=\"-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Dcom.android.jack.server.log.file=/home/sun/code/8953_7120/out/dist/logs/jack/jack-server-%u-%g.log\" prebuilts/sdk/tools/jack-admin start-server 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update server prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar 4.8.ALPHA 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-2.28.RELEASE.jar 2.28.RELEASE || exit 47; prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-3.36.CANDIDATE.jar 3.36.CANDIDATE || exit 47; prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-4.7.BETA.jar 4.7.BETA || exit 47 )"
Writing client settings in /home/sun/.jack-settings
Stopping background server
No Jack server running. Try 'jack-admin start-server'
Killing background server
No Jack server to kill
Jack server in "/home/sun/.jack-server" not found
Installing jack server in "/home/sun/.jack-server"

Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore /home/sun/.jack-server/server.jks -destkeystore /home/sun/.jack-server/server.jks -deststoretype pkcs12".

Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore /home/sun/.jack-server/client.jks -destkeystore /home/sun/.jack-server/client.jks -deststoretype pkcs12".
Launching Jack server java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=/tmp -Dfile.encoding=UTF-8 -XX:+TieredCompilation -Dcom.android.jack.server.log.file=/home/sun/code/8953_7120/out/dist/logs/jack/jack-server-%u-%g.log -Xmx4096m -cp /home/sun/.jack-server/launcher.jar com.android.jack.launcher.ServerLauncher
Jack server failed to (re)start, try 'jack-diagnose' or see Jack server log
SSL error when connecting to the Jack server. Try 'jack-diagnose'
SSL error when connecting to the Jack server. Try 'jack-diagnose' 

(1) 问题分析:
这里报错信息特别多而且乱,为了简化分析,将bash命令拆成下面这些命令,然后分别执行看一下结果:

● 停止 jack server进程

sun@sun-pc:~/code$ prebuilts/sdk/tools/jack-admin stop-server
Stopping background server
SSL error when connecting to the Jack server. Try 'jack-diagnose'

● kill掉 jack server进程

sun@sun-pc:~/code$ prebuilts/sdk/tools/jack-admin kill-server
Killing background server

● 卸载并重新安装 jack server,jack-server默认安装路径/home/sun/.jack-server

sun@sun-pc:~/code$ prebuilts/sdk/tools/jack-admin uninstall-server
Removing jack server from "/home/sun/.jack-server"

sun@sun-pc:~/code$ prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar
Installing jack server in "/home/sun/.jack-server"

Warning: The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore /home/sun/.jack-server/server.jks -destkeystore /home/sun/.jack-server/server.jks -deststoretype pkcs12".

Warning: The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore /home/sun/.jack-server/client.jks -destkeystore /home/sun/.jack-server/client.jks -deststoretype pkcs12".

● 创建 jack存储log的目录
\" 这个是转义双引号,特意用红字体标注出来了

sun@sun-pc:~/code$ mkdir -p \"out/dist/logs/jack/\"

● 开启 jack server

sun@sun-pc:~/code$ JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Dcom.android.jack.server.log.file=/home/sun/code/8953_7120/out/dist/logs/jack/jack-server-%u-%g.log" prebuilts/sdk/tools/jack-admin start-server
Launching Jack server java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=/tmp -Dfile.encoding=UTF-8 -XX:+TieredCompilation -Dcom.android.jack.server.log.file=/home/sun/code/8953_7120/out/dist/logs/jack/jack-server-%u-%g.log -Xmx4096m -cp /home/sun/.jack-server/launcher.jar com.android.jack.launcher.ServerLauncher
Jack server failed to (re)start, try 'jack-diagnose' or see Jack server log

这条命令语句里又包含了两个命令:

# jack server的虚拟内存参数,jack-admin脚本默认定义了这个变量,这里多添加了一个log路径
JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Dcom.android.jack.server.log.file=/home/sun/code/8953_7120/out/dist/logs/jack/jack-server-%u-%g.log"
# 开启jack server进程,需要用到上面的参数
prebuilts/sdk/tools/jack-admin start-server

为什么没有分开执行?
是因为JACK_SERVER_VM_ARGUMENTS这里用 = 进行赋值的,这种方式无法被子shell继承使用。也就是说如果和 jack-admin 脚本分开执行,jack-admin脚本将无法获得JACK_SERVER_VM_ARGUMENTS的值,所以这里两句话放在一起执行才行。
当然分开执行也行,只需要在赋值操作前加上export,即export JACK_SERVER_VM_ARGUMENTS=xxx,这样就可以被子shell继承使用了。

● jack server升级
没有涉及本次报错,暂不分析

prebuilts/sdk/tools/jack-admin update server prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar 4.8.ALPHA
prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-2.28.RELEASE.jar 2.28.RELEASE
prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-3.36.CANDIDATE.jar 3.36.CANDIDATE
prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-4.7.BETA.jar 4.7.BETA

(2) 解决方法:
这个先说答案,分析过程等有时间再补。
(1) 编辑/etc/java-8-openjdk/security/java.security,将jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, … 里边的TLSv1, TLSv1.1删除。
(2) 重启jack-server

./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server

10. 缺少libssl-dev导致编译错误

/home/sun/code/android/kernel/msm-5.4/scripts/extract-cert.c:21:10: fatal error: 'openssl/bio.h' file not found

解决方法:
安装libssl-dev即可

sudo apt install libssl-dev

11. Android.mk缺少连接符号(反斜杠)

vendor/qcom/proprietary/mm-still/ipl/Android.mk:16: *** 配方在第一个目标前开始。 停止。

解决方法:
如下所示,本来15行最后面没有反斜杠( \ ),加上反斜杠就可以了。

 12 libmmipl_cflags := -g -O3 \
 13         $(CPU)
 14         -Dlrintf=_ffix_r \
 15         -D__alignx\(x\)=__attribute__\(\(__aligned__\(x\)\)\) \
 16         -D_POSIX_SOURCE \
 17         -DPOSIX_C_SOURCE=199506L \


12. 缺少current.txt文件

make: *** No rule to make target 'frameworks/base/api/current.txt', needed by 'out/target/common/obj/PACKAGING/checkpublicapi-current-timestamp'.  Stop.

解决方法:
1.提示"No rule to make target xxx",大部分情况就是这个文件不存在。

2.提示没有规则去编译目标"frameworks/base/api/current.txt",而这个编译是被"out/target/common/obj/PACKAGING/checkpublicapi-current-timestamp"所需要的。这个一看就是检查android api用的,我们直接执行make update-api就可以生成这个所需要的current.txt。


13. 链接器ld报错"unsupported reloc 43"

prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6//x86_64-linux/bin/ld: error: out/host/linux-x86/obj32/EXECUTABLES/third_party_libvpx_libvpx_obj_int_extract_arm_host_gyp_intermediates/third_party/libvpx/source/libvpx/build/make/obj_int_extract.o: unsupported reloc 43 against global symbol stderr

external/chromium_org/third_party/libvpx/source/libvpx/build/make/obj_int_extract.c:31: error: unsupported reloc 43

clang: error: linker command failed with exit code 1 (use -v to see invocation)

问题分析:
结合上面三部分的错误信息,链接器在链接.o文件时候报错unsupported reloc 43。
我们回想一下编译的四个步骤:预处理,编译,汇编,链接。链接是属于编译的最后步骤,只是将所有.o文件链接成可执行文件,并没有什么特殊的语法检查的作用,所以我们可以把这个有问题的链接器替换掉。

解决方法:
使用/usr/bin/ld.gold替换有问题的ld

cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin/ld

14. fatal error: ‘linux/msm_ion.h’ file not found

问题分析:
缺少libion-dev库,这个是linux中一个用来管理内存的库。

解决方法:

sudo apt install libion-dev

15. 文件损坏导致的错误

FAILED: out/target/product/qssi/obj/PACKAGING/gpl_source_intermediates/gpl_source.tgz
/bin/bash -c "tar cfz out/target/product/qssi/obj/PACKAGING/gpl_source_intermediates/gpl_source.tgz --exclude \".git*\" art/dt_fd_forward art/openjdkjvm art/openjdkjvmti external/blktrace external/bpftool external/dnsmasq external/dtc external/e2fsprogs external/eigen external/elfutils external/erofs-utils external/error_prone/checkerframework external/error_prone/jFormatString external/error_prone/javac external/exfatprogs external/f2fs-tools external/fec external/gptfdisk external/iproute2 external/iproute2/ip external/iproute2/lib external/iproute2/tc external/iptables external/jdiff external/kmod external/kotlinc external/libcap-ng external/libconfig external/libcups external/libexif external/libfuse external/libiio external/libkmsxx external/libnetfilter_conntrack external/libnfnetlink external/libnl external/liburing external/libusb external/linux-kselftest external/ltp external/lz4 external/mtools external/oj-libjdwp external/openwrt-prebuilts external/seccomp-tests external/selinux external/squashfs-tools external/wmediumd frameworks/native/opengl/tests/angeles libcore/ojluni prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8 prebuilts/tools/common/netbeans-visual"
tar: short read

问题分析:
问题比较明显,看红色部分,其实就是tar压缩文件的时候发生了错误。既然这个命令已经完整的显示出来了,我们不妨拷贝这段命令到终端上执行一下,看看会出现什么问题,执行后输出如下内容:

tar: prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib/libmsvcp120_app.a:文件缩小 1352580 字节;用零填充
tar: prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib/libmsvcr100.a:文件缩小 1082716 字节;用零填充
tar: prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib/libmsvcr120.a:文件缩小 46614 字节;用零填充
tar: prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib/libmsvcr90.a:文件缩小 407116 字节;用零填充
tar: prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib/libmingwex.a:文件缩小 668360 字节;用零填充
tar: prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib/libmmutilse.a:文件缩小 68002 字节;用零填充
tar: prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib/libmsvcr120_app.a:文件缩小 178076 字节;用零填充
tar: prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib/libmsvcr110.a:文件缩小 471726 字节;用零填充
tar: prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib/libmsvcp60.a:文件缩小 2153882 字节;用零填充
tar: prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib/libmsvcirt.a:文件缩小 194428 字节;用零填充
tar: prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib/libmsvcr120d.a:读入 10240 字节时,在 208896 字节处发生读错误: 输入/输出错误
tar: 由于前次错误,将以上次的错误状态退出
可以看到tar命令报告了上面这些文件有问题,尤其最后还看到有输入/输出错误,很明显这些文件有损坏。

解决方法:
删除上面有问题的文件,然后重新使用 git checkout 命令检出这些文件到本地。有人可能有疑问了,为什么不可以直接做检出操作进行覆盖呢?我的理解是git无法检测到损坏的文件是有变化的,至少从文件的时间上来说是没有变化的,既然检测不出文件有变化,那无论是使用 git checkout 还是 git reset 那都是没有用的。

Waiting up to 10s to lock out/.lock to ensure no other Soong process is running in the same output android9原码编译报错 mmm packages/apps/Launcher3 /media/disk_hd8t/qcom/SC200Y/packages/apps/Launcher3 Restriction Checker not present, skipping.. 14:46:28 Waiting up to 10s to lock out/.lock to ensure no other Soong process is running in the same output dire. 阅读详情

相关推荐

libfactory.so (native:vendor) can not link against libcustom_nvram(native:ndk:libc++:static)

可能是为不同的CPU架构(如armeabi-v7a、arm64-v8a、x86等)编译的。确保两个库都是为相同的ABI编译的。看起来是通过NDK(Native Development Kit)构建的,并且可能使用了。可能是静态链接的,这可能导致它在运行时与其他动态链接的库不兼容。或其他库,并且设备上安装的版本与此不匹配,则可能会发生问题。分区上的库可能受到额外的限制,不能轻易与其他分区(如。可以访问的范围内,并且具有正确的读取权限。可能依赖于某些特定的库或版本,这些库在。期望动态链接,则可能会出现问题。

632

Android编译出错问题总结

安卓编译常见错误

weixin_42562067的博客 3031

Android源码编译排错实战:从环境配置到SELinux策略的完整指南

在软件开发领域,构建系统是连接源代码与可执行产物的核心桥梁,其原理在于将代码、资源与配置按照特定规则转化为目标文件。对于Android系统开发而言,AOSP的构建系统经历了从Make到Soong的演进,技术价值在于提供了更严格、可扩展的模块化构建能力,能有效管理大型代码库的依赖与变体。然而,在实际工程实践中,开发者常面临环境配置、依赖解析、SELinux策略冲突等高频问题,导致编译失败。本文聚焦Android源码编译过程中的典型错误,系统梳理了从基础环境搭建、Soong/Blueprint构建系统配置,到S

weixin_30682415的博客 331

Android/AOSP源码编译错误:TEMPORARY_DISABLE_PATH_RESTRICTIONS

分析操作流程,在同一个编译环境中,连续编译不同版本的Android源码(Android 11和Android 12),由于不同版本源码编译时设置不同的环境变量,并且不同版本源码对环境变量的检查条件不兼容导致的。,在Android12编译时,不兼容这个变量的设置,并且编译脚本不会取消这个变量,导致编译报错。具体到遇到的这个问题,在Android11上编译是,配置脚本设置。编译环境多次编译过源码,工具链等都是正确配置,不存在问题。取消次环境变量设置,再次编译源码,可正常编译。

yinminsumeng的博客 642

安卓系统源码编译-(非常珍贵)

源码 编译 方案总结,个人实战总结,非常宝贵

JLINK/SWD/STLINK下载选项区别

摘要: 本文对比了JLINK/SWD/STLINK的6种下载模式:Normal(硬件复位)、Hot plug(无复位)、Under reset(持续复位后连接)、Software reset(软件复位)、Hardware reset(全复位)和Core reset(内核复位)。重点分析了各模式的操作逻辑、适用场景及注意事项,其中Under reset模式是解决SWD禁用/程序异常的首选方案。通过对比表归纳了复位范围、NRST操作等核心差异,并给出场景选择建议:排查连接问题优先选Under reset,常规调

亚洲程序员盟主得博客 395

Android杂谈--错误整理(持续更新)

1、错误:Conversion to Dalvik format failed with error 1 控制台的错误就是上面的样子,代码中不会有错误,但是不能运行 解决方案:项目--&gt;Properties--&gt;Java Build Path--&gt;Libraries--&gt;删除android.jar即可(这个android.jar可能是你fix project prope...

weixin_34345560的博客 123

IC版图设计布局经验90条!

13 如果一个cell调用其它cell,被调用的cell的vssx,vddx,vssb,vddb如果没有和外层cell连起来,要打上PIN,否则通不过diva检查.尽量在布局低层cell时就连起来。48 在匹配电路的mos管左右画上dummy,用poly,poly的尺寸与管子尺寸一样,dummy与相邻的第一个poly gate的间距等于poly gate之间的间距。8 更改cell时查看路径,一定要在正确的library下更改,以防copy过来的cell是在其他的library下,被改错。

weixin_44606964的博客 910

Android aab打包报错(持续更新中~),我在美团Android研发岗工作的那5年

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套。

2401_83621384的博客 989

新建菜单Office被替换为腾讯文档 - 解决方案

右键新建菜单中的Office被替换为腾讯文档。原因是安装了腾讯文档软件,此软件安装时会自动将新建菜单中的Office替换为腾讯文档,下文介绍解决方案。

NSJim的博客 2929

SAP 批量处理分包事后调整:BAPI_GOODSMVT_CREATE 关键参数与避坑指南

本文详细解析了SAP系统中使用BAPI_GOODSMVT_CREATE进行分包事后批量调整的关键参数配置与常见错误排查。重点介绍了GOODSMVT_CODE设置为'07'的必要性、GOODSMVT_ITEM结构体的正确配置方法,以及如何避免M7384、M7386等常见错误,帮助用户高效处理分包业务中的数量调整问题。

weixin_29276847的博客 566

AndroidStudio中配置NDK开发环境和编译Fresco

本文记录在 AndroidStudio 中配置 NDK 开发环境并编译 Fresco 源码。 有两种方法可以查看 Fresco 的源码,第一种是比较常见的,在AndroidStudio 中通过 Gradle 的 compile 导入 Fresco,然后就能查看 Fresco 的源码了,第二种是通过 下载 github 上的 Fresco 源码,在本地编译使用

classTC的博客 1520

ANSA二次开发在线帮助:ANSA和μETA API文档

  为了方便大家学习ANSA二次开发,我将ANSA和μETA二次开发的官方文档整合到了我的个人网站CAECoder中,大家点击ANSA和μETA API官方帮助文档进行访问即可查看。   本站也将开展对ANSA和μETA API文档的翻译工作,请大家持续关注! ANSA和μETA API文档   ANSA和μETA脚本接口是一个应用程序编程接口(API),允许开发人员访问ANSA和μETA核心功能和数据。   ANSA和μETAAPI是Python编程语言的扩展。 Python Python简.

CAECoder 4321

Linux系统安装与Android源码编译环境搭建全指南

在Linux环境下编译Android源码,是对系统配置与工程实践的严苛考验。一个稳定的编译环境,不仅依赖物理内存与磁盘规划,更取决于文件系统类型、交换空间策略、JDK版本及ccache缓存机制等底层细节。从磁盘分区、系统初始化到依赖工具链安装,每一步都可能成为构建成败的关键。理解源码构建与APK、NDK编译的本质差异,掌握ext4分区、swap扩容、repo同步优化等通用技术,是规避OOM Kill和动态库缺失问题的前提。本文从概念到原理,梳理整条环境配置链路,帮助你在遇到“Killed”或构建脚本报错时,

weixin_32715349的博客 251

302.QoS实现工具之MQC

QoS 技术可以对网络中报文进行分类处理,根据优先级提供不同的差分服务,如何实现这种差分服务呢?我们有一种强大的配置方法 - 模块化 QoS 命令行 MQC(Modular QoS Command-Line)。下面就来介绍一下 MQC。

迷逝 1393

华为OD机试双机位C卷:日志排序 (Py/C/C++/Java/Js/Go)

华为OD机试双机C卷真题【日志排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-日志排序。

qq_45776114的博客 1754

解决UE4源码编译C1060内存错误:修改BuildConfiguration.xml配置详解

在大型C++项目开发中,编译器堆内存不足是常见的技术挑战,尤其在使用MSVC编译复杂模板和大型源文件时。其原理在于编译器处理语法树、符号表和模板实例化等中间数据时,预设的堆内存空间被耗尽,导致编译过程中断。通过调整构建配置,可以显著提升编译器的内存使用上限,从而避免因内存不足导致的编译失败。这一技术对于Unreal Engine 4/5这类大型引擎的源码编译尤为重要,能有效解决“fatal error C1060”等典型错误。本文以UE4源码编译为例,深入解析如何通过修改BuildConfiguration

weixin_33725126的博客 384

网络安全与黑客攻防常见设备:前置机、跳板机、堡垒机与肉鸡

前置机、跳板机、堡垒机和肉鸡,这些看似冷僻的技术名词,实则是网络安全与黑客攻防战中的关键角色。它们有的守护着企业的数字Pltform,保卫网络安全;有的则成为黑客的跳板,游走于灰色地带。

网络技术联盟站 962

LayaNative源码编译全解析:从环境准备到Android/iOS集成

LayaNative作为LayaAir引擎的原生运行时,承担着将H5游戏逻辑封装到原生容器中的关键角色。理解其源码编译原理,开发者能突破预编译包的黑盒限制,解决老版本引擎兼容、深度原生定制等实际问题。通过匹配引擎版本、准备NDK与Xcode工具链、管理boost等第三方依赖,即可在Android端生成.so动态库,在iOS端生成静态库。源码编译的价值不仅在于修复系统级Bug,更在于为热更新、资源缓存、性能分析等场景提供底层扩展能力。整个流程基于工程实践,系统梳理双端编译的完整链路与高频踩坑点,助力开发者真正

weixin_34174105的博客 315

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

UE5.2源码编译与Android打包实战:从环境配置到真机调试

在游戏开发与高性能图形应用领域,源码编译是深入理解引擎架构、实现深度定制和跨平台部署的核心技术环节。其原理在于通过完整的工具链(如编译器、链接器、平台SDK)将高级语言代码转换为目标平台可执行文件,从而获得对渲染管线、内存管理及第三方库集成的完全控制权。这一过程的技术价值在于赋能开发者进行底层性能优化、精准问题诊断以及针对特定硬件(如移动设备)的定制开发。尤其在Android等碎片化严重的移动平台,源码编译是解决平台兼容性、性能瓶颈和疑难崩溃的唯一可靠途径。本文基于UE5.2、VS2022和Android平

dianchamian8747的博客 681

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android aab打包报错(持续更新中~)

咱一个个解决,先看打包问题。

2401_84148981的博客 971

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

技术文章系列整理(持续更新)

本博客有很多关于性能及测试开发的文章。我试着对你可能感兴趣的一些重要文章进行分类。

7DGroup,让技术更有价值! 1万+

Android开发前景怎么样,安卓开发从零开始

首先是感觉自己的基础还是不够吧,大厂好像都喜欢问这些底层原理。之前的准备只涉及了Java、Android、计网、数据结构与算法这些方面,面对面试官对其他基础课程的考察显得捉襟见肘。下一步还是要查漏补缺,进行针对性复习。最后的最后,那套资料这次一定要全部看完,是真的太全面了,各个知识点都涵盖了,几乎我面试遇到的所有问题的知识点这里面都有!希望大家不要犯和我一样的错误呀!!!一定要看完!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!!

2401_84408291的博客 1195

Android Studio编译错误:Error while generating the main dex list

这个是开了multidex的,如果你没开multidex, 可能不是这个错误,但是也是一个dex error的错误,出现这个错误的根本原因一般是导致冲突。所谓的“项目中出现了重复的java类”一般包括下面几种情况:libs下的jar包或者aar包跟中添加的远程依赖包重复,例如:libs下面放了一个gson.jar, 而build.gradle中又添加了,这时就会冲突,删掉gson.jar就可以了app的module中libs下添加了某个jar包,app依赖的某个module中libs下也添加了这个。

2401_84123113的博客 393

Android系统源码中C++测试框架GoogleTest实战指南

C++单元测试是保障底层代码质量的核心手段,而GoogleTest作为业界广泛使用的开源测试框架,为Android系统源码中的Native层开发提供了标准化的验证方案。其核心机制包括灵活的断言体系、测试夹具复用、参数化测试以及死亡测试,能够有效覆盖各种复杂场景。在AOSP构建体系中,通过Android.bp配置和atest工具,开发者可以轻松集成并运行测试,同时TEST_MAPPING机制进一步实现了提交前的自动化回归。此外,GoogleTest也是VTS兼容性测试的执行引擎,掌握它等于拥有了设备级验证的能

weixin_33849215的博客 341
上一篇: Android系统 —— Android10系统库对应的源码路径
下一篇: 脚本系列 —— shell脚本案例记录汇总(持续更新)
星际工程师
博客等级 码龄9年 1万+粉丝 57原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星际工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值