Ubuntu16.04编译android5.1

本文档详细记录了在Ubuntu上搭建Android编译环境及编译过程中遇到的各种问题,包括:JDK版本问题、编译依赖、错误类型如 unsupported reloc 43、ValueError、Traceback、recipe commences before first target 等,并提供了相应的解决方法,如修改编译配置、切换JDK版本、更新依赖库等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

参考1
参考2

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

参考1

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:

  1. You can add “@hide” javadoc comments to the methods, etc. listed in the

    errors above.

  2. 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

Ubuntu 16.04中升级gcc,你可以按照以下步骤进行操作。首先,添加编译链的PPA源,可以使用以下命令: sudo add-apt-repository ppa:ubuntu-toolchain-r/test 然后,更新软件源列表: sudo apt update 接下来,安装gcc-9和g++-9: sudo apt-get install gcc-9 g++-9 通过执行以上步骤,你可以在Ubuntu 16.04中升级gcc到版本9。 如果你目前正在使用Ubuntu 14.04,你无法直接体验新版本的gcc。一种解决办法是升级到较新的Ubuntu版本,如Ubuntu 16.04,然后按照上述步骤进行升级。另一种解决办法是安装较新版本的gcc,如gcc-4.9、gcc-5或gcc-6。你可以使用以下命令安装这些版本: sudo apt-get install gcc-4.9 g++-4.9 sudo apt-get install gcc-5 g++-5 sudo apt-get install gcc-6 g++-6 这样,你就可以在Ubuntu 14.04中安装较新的gcc版本。请注意,gcc-5实际上是5.3.0版本,没有5.15.2版本可供选择。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Ubuntu16.04升级gcc、g++版本](https://blog.csdn.net/weixin_45747535/article/details/125902856)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Ubuntu升级gcc版本](https://blog.csdn.net/gatieme/article/details/52871438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wang 恒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值