文章目录
- 1.环境搭建
- 2.编译源码
- 3.编译遇到的问题
- 3.1 error: unsupported reloc 43 类型错误
- 3.2 ValueError: substring not found 类型错误
- 3.3 Traceback (most recent call last):类型错误
- 3.4:*** recipe commences before first target. Stop.类型错误
- 3.5:error 5: Added public field android.Manifest.permission.BACKUP类型错误
- 3.5:ImportError: No module named PIL 错误
- 3.6:vendor/qcom/proprietary/mm-still/ipl/Android.mk:16 recipe commences before first target。 停止
1.环境搭建
1.1 安装 openjdk-7-jdk
sudo apt-get install openjdk-7-jre
或者
sudo apt-get install openjdk-7-jdk
Ubuntu16.04的安装源已经默认没有openjdk7了,所以要自己手动添加仓库,如下:
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-7-jdk
1.2 查看jdk版本
java -version
1.3 安装依赖文件
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 dpkg-dev libsdl1.2-dev libesd0-dev git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4
1.4 切换多版本jdk(选做)
sudo update-alternatives --config javap
sudo update-alternatives --config java
sudo update-alternatives --config javac
sudo update-alternatives --config javadoc
2.编译源码
2.1 进入源码根目录
source build/envsetup.sh
lunch (选择要编译的版本)
make -jn (n代表cpu核数)
3.编译遇到的问题
3.1 error: unsupported reloc 43 类型错误
libnativehelper/JniInvocation.cpp:45: error: unsupported reloc 43
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43
clang: error: linker command failed with exit code 1 (use -v to see invocation)
host C++: libc++ <= external/libcxx/src/algorithm.cpp
host C++: libc++ <= external/libcxx/src/bind.cpp
build/core/host_shared_library_internal.mk:44: recipe for target ‘out/host/linux-x86/obj32/lib/libnativehelper.so’ failed
make: *** [out/host/linux-x86/obj32/lib/libnativehelper.so] Error 1
make: *** 正在等待未完成的任务…
解决方法:
1:
cd <source_android>/art/build/
vim Android.common_build.mk //修改第119行
修改前:
# Host.
ART_HOST_CLANG := false
ifneq ($(WITHOUT_HOST_CLANG),true)
# By default, host builds use clang for better warnings.
ART_HOST_CLANG := true
endif
修改后:
# Host.
ART_HOST_CLANG := false
ifneq ($(WITHOUT_HOST_CLANG),false)
# By default, host builds use clang for better warnings.
ART_HOST_CLANG := true
endif
2:
cp/usr/bin/ld.gold <source_android>/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin/ld
3.2 ValueError: substring not found 类型错误
File “…/base/android/jni_generator/jni_generator.py”, line 1527, in
sys.exit(main(sys.argv))
File “…/base/android/jni_generator/jni_generator.py”, line 1518, in main
GenerateJNIHeader(input_file, output_file, options)
File “…/base/android/jni_generator/jni_generator.py”, line 1401, in GenerateJNIHeader
jni_from_javap = JNIFromJavaP.CreateFromClass(input_file, options)
File “…/base/android/jni_generator/jni_generator.py”, line 652, in CreateFromClass
jni_from_javap = JNIFromJavaP(stdout.split(‘\n’), options)
File “…/base/android/jni_generator/jni_generator.py”, line 600, in init
signature=JniParams.ParseJavaPSignature(contents[lineno + 1]))]
File “…/base/android/jni_generator/jni_generator.py”, line 212, in ParseJavaPSignature
return ‘“%s”’ % signature_line[signature_line.index(prefix) + len(prefix):]
ValueError: substring not found
external/chromium_org/content/java_set_jni_headers.target.linux-arm.mk:24: recipe for target ‘out/target/product/rk3288/obj/GYP/shared_intermediates/content/jni/HashSet_jni.h’ failed
make: *** [out/target/product/rk3288/obj/GYP/shared_intermediates/content/jni/HashSet_jni.h] Error 1
make: *** Waiting for unfinished jobs…
Traceback (most recent call last):
File “…/base/android/jni_generator/jni_generator.py”, line 1527, in
sys.exit(main(sys.argv))
File “…/base/android/jni_generator/jni_generator.py”, line 1518, in main
GenerateJNIHeader(input_file, output_file, options)
File “…/base/android/jni_generator/jni_generator.py”, line 1401, in GenerateJNIHeader
jni_from_javap = JNIFromJavaP.CreateFromClass(input_file, options)
File “…/base/android/jni_generator/jni_generator.py”, line 652, in CreateFromClass
jni_from_javap = JNIFromJavaP(stdout.split(‘\n’), options)
File “…/base/android/jni_generator/jni_generator.py”, line 600, in init
signature=JniParams.ParseJavaPSignature(contents[lineno + 1]))]
File “…/base/android/jni_generator/jni_generator.py”, line 212, in ParseJavaPSignature
return ‘“%s”’ % signature_line[signature_line.index(prefix) + len(prefix):]
ValueError: substring not found
external/chromium_org/content/motionevent_jni_headers.target.linux-arm.mk:24: recipe for target ‘out/target/product/rk3288/obj/GYP/shared_intermediates/content/jni/MotionEvent_jni.h’ failed
make: *** [out/target/product/rk3288/obj/GYP/shared_intermediates/content/jni/MotionEvent_jni.h] Error
解决方法:
该错误由于安装多版本jdk导致,切换jdk版本
sudo update-alternatives --config java
sudo update-alternatives --config javac
sudo update-alternatives --config javadoc
3.3 Traceback (most recent call last):类型错误
Traceback (most recent call last):
File “LINUX/android/vendor/qcom/proprietary/qrdplus/Extension/apps/BootAnimation/logo_gen.py”, line 158, in
MakeLogoImage(GetPNGFile(), “splash.img”)
File “LINUX/android/vendor/qcom/proprietary/qrdplus/Extension/apps/BootAnimation/logo_gen.py”, line 133, in MakeLogoImage
file.write(GetImageBody(img))
File “LINUX/android/vendor/qcom/proprietary/qrdplus/Extension/apps/BootAnimation/logo_gen.py”, line 122, in GetImageBody
return Image.merge(“RGB”,(b,g,r)).tostring()
File “/home/adr/.local/lib/python2.7/site-packages/PIL/Image.py”, line 742, in tostring
raise NotImplementedError("tostring() has been removed. "
NotImplementedError: tostring() has been removed. Please call tobytes() instead.
解决办法:
可查看上面错误提示,
NotImplementedError: tostring() has been removed. Please call tobytes() instead.
用tobytes()替换tostring()即可。
3.4:*** recipe commences before first target. Stop.类型错误
vendor/qcom/proprietary/mm-still/ipl/Android.mk:16: *** recipe commences before first target. Stop.
解决方法:
打开 vendor/qcom/proprietary/mm-still/ipl/Android.mk: 发现原来是15行缺少换行符
将
-D__alignx/(x/)=__attribute__/(/(__aligned__/(x/)/)/) 改为
-D__alignx/(x/)=__attribute__/(/(__aligned__/(x/)/)/) /
3.5:error 5: Added public field android.Manifest.permission.BACKUP类型错误
Copying: out/target/common/obj/JAVA_LIBRARIES/mms-common_intermediates/emma_out/lib/classes-jarjar.jar
Compiling SDK Stubs: out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes.jar
out/target/common/obj/PACKAGING/public_api.txt:20: error 5: Added public field android.Manifest.permission.BACKUP
out/target/common/obj/PACKAGING/public_api.txt:82: error 5: Added public field android.Manifest.permission.INVOKE_CARRIER_SETUP
out/target/common/obj/PACKAGING/public_api.txt:106: error 5: Added public field android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE
out/target/common/obj/PACKAGING/public_api.txt:116: error 5: Added public field android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST
target Strip: libEGL (out/target/product/msm8909/obj/lib/libEGL.so)
You have tried to change the API from what has been previously approved.
To make these errors go away, you have two choices:
-
You can add “@hide” javadoc comments to the methods, etc. listed in the
errors above.
-
You can update current.txt by executing the following command:
make update-api
To submit the revised current.txt to the main Android repository,
you will need approval.
解决办法:
如错误提示所示:make update-api
3.5:ImportError: No module named PIL 错误
解决办法:pip install Pillow
3.6:vendor/qcom/proprietary/mm-still/ipl/Android.mk:16 recipe commences before first target。 停止
解决办法:
打开 vendor/qcom/proprietary/mm-still/ipl/Android.mk: 发现原来是15行缺少换行符
将 -D__alignx/(x/)=__attribute__/(/(__aligned__/(x/)/)/) 改为
-D__alignx/(x/)=__attribute__/(/(__aligned__/(x/)/)/) /
Ps:参考1