构建Android源代码(Building android source code)

2019-06-23 15:43发布

我从source.android.com下载Android的源和随后在Mac OS X上的指令设置编译环境,一切都很好,当我运行make它给了我下面的错误,除了

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.1
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
HOST_ARCH=x86
HOST_OS=darwin
HOST_BUILD_TYPE=release
BUILD_ID=ITL41D
============================================
host C++: aapt <= frameworks/base/tools/aapt/AaptAssets.cpp
frameworks/base/tools/aapt/AaptAssets.cpp:2161:38: warning: unused parameter 'bundle' [-Wunused-parameter]
AaptAssets::slurpResourceZip(Bundle* bundle, const char* filename)
                                     ^
In file included from frameworks/base/tools/aapt/AaptAssets.cpp:5:
In file included from frameworks/base/tools/aapt/AaptAssets.h:10:
In file included from frameworks/base/include/utils/AssetManager.h:25:
frameworks/base/include/utils/KeyedVector.h:193:17: error: use of undeclared identifier 'indexOfKey'
    ssize_t i = indexOfKey(key);
                ^
                this->
frameworks/base/tools/aapt/AaptAssets.h:446:46: note: in instantiation of member function 'android::DefaultKeyedVector<android::String8, android::sp<AaptSymbols> >::valueFor' requested here
        sp<AaptSymbols> sym = mNestedSymbols.valueFor(name);
                                             ^
frameworks/base/include/utils/KeyedVector.h:66:29: note: must qualify identifier to find this declaration in dependent base class
            ssize_t         indexOfKey(const KEY& key) const;
                            ^
1 warning and 1 error generated.
make: *** [out/host/darwin-x86/obj/EXECUTABLES/aapt_intermediates/AaptAssets.o] Error 1

我刚开始在Android的,所以不要有任何线索,任何小的帮助也将不胜感激

Answer 1:

只是为了扩大对皮特的回答,万一真的有人想知道:

该indexOfKey在DefaultKeyVector的父类,KeyedVector定义。 对于类模板,函数调用期间编译时未在运行时解决。 错误发生,因为在该点indexOfKey被调用时,编译器将不知道该模板的功能可能会被定位。 这是基础和派生类什么样子:

template <typename KEY, typename VALUE>
class KeyedVector
{
...
    ssize_t indexOfKey(const KEY& key) const;
...


template <typename KEY, typename VALUE>
class DefaultKeyedVector : public KeyedVector<KEY, VALUE>
{
...

而问题的电话:

template<typename KEY, typename VALUE> inline
const VALUE& DefaultKeyedVector<KEY,VALUE>::valueFor(const KEY& key) const {
    ssize_t i = indexOfKey(key);
...

最有可能的,使用旧的MacOS的SDK编译器(或其他编译器)的作品,因为它很可能只是猜测,而不是失败在一些基础类的函数存在。 然而,这是不规范的行为。

更多信息从这个铛进入 ,并从C ++ FAQ 。



Answer 2:

我终于想通了这个问题。 有一个在框架/碱的源代码的错误/包含/ utils的/ KeyedVector.h:193

一些成员函数要求范围解析运算符“这 - >”的基础上MAC OS X狮子的机器人源与xcode中的4.3.x和gcc版本4.9.2(Debian的4.9.2-10)。 如果没有范围解析操作符编译器将无法识别功能的存在。

开放框架/碱/包含/ utils的/ KeyedVector.h

从更改行193:

ssize_t i = indexOfKey(key);

ssize_t i = this->indexOfKey(key);

和Android 4.0.1编译。



Answer 3:

要建立在新版本的GCC ICS,您必须应用这些补丁:

https://groups.google.com/forum/#!msg/android-building/2EwtWQTqjdI/fbZlzXErscwJ



Answer 4:

用make -j在Mac OS X 10.8.4浏览器浏览器建设为Android 4.0.3,当我面对这个问题几次。 我没有任何问题与Android 4.2.1。 所以我的解决办法是

make CC=gcc CXX=g++ -j Browser

希望能帮助到你



文章来源: Building android source code