一步步制造安卓版的aapt

发表于2015-09-24
评论1 5.9k浏览
xsstagp>xsstagp style="unicode-bidi: embed; margin-top: 0px; color: rgb(51, 51, 51); font-family: 微软雅黑; font-size: 16px; line-height: 28.7999992370605px;">        由于某种特殊需求需要在安卓上用C/C 获取一个已安装app的详细信息,包括包名,app显示名字,MainActivity和图标路径,几经尝试各种方法,甚至还去研究apk的结构以及AndroidManifest.xml的编译和反编译,然后突然想到PC上不是有个aapt嘛,这个工具随安卓源码一起发布是用纯C/C 写的,粗略看了下没有用到平台相关的API,我想这玩意应该能移植到安卓吧,好了好了,最终结论是能移植的,且看我一步步卖萌xsstagimg src="http://km.oa.com/files/photos/pictures/201509/1442309610_17_w22_h22.gif" style="max-width: 670px;">

AAPT简介

        aapt即Android Asset Packaging Tool,在SDK的build-tools目录下。该工具可以查看,创建, 更新ZIP格式的文档附件(zip, jar, apk)。也可将资源文件编译成二进制文件,尽管你可能没有直接使用过aapt工具,但是build noxsss和IDE插件会使用这个工具打包apk文件构成一个Android 应用程序。在使用aapt之前需要在环境变量里面配置SDK-tools路径,或者是路径 aapt的方式进入aapt。xsstag

        //以上小节搬运自百科,详细介绍可以移步致:http://elinux.org/Android_aapt

        用大白话讲就是安卓版的aapt能满足我的需求获取apk的包名,app显示名字,MainActivity和图标路径。

源码获取

        aapt源码https://github.com/DylanZhao/aapt-build/archive/master.zip (把安卓的很多库都放进来了)

编译的辛酸路

        下下来后首先看了下Android.mk,将第60行的

include $(BUILD_HOST_EXECUTABLE)

         改为

include $(BUILD_EXECUTABLE)

         编译后报错

D:/dev_space/aapt/jni/utils/Compat.h:28:15: error: conflicting declaration 'typedef off_t off64_t'
D:/android-ndk-r9d/platforms/android-3/arch-arm/usr/include/sys/types.h:70:30: error: 'off64_t' has a previous declaration as 'typedef loff_t off64_t'
D:/dev_space/aapt/jni/utils/Compat.h: In function 'off64_t lseek64(int, off64_t, int)':
D:/dev_space/aapt/jni/utils/Compat.h:30:65: error: 'off64_t lseek64(int, off64_t, int)' was declared 'extern' and later 'static' [-fpermissive]
D:/android-ndk-r9d/platforms/android-3/arch-arm/usr/include/unistd.h:125:16: error: previous declaration of 'off64_t lseek64(int, off64_t, int)' [-fpermissive]
/cygdrive/d/android-ndk-r9d/build/core/build-binary.mk:393: recipe for target '/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/AaptAssets.o' failed
make: *** [/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/AaptAssets.o] Error 1

         去瞥一眼utils/Compat.h

#ifndef __LIB_UTILS_COMPAT_H #define __LIB_UTILS_COMPAT_H #include /* Compatibility definitions for non-Linux (i.e., BSD-based) hosts. */ #ifndef HAVE_OFF64_T #if _FILE_OFFSET_BITS < 64 #error "_FILE_OFFSET_BITS < 64; large files are not supported on this platform" #endif /* _FILE_OFFSET_BITS < 64 */ typedef off_t off64_t; static inline off64_t lseek64(int fd, off64_t offset, int whence) { return lseek(fd, offset, whence);} #ifdef HAVE_PREAD static inline ssize_t pread64(int fd, void* buf, size_t nbytes, off64_t offset) { return pread(fd, buf, nbytes, offset);} #endif #endif /* !HAVE_OFF64_T */ #endif /* __LIB_UTILS_COMPAT_H */

         目测之前已经定义过类型off64_t了现在又定义了一遍,编译前加上宏HAVE_OFF64_T就可以了

        于是修改Android.mk的31行为:

LOCAL_CFLAGS = -Wno-format-y2k -DHAVE_OFF64_T

         继续编译

         报错:

In file included from D:/dev_space/aapt/jni/ResourceTable.h:10:0, from D:/dev_space/aapt/jni/Command.cpp:9:D:/dev_space/aapt/jni/StringPool.h:23:19: fatal error: expat.h: No such file or directorycompilation terminated./cygdrive/d/android-ndk-r9d/build/core/build-binary.mk:393: recipe for target '/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/Command.o' failedmake: *** [/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/Command.o] Error 1

         目测少了expat库,于是从安卓源码android_srcexternalexpatlib拉了全部文件过来放在aapt根目录下新建的expat下面去,然后修改Android.mk的11行开始处代码为这样:

        就是新增:

include $(CLEAR_VARS)LOCAL_MODULE := libexpatLOCAL_LDLIBS = -L$(SYSROOT)/usr/lib -llogLOCAL_ARM_MODE := armLOCAL_SRC_FILES := ./expat/xmlparse.c ./expat/xmlrole.c ./expat/xmltok_ns.c ./expat/xmltok.c ./expat/xmltok_impl.cinclude $(BUILD_STATIC_LIBRARY)

         同时加入选项:

LOCAL_C_INCLUDES = expat

         编译,然后继续报错(习惯性报错)

In file included from D:/dev_space/aapt/jni/Command.cpp:9:0:D:/dev_space/aapt/jni/ResourceTable.h:13:15: fatal error: set: No such file or directorycompilation terminated./cygdrive/d/android-ndk-r9d/build/core/build-binary.mk:393: recipe for target '/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/Command.o' failedmake: *** [/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/Command.o] Error 1

         额,居然说不支持C 的set,我也是醉了,额,jni下面居然没有Application.mk。没事咱建一个,写入:

APP_STL := stlport_static

         继续编译,继续习惯性报错:

D:/dev_space/aapt/jni/Images.cpp:14:17: fatal error: png.h: No such file orctorycompilation terminated./cygdrive/d/android-ndk-r9d/build/core/build-binary.mk:393: recipe for targcygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/Images.o' failedmake: *** [/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/Images.o]r 1

         。。。。。。目测少了png库,然后从安卓源码android_srcexternallibpng下面翻出了需要的东西,然后在aapt下新建目录png,把libpng下面所有png开头的.c和.h全拉过去了,同时在Android.mk新增:

include $(CLEAR_VARS)LOCAL_MODULE := libpngLOCAL_LDLIBS = -L$(SYSROOT)/usr/lib -llogLOCAL_ARM_MODE := armLOCAL_SRC_FILES := ./png/png.c ./png/pngerror.c ./png/pnggccrd.c ./png/pngget.c ./png/pngmem.c ./png/pngpread.c ./png/pngread.c ./png/pngrio.c ./png/pngrtran.c ./png/pngrutil.c ./png/pngset.c ./png/pngtrans.c ./png/pngvcrd.c ./png/pngwio.c ./png/pngwrite.c ./png/pngwtran.c ./png/pngwutil.cinclude $(BUILD_STATIC_LIBRARY)

        加上编译选项

LOCAL_C_INCLUDES = png

        building.....继续等待错误.......:

D:/dev_space/aapt/jni/ZipFile.cpp: In member function 'android::status_t android::ZipFile::open(char const*, int)':D:/dev_space/aapt/jni/ZipFile.cpp:78:43: error: 'F_OK' was not declared in this scopeD:/dev_space/aapt/jni/ZipFile.cpp:78:47: error: 'access' was not declared in this scopeD:/dev_space/aapt/jni/ZipFile.cpp: In member function 'android::status_t android::ZipFile::flush()':D:/dev_space/aapt/jni/ZipFile.cpp:933:48: error: 'ftruncate' was not declared in this scope/cygdrive/d/android-ndk-r9d/build/core/build-binary.mk:393: recipe for target '/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/ZipFile.o' failedmake: *** [/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/ZipFile.o] Error 1

         额。木有access函数,那就给ZipFile.cpp加上

#include

         然后继续building........接下来报的错我就不多说了,贴上来肯定太多太多了,反正就是各种undefined refrence to,仔细看了下,aapt目录下的好多文件还没编译进去呢,于是又给Android.mk加了一堆东西,增加之后的LOCAL_SRC_FILES是这样的:

LOCAL_SRC_FILES := AaptAssets.cpp Command.cpp CrunchCache.cpp FileFinder.cpp Main.cpp Package.cpp StringPool.cpp XMLNode.cpp ResourceFilter.cpp ResourceTable.cpp Images.cpp Resource.cpp SourcePos.cpp ZipEntry.cpp ZipFile.cpp ./utils-cpp/Asset.cpp ./utils-cpp/AssetDir.cpp ./utils-cpp/AssetManager.cpp ./utils-cpp/BlobCache.cpp ./utils-cpp/BufferedTextOutput.cpp ./utils-cpp/CallStack.cpp ./utils-cpp/Debug.cpp ./utils-cpp/FileMap.cpp ./utils-cpp/Flattenable.cpp ./utils-cpp/LinearTransform.cpp ./utils-cpp/ObbFile.cpp ./utils-cpp/PropertyMap.cpp ./utils-cpp/RefBase.cpp ./utils-cpp/ResourceTypes.cpp ./utils-cpp/SharedBuffer.cpp ./utils-cpp/Static.cpp ./utils-cpp/StopWatch.cpp ./utils-cpp/StreamingZipInflater.cpp ./utils-cpp/String8.cpp ./utils-cpp/String16.cpp ./utils-cpp/StringArray.cpp ./utils-cpp/SystemClock.cpp ./utils-cpp/TextOutput.cpp ./utils-cpp/Threads.cpp ./utils-cpp/Timers.cpp ./utils-cpp/Tokenizer.cpp ./utils-cpp/Unicode.cpp ./utils-cpp/VectorImpl.cpp ./utils-cpp/ZipFileCRO.cpp ./utils-cpp/ZipFileRO.cpp ./utils-cpp/ZipUtils.cpp ./utils-cpp/misc.cpp ./cutils-c/atomic.c ./cutils-c/properties.c ./cutils-c/sched_policy.c ./cutils-c/sockets.c ./cutils-c/threads.c ./cutils-c/uio.c ./host/pseudolocalize.cpp

         好继续等待错误:

In file included from D:/dev_space/aapt/jni/./utils-cpp/BufferedTextOutput.cpp:25:0:D:/dev_space/aapt/jni/cutils/threads.h:60:4: error: #error "no thread_store_t implementation for your platform !!"D:/dev_space/aapt/jni/cutils/threads.h:65:32: warning: 'thread_store_get' initialized and declared 'extern' [enabled by default]D:/dev_space/aapt/jni/cutils/threads.h:65:32: error: 'thread_store_t' was not declared in this scopeD:/dev_space/aapt/jni/cutils/threads.h:65:49: error: 'store' was not declared in this scopeD:/dev_space/aapt/jni/cutils/threads.h:67:32: error: variable or field 'thread_store_set' declared voidD:/dev_space/aapt/jni/cutils/threads.h:67:32: error: 'thread_store_t' was not declared in this scopeD:/dev_space/aapt/jni/cutils/threads.h:67:57: error: 'store' was not declared in this scopeD:/dev_space/aapt/jni/cutils/threads.h:68:32: error: expected primary-noxss before 'void'D:/dev_space/aapt/jni/cutils/threads.h:69:57: error: expected primary-noxss before 'destroy'D:/dev_space/aapt/jni/./utils-cpp/BufferedTextOutput.cpp:88:8: error: 'mutex_t' does not name a typeD:/dev_space/aapt/jni/./utils-cpp/BufferedTextOutput.cpp:90:8: error: 'thread_store_t' does not name a typeD:/dev_space/aapt/jni/./utils-cpp/BufferedTextOutput.cpp: In static member function 'static android::BufferedTextOutput::ThreadState* android::BufferedTextOutput::getThreadState()':D:/dev_space/aapt/jni/./utils-cpp/BufferedTextOutput.cpp:94:58: error: 'tls' was not declared in this scopeD:/dev_space/aapt/jni/./utils-cpp/BufferedTextOutput.cpp:94:62: error: 'thread_store_get' cannot be used as a functionD:/dev_space/aapt/jni/./utils-cpp/BufferedTextOutput.cpp:97:50: error: 'thread_store_set' was not declared in this scopeD:/dev_space/aapt/jni/./utils-cpp/BufferedTextOutput.cpp: In function 'int32_t android::allocBufferIndex()':D:/dev_space/aapt/jni/./utils-cpp/BufferedTextOutput.cpp:114:17: error: 'gMutex' was not declared in this scopeD:/dev_space/aapt/jni/./utils-cpp/BufferedTextOutput.cpp:114:23: error: 'mutex_lock' was not declared in this scopeD:/dev_space/aapt/jni/./utils-cpp/BufferedTextOutput.cpp:126:25: error: 'mutex_unlock' was not declared in this scopeD:/dev_space/aapt/jni/./utils-cpp/BufferedTextOutput.cpp: In function 'void android::freeBufferIndex(int32_t)':D:/dev_space/aapt/jni/./utils-cpp/BufferedTextOutput.cpp:133:17: error: 'gMutex' was not declared in this scopeD:/dev_space/aapt/jni/./utils-cpp/BufferedTextOutput.cpp:133:23: error: 'mutex_lock' was not declared in this scopeD:/dev_space/aapt/jni/./utils-cpp/BufferedTextOutput.cpp:136:25: error: 'mutex_unlock' was not declared in this scope/cygdrive/d/android-ndk-r9d/build/core/build-binary.mk:393: recipe for target '/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/./utils-cpp/BufferedTextOutput.o' failedmake: *** [/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/./utils-cpp/BufferedTextOutput.o] Error 1xsstagxsstag

         目测是多线程相关的东西打开cutils/threads.h看一眼60行前后的代码

#ifdef HAVE_PTHREADS #include typedef struct { pthread_mutex_t lock; int has_tls; pthread_key_t tls;} thread_store_t; #define THREAD_STORE_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0, 0 } #elif defined HAVE_WIN32_THREADS #include typedef struct { int lock_init; int has_tls; DWORD tls; CRITICAL_SECTION lock;} thread_store_t; #define THREAD_STORE_INITIALIZER { 0, 0, 0, {0, 0, 0, 0, 0, 0} } #else # error "no thread_store_t implementation for your platform !!" //我是乱入的,这里是60行 #endif

         既然在60行的error出来了,那么最上面的ifdef应该没进去,而理论上要进去那些多线程的函数才会有,看来又要预定于宏HAVE_THREADS了,于是在Android.mk新增:

LOCAL_CFLAGS = -Wno-format-y2k -DHAVE_OFF64_T -DHAVE_PTHREADS

         继续习惯性等待错误........:(后面有略掉)

D:/dev_space/aapt/jni/utils/threads.h:357:4: error: 'pthread_rwlock_t' does not name a typeD:/dev_space/aapt/jni/utils/threads.h: In constructor 'android::RWLock::RWLock()':D:/dev_space/aapt/jni/utils/threads.h:361:26: error: 'mRWLock' was not declared in this scopeD:/dev_space/aapt/jni/utils/threads.h:361:39: error: 'pthread_rwlock_init' was not declared in this scopeD:/dev_space/aapt/jni/utils/threads.h: In constructor 'android::RWLock::RWLock(char const*)':

          这个问题最头痛了,搞了大半天,最后发现在android-3的pthread.h中没有pthread_rwlock_t而在level19中就有。。。。。。坑爹啊。。(有图有真相)

。。默默的在Application.mk中加入了

APP_PLATFORM := android-19

 继续编译

D:/dev_space/aapt/jni/./utils-cpp/CallStack.cpp: In function 'int android::backtrace(void const**, size_t, size_t)':D:/dev_space/aapt/jni/./utils-cpp/CallStack.cpp:78:52: error: '_Unwind_Backtrace' was not declared in this scope/cygdrive/d/android-ndk-r9d/build/core/build-binary.mk:393: recipe for target '/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/./utils-cpp/CallStack.o' failedmake: *** [/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/./utils-cpp/CallStack.o] Error 1

         说实话,这个函数我是真的不知道在哪个so或者.a中,因为我搜索了整个ndk目录都木有,ARM平台上的函数调用栈回溯比X86要复杂一点,我记得NDK不提供这玩意,不过倒是第三方libcorkserew有提供arm版本的栈回溯功能,对应的好像也是_Unwind_Backtrace(话说,按照常理出牌,下划线开头的接口一看就是私有API,找了libc.so和libstdc .so反正都是没有导出这玩意的)。。。最后想想这么麻烦就算了算了,反正也不是什么大不了的功能,不就是core了打个调用栈给我看看嘛,我不看不行嘛,我换成

puts("I'm crashed.....n");

 不行嘛

        继续继续

D:/dev_space/aapt/jni/./utils-cpp/FileMap.cpp: In member function 'bool android::FileMap::create(char const*, int, off64_t, size_t, bool)':D:/dev_space/aapt/jni/./utils-cpp/FileMap.cpp:187:19: error: 'adjLength' was not declared in this scopeD:/dev_space/aapt/jni/./utils-cpp/FileMap.cpp:189:35: error: 'adjust' was not declared in this scope/cygdrive/d/android-ndk-r9d/build/core/build-binary.mk:393: recipe for target '/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/./utils-cpp/FileMap.o' failedmake: *** [/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/./utils-cpp/FileMap.o] Error 1

 看下FileMap.cpp187行附近的代码

#ifdef HAVE_POSIX_FILEMAP int prot, flags, adjust; off64_t adjOffset; size_t adjLength; void* ptr; assert(mRefCount == 1); assert(fd >= 0); assert(offset >= 0); assert(length > 0); /* init on first use */ if (mPageSize == -1) { #if NOT_USING_KLIBC mPageSize = sysconf(_SC_PAGESIZE); if (mPageSize == -1) { LOGE("could not get _SC_PAGESIZEn"); return false; } #else /* this holds for Linux, Darwin, Cygwin, and doesn't pain the ARM */ mPageSize = 4096; #endif } adjust = offset % mPageSize;try_again: adjOffset = offset - adjust; adjLength = length adjust; flags = MAP_SHARED; prot = PROT_READ; if (!readOnly) prot |= PROT_WRITE; ptr = mmap(NULL, adjLength, prot, flags, fd, adjOffset); if (ptr == MAP_FAILED) { // Cygwin does not seem to like file mapping files from an offset. // So if we fail, try again with offset zero if (adjOffset > 0) { adjust = offset; goto try_again; } LOGE("mmap(%ld,%ld) failed: %sn", (long) adjOffset, (long) adjLength, strerror(errno)); return false; } mBasePtr = ptr; #endif /* HAVE_POSIX_FILEMAP */ mFileName = origFileName != NULL ? strdup(origFileName) : NULL; mBaseLength = adjLength; //我是187 mDataOffset = offset; mDataPtr = (char*) mBasePtr adjust; mDataLength = length;

 赫然发现最顶上的代码对adjLength的定义不见了。。。额。。。给编译选项继续加上宏

-DHAVE_POSIX_FILEMAP

 继续编译

In file included from D:/dev_space/aapt/jni/./cutils-c/atomic.c:19:0:D:/dev_space/aapt/jni/cutils/atomic-inline.h:43:3: error: #error "Must define ANDROID_SMP before including atomic-inline.h"D:/dev_space/aapt/jni/cutils/atomic-inline.h:47:31: fatal error: cutils/atomic-arm.h: No such file or directorycompilation terminated./cygdrive/d/android-ndk-r9d/build/core/build-binary.mk:391: recipe for target '/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/./cutils-c/atomic.o' failedmake: *** [/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/./cutils-c/atomic.o] Error 1

         。。。。。。行吧。你说要先定义ANDROID_SMP就定义一个吧,稍微看了下代码,ANDROID_SMP要么定义成0 要么定义成1,看注释大概意思就是是不是利用多核的东西,感觉关系不是很大,随便定义成1好了,在atomic-inline.h的41行加入了

#define ANDROID_SMP 1

         还说少atomic-arm.h。。可惜我的aapt里面没有啊。。。。最终在安卓源码android_srcsystemcoreincludecutils下面被我挖到了一枚atomic-arm.h感觉非常萌

放进去,继续编译

[armeabi] Compile thumb : aapt <= atomic.cD:cygwin64tmpccfe43bg.s: Assembler messages:D:cygwin64tmpccfe43bg.s:50: Error: selected processor does not support Thumb mode `dmb'D:cygwin64tmpccfe43bg.s:74: Error: selected processor does not support Thumb mode `dmb st'D:cygwin64tmpccfe43bg.s:104: Error: selected processor does not support Thumb mode `dmb'D:cygwin64tmpccfe43bg.s:133: Error: selected processor does not support Thumb mode `dmb'D:cygwin64tmpccfe43bg.s:167: Error: selected processor does not support Thumb mode `dmb'D:cygwin64tmpccfe43bg.s:196: Error: selected processor does not support Thumb mode `dmb'D:cygwin64tmpccfe43bg.s:232: Error: selected processor does not support Thumb mode `ldrex r3,[r2]'D:cygwin64tmpccfe43bg.s:234: Error: selected processor does not support Thumb mode `teq r3,r0'D:cygwin64tmpccfe43bg.s:235: Error: selected processor does not support Thumb mode `strexeq r4,r1,[r2]'D:cygwin64tmpccfe43bg.s:280: Error: selected processor does not support Thumb mode `ldrex r3,[r2]'D:cygwin64tmpccfe43bg.s:282: Error: selected processor does not support Thumb mode `teq r3,r0'D:cygwin64tmpccfe43bg.s:283: Error: selected processor does not support Thumb mode `strexeq r4,r1,[r2]'D:cygwin64tmpccfe43bg.s:297: Error: selected processor does not support Thumb mode `dmb'D:cygwin64tmpccfe43bg.s:343: Error: selected processor does not support Thumb mode `dmb'D:cygwin64tmpccfe43bg.s:354: Error: selected processor does not support Thumb mode `ldrex r3,[r2]'D:cygwin64tmpccfe43bg.s:356: Error: selected processor does not support Thumb mode `teq r3,r0'D:cygwin64tmpccfe43bg.s:357: Error: selected processor does not support Thumb mode `strexeq r4,r1,[r2]'D:cygwin64tmpccfe43bg.s:405: Error: selected processor does not support Thumb mode `dmb'D:cygwin64tmpccfe43bg.s:415: Error: selected processor does not support Thumb mode `ldrex r0,[r1]'D:cygwin64tmpccfe43bg.s:417: Error: selected processor does not support Thumb mode `strex r2,r4,[r1]'D:cygwin64tmpccfe43bg.s:453: Error: selected processor does not support Thumb mode `dmb'D:cygwin64tmpccfe43bg.s:463: Error: selected processor does not support Thumb mode `ldrex r0,[r3]'D:cygwin64tmpccfe43bg.s:465: Error: selected processor does not support Thumb mode `strex r2,r1,[r3]'D:cygwin64tmpccfe43bg.s:509: Error: selected processor does not support Thumb mode `dmb'D:cygwin64tmpccfe43bg.s:521: Error: selected processor does not support Thumb mode `ldrex r0,[r3]'D:cygwin64tmpccfe43bg.s:523: Error: selected processor does not support Thumb mode `strex r1,r4,[r3]'D:cygwin64tmpccfe43bg.s:564: Error: selected processor does not support Thumb mode `dmb'D:cygwin64tmpccfe43bg.s:574: Error: selected processor does not support Thumb mode `ldrex r0,[r1]'D:cygwin64tmpccfe43bg.s:575: Error: dest must overlap one source register -- `and r4,r0,r3'D:cygwin64tmpccfe43bg.s:576: Error: selected processor does not support Thumb mode `strex r2,r4,[r1]'D:cygwin64tmpccfe43bg.s:615: Error: selected processor does not support Thumb mode `dmb'D:cygwin64tmpccfe43bg.s:625: Error: selected processor does not support Thumb mode `ldrex r0,[r1]'D:cygwin64tmpccfe43bg.s:626: Error: dest must overlap one source register -- `orr r4,r0,r3'D:cygwin64tmpccfe43bg.s:627: Error: selected processor does not support Thumb mode `strex r2,r4,[r1]'/cygdrive/d/android-ndk-r9d/build/core/build-binary.mk:391: recipe for target '/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/./cutils-c/atomic.o' failedmake: *** [/cygdrive/d/dev_space/aapt/obj/local/armeabi/objs/aapt/./cutils-c/atomic.o] Error 1

         

        这啥玩意,为嘛会不支持这些指令。。。。各种google一番发现这些指令集是在V7A以后支持的,要显示告诉编译器才可以,加入编译选项:

LOCAL_ARM_MODE := armTARGET_ARCH_ABI := armeabi-v7a LOCAL_ARM_NEON := true LOCAL_CFLAGS := -mfloat-abi=softfp -mfpu=neon -march=armv7-a -mtune=cortex-a8

 继续等待错误。。。。。

你慢慢编译我先去喝杯水。。。

回来看到这样一番场景

好像已经编译好了的样子


拿手机上测试一下。

额,好吧,酱紫就能用了,附件是整个工程和binary的aapt for android

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

1个评论

  • 。。。 2017-04-03 1楼
    大神,你似乎忘记了附件的下载地址了,我编译不成功啊