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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sbsujjbcy/article/details/51418336

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

正常情况下,编译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 := libaapt
LOCAL_MODULE_HOST_OS := darwin linux windows
LOCAL_CFLAGS := -Wno-format-y2k -DSTATIC_ANDROIDFW_FOR_TOOLS $(aaptCFlags)
LOCAL_CPPFLAGS := $(aaptCppFlags)
LOCAL_CFLAGS_darwin := -D_DARWIN_UNLIMITED_STREAMS
LOCAL_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 := aapt
LOCAL_MODULE_HOST_OS := darwin linux windows
LOCAL_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_tests
LOCAL_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 := libvaapt
LOCAL_MODULE_HOST_OS := darwin linux windows
LOCAL_CFLAGS := -Wno-format-y2k -DSTATIC_ANDROIDFW_FOR_TOOLS $(aaptCFlags)
LOCAL_CPPFLAGS := $(aaptCppFlags)
LOCAL_CFLAGS_darwin := -D_DARWIN_UNLIMITED_STREAMS
LOCAL_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 := vaapt
LOCAL_MODULE_HOST_OS := darwin linux windows
LOCAL_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_tests
LOCAL_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:= libandroidfw
LOCAL_MODULE_HOST_OS := darwin linux windows
LOCAL_CFLAGS += -DSTATIC_ANDROIDFW_FOR_TOOLS
LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
LOCAL_SRC_FILES:= $(hostSources)
LOCAL_C_INCLUDES := external/zlib

include $(BUILD_HOST_STATIC_LIBRARY)


# For the device
# =====================================================

include $(CLEAR_VARS)

LOCAL_MODULE:= libandroidfw
LOCAL_SRC_FILES:= $(deviceSources)
LOCAL_C_INCLUDES := \
    system/core/include
LOCAL_STATIC_LIBRARIES := libziparchive libbase
LOCAL_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之间的差异,效果如下。

这里写图片描述

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

这里写图片描述

阅读更多
换一批

没有更多推荐了,返回首页