如何在不影响原有aapt源码的情况下编译定制版aapt

来源:互联网 发布:淘宝店铺数据统计表 编辑:程序博客网 时间:2024/05/16 08:46

上篇文章Android aapt实现资源分区(补充携程aapt源码)讲了通过修改aapt源码来实现资源的分区。但是我想保留一份原来的源码,而不是通过git去查看历史的版本。这时候,就需要编译自定义的模块。在这之前,需要搭建环境和下载源码,具体可以参考google官方的文章。

  • Establishing a Build Environment
  • Downloading the Source
  • Building the System

正常情况下,编译aapt时我们使用的命令是

make aapt

改造后,我们希望该命令可以编译出官方的aapt,然后通过另一个命令编译出定制版的aapt,这里让其命名为vaapt,当然这个前缀随意,你喜欢就好。最终编译的命令就是

make vaapt

命令有了,模块在哪里呢?很简单,直接在aapt同级目录下拷贝一个aapt,重名名为vaapt。最终目录结构如图所示

这里写图片描述

我们还需要修改makefile文件,让其编译出vaapt,依赖的内容也是vaapt,makefile原内容为:

# ==========================================================# Build the host static library: libaapt# ==========================================================include $(CLEAR_VARS)LOCAL_MODULE := libaaptLOCAL_MODULE_HOST_OS := darwin linux windowsLOCAL_CFLAGS := -Wno-format-y2k -DSTATIC_ANDROIDFW_FOR_TOOLS $(aaptCFlags)LOCAL_CPPFLAGS := $(aaptCppFlags)LOCAL_CFLAGS_darwin := -D_DARWIN_UNLIMITED_STREAMSLOCAL_SRC_FILES := $(aaptSources)LOCAL_STATIC_LIBRARIES := $(aaptHostStaticLibs)LOCAL_STATIC_LIBRARIES_windows := $(aaptHostStaticLibs_windows)include $(BUILD_HOST_STATIC_LIBRARY)# ==========================================================# Build the host executable: aapt# ==========================================================include $(CLEAR_VARS)LOCAL_MODULE := aaptLOCAL_MODULE_HOST_OS := darwin linux windowsLOCAL_CFLAGS := $(aaptCFlags)LOCAL_CPPFLAGS := $(aaptCppFlags)LOCAL_LDLIBS_darwin := $(aaptHostLdLibs_darwin)LOCAL_LDLIBS_linux := $(aaptHostLdLibs_linux)LOCAL_SRC_FILES := $(aaptMain)LOCAL_STATIC_LIBRARIES := libaapt $(aaptHostStaticLibs)LOCAL_STATIC_LIBRARIES_windows := $(aaptHostStaticLibs_windows)include $(BUILD_HOST_EXECUTABLE)# ==========================================================# Build the host tests: libaapt_tests# ==========================================================include $(CLEAR_VARS)LOCAL_MODULE := libaapt_testsLOCAL_CFLAGS := $(aaptCFlags)LOCAL_CPPFLAGS := $(aaptCppFlags)LOCAL_LDLIBS_darwin := $(aaptHostLdLibs_darwin)LOCAL_LDLIBS_linux := $(aaptHostLdLibs_linux)LOCAL_SRC_FILES := $(aaptTests)LOCAL_C_INCLUDES := $(LOCAL_PATH)LOCAL_STATIC_LIBRARIES := libaapt $(aaptHostStaticLibs)LOCAL_STATIC_LIBRARIES_windows := $(aaptHostStaticLibs_windows)include $(BUILD_HOST_NATIVE_TEST)

可以看到LOCAL_MODULE的值都是aapt相关的,比如static library对应的值是libaapt,host executable对应的值是aapt,host tests对应的值是libaapt_tests,还有LOCAL_STATIC_LIBRARIES的值也是依赖static library,其值为libaapt,我们需要将这几个值修改为vaapt相关的,即在原来的值aapt前面加个v,对应修改为libvaapt、vaapt、libvaapt_tests、libvaapt。修改后的内容如下:

# ==========================================================# Build the host static library: libaapt# ==========================================================include $(CLEAR_VARS)LOCAL_MODULE := libvaaptLOCAL_MODULE_HOST_OS := darwin linux windowsLOCAL_CFLAGS := -Wno-format-y2k -DSTATIC_ANDROIDFW_FOR_TOOLS $(aaptCFlags)LOCAL_CPPFLAGS := $(aaptCppFlags)LOCAL_CFLAGS_darwin := -D_DARWIN_UNLIMITED_STREAMSLOCAL_SRC_FILES := $(aaptSources)LOCAL_STATIC_LIBRARIES := $(aaptHostStaticLibs)LOCAL_STATIC_LIBRARIES_windows := $(aaptHostStaticLibs_windows)include $(BUILD_HOST_STATIC_LIBRARY)# ==========================================================# Build the host executable: aapt# ==========================================================include $(CLEAR_VARS)LOCAL_MODULE := vaaptLOCAL_MODULE_HOST_OS := darwin linux windowsLOCAL_CFLAGS := $(aaptCFlags)LOCAL_CPPFLAGS := $(aaptCppFlags)LOCAL_LDLIBS_darwin := $(aaptHostLdLibs_darwin)LOCAL_LDLIBS_linux := $(aaptHostLdLibs_linux)LOCAL_SRC_FILES := $(aaptMain)LOCAL_STATIC_LIBRARIES := libvaapt $(aaptHostStaticLibs)LOCAL_STATIC_LIBRARIES_windows := $(aaptHostStaticLibs_windows)include $(BUILD_HOST_EXECUTABLE)# ==========================================================# Build the host tests: libaapt_tests# ==========================================================include $(CLEAR_VARS)LOCAL_MODULE := libvaapt_testsLOCAL_CFLAGS := $(aaptCFlags)LOCAL_CPPFLAGS := $(aaptCppFlags)LOCAL_LDLIBS_darwin := $(aaptHostLdLibs_darwin)LOCAL_LDLIBS_linux := $(aaptHostLdLibs_linux)LOCAL_SRC_FILES := $(aaptTests)LOCAL_C_INCLUDES := $(LOCAL_PATH)LOCAL_STATIC_LIBRARIES := libvaapt $(aaptHostStaticLibs)LOCAL_STATIC_LIBRARIES_windows := $(aaptHostStaticLibs_windows)include $(BUILD_HOST_NATIVE_TEST)

这时候执行编译命令make vaapt,完全可以编译出一个vaapt命名的可执行文件。但是事情还没有完,aapt的源码依赖了androidfw下的部分源码,而恰恰这部分源码也可能需要修改,因此我们也需要做同样的事,在同目录下复制一份androidfw为vandroidfw。这个文件夹有两份,一份是头文件,一份是cpp文件,对应在不同的目录。首先来看头文件的目录,在include下

这里写图片描述

然后是实现的cpp的目录,在libs下

这里写图片描述

同样的需要修改makefile文件,原文件内容是

# For the host# =====================================================include $(CLEAR_VARS)LOCAL_MODULE:= libandroidfwLOCAL_MODULE_HOST_OS := darwin linux windowsLOCAL_CFLAGS += -DSTATIC_ANDROIDFW_FOR_TOOLSLOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-codeLOCAL_SRC_FILES:= $(hostSources)LOCAL_C_INCLUDES := external/zlibinclude $(BUILD_HOST_STATIC_LIBRARY)# For the device# =====================================================include $(CLEAR_VARS)LOCAL_MODULE:= libandroidfwLOCAL_SRC_FILES:= $(deviceSources)LOCAL_C_INCLUDES := \    system/core/includeLOCAL_STATIC_LIBRARIES := libziparchive libbaseLOCAL_SHARED_LIBRARIES := \    libbinder \    liblog \    libcutils \    libgui \    libutils \    libz

需要将LOCAL_MODULE的值从libandroidfw修改为libvandroidfw。

这时候其实还是有问题的,因为文件里的头文件的引用还是androidfw的,会报找不到的错误,因此需要将include/vandroidfw和libs/vandroidfw下的文件内容中头文件的include部分的代码和androidfw相关的都改成vandroidfw。就像这样

这里写图片描述

这是一个相对痛苦且繁琐的步骤,只要耐住性子改了就可以了,不要遗漏即可。

然后回到vaapt的makefile文件。将对androidfw的引用改成vandroidfw,原内容为

aaptHostStaticLibs := \    libandroidfw \    libpng \    liblog \    libutils \    libcutils \    libexpat \    libziparchive-host \    libbase

修改后的内容为

aaptHostStaticLibs := \    libvandroidfw \    libpng \    liblog \    libutils \    libcutils \    libexpat \    libziparchive-host \    libbase

至此,就完成了一个自定义的aapt的模块的新建和修改,之后只需要修改vaapt下的源码以及vandroidfw下的源码,即可得到自定义的aapt,而不改变原有aapt的源码内容。如果需要编译官方的aapt,只需要用make aapt编译,编译我们自定义的aapt,则使用make vaapt编译,做到了一定的隔离,互不影响。当然如果你乐意,完全可以对vaapt和vandroidfw目录使用git进行版本控制,这样也就能看到我们历史修改了什么内容。

最后推荐一个可以用于差异比较的软件Beyond Compare,跨平台的,windows,mac,linux都有,当然这是一个收费软件。。。所以你懂的。可以用它比较两个目录的aapt之间的差异,效果如下。

这里写图片描述

图中红色部分代表两个文件内容不一致,点击红色文件就可以查看差异部分。

这里写图片描述

0 0
原创粉丝点击