Android.mk 文件Jar包导入问题
Android.mk文件 导入jar包报错
Settings文件夹中新建libs目录,将jar包放入
报错:make: *** No rule to make target `packages/apps/Settings/tests/libs/pl2303g_driver.jar', needed by `out/target/common/obj/JAVA_LIBRARIES/pl2303g_driver_intermediates/classes.jack'. Stop.make: *** Waiting for unfinished jobs....
思考:编译过程中没有在tests文件夹做过操作,为何会在tests目录下产生错误
原因:
# Use the following include to make our test apk.
ifeq (,$(ONE_SHOT_MAKEFILE))
include $(call all-makefiles-under,$(LOCAL_PATH))
endif
这段代码中的 makefiles将寻找jar包的路径指向了tests目录,我添加的jar包使用的是相对路径libs/pl2303g_driver.jar,按照顺序在这之后执行,就会在tests里面寻找libs/pl2303driver.jar,就会报错找不到。
过程:在Android.mk中添加log 输出LOCAL_PATH
输出:
Tips:Android.mk 文件中添加log的方法:输出字符串的方式:$(warning string)或者$(error string) $(info string),输出变量方式为:$(warning $(var));用error方式的话打印完就直接退出来,停止编译。
解决方案:
将我添加的导入代码放在执行makefile 之前,按照顺序先执行
补充知识点:(1) LOCAL_PATH:= $(call my-dir) 一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。宏函数’my-dir’,由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。
(2) Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始,以include $(BUILD_XXX)结束。
(2.1) include $(CLEAR_VARS)
CLEAR_VARS指的是clear_vars.mk,由编译系统提供,它会让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中, 所有的变量都是全局的。
(2.2) include $(BUILD_PACKAGE) # Tell it to build an APK
$(BUILD_PACKAGE)是用来编译生成package/app/下的apk。还有其他几种编译情况:
include $(BUILD_STATIC_LIBRARY) 表示编译成静态库;
include $(BUILD_SHARED_LIBRARY) 表示编译成动态库;
include $(BUILD_EXECUTABLE) 表示编译成可执行程序;
(3) LOCAL_MODULE_TAGS := optional
解析:LOCAL_MODULE_TAGS :=user eng tests optional;
user: 指该模块只在user版本下才编译;
eng: 指该模块只在eng版本下才编译;
tests: 指该模块只在tests版本下才编译;
optional:指该模块在所有版本下都编译;
取值范围debug eng tests optional samples shell_ash shell_mksh。注意不能取值user,如果要预装,则应定义core.mk。
(4) LOCAL_SRC_FILES := $(call all-java-files-under, src)
(4.1) 如果要包含的是java源码的话,可以调用all-java-files-under得到。(这种形式来包含local_path目录下的所有java文件);
(4.2) 当涉及到C/C++时,LOCAL_SRC_FILES变量就必须包含将要编译打包进模块中的C或C++源代码文件。注意,在这里你可以不用列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。all-java-files-under宏的定义是在build/core/definitions.mk中。
(5) LOCAL_PACKAGE_NAME := Settings
package的名字,这个名字在脚本中将标识这个app或package。
(6) LOCAL_CERTIFICATE := platform
LOCAL_CERTIFICATE 后面是签名文件的文件名,说明Settings.apk是一个需要platform
key签名的APK
(7) include $(BUILD_PACKAGE)
(8) include $(call all-makefiles-under,$(LOCAL_PATH))
加载当前目录下的所有makefile文件,all-makefiles-under会返回一个位于当前'my-dir'路径的子目录中的所有Android.mk的列表。all-makefiles-under宏的定义是在build/core/definitions.mk中。
编译此Android.mk文件最后就生成了Settings.apk。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!