硬件平臺:rk3128
android版本:android 6.0
編譯環境:ubuntu 16.04
由於我的環境是android 7.0的編譯環境,今天編譯android 6.0時遇到一些問題,故記錄在此。
1、JDK切換
android 7.0 需要的jdk版本爲1.8,而android 6.0需要jdk 1.7,所以首先需要安裝jdk1.7,然後就可以在1.7跟1.8之間切換,但是ubuntu 16.04的源已經將jdk1.7移除了,網上百度了一些方法比如點擊打開鏈接 http://www.cnblogs.com/bluestorm/p/5677625.html,需要手動添加倉庫,試了一下沒有成功,依然無法安裝,索性換個思路,換源試一下,於是網上找了阿里的源。
然後:
備份源:sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
替換:sudo vim /etc/apt/sources.list 替換成阿里雲的源
替換完成後,運行:
sudo apt-get update
sudo apt-get install openjdk-7-jdk
這時又碰到一個問題,會卡在waiting for headers,繼續網上找方法:
根據http://blog.csdn.net/zc123456zzc/article/details/47153913的方法:
rm /var/lib/apt/lists/*
rm /var/lib/apt/lists/partial/*
安裝完成。
然後可以用
sudo update-alternatives --config java
sudo update-alternatives --config javac
來切換java版本,用java -version來查看是否切換成功:
wintec@wintec:~/work$ java -version
java version "1.7.0_95"
OpenJDK Runtime Environment (IcedTea 2.6.4) (7u95-2.6.4-3)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)
2、編譯
編到五十分鐘的時候報很多以下錯誤:
error unsupported reloc 42
繼續網上查,http://www.cnblogs.com/blowing-in-the-wind/p/6518076.html,這裏說了三種方法,前兩種方法既然這位博主都沒有成功,我也就不用試了,直接上第三種:
cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin/ld
但是我的版本有些不同,在prebuilts/gcc/linux-x86/host/目錄下有兩個類似文件夾
x86_64-linux-glibc2.11-4.8/
x86_64-linux-glibc2.15-4.8/
一個一個試吧,先
cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.8/x86_64-linux/bin/ld
編譯,依然報錯,然後
cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/x86_64-linux/bin/ld
編譯通過。
20171124更新:
昨天下午把6.0的工程clean掉重新編譯,沒想到竟然編譯不過,沒clean之前直接make是能通過的,真是太神奇了,報如下錯誤:
make: *** No rule to make target 'out/target/common/obj/JAVA_LIBRARIES/sap-api-java-static_intermediates/classes.jack',
needed by 'out/target/common/obj/APPS/Bluetooth_intermediates/with-local/classes.dex'. Stop.
make: *** Waiting for unfinished jobs....
剛好又改過BLUETOOTH相關的宏,難道是改出問題了?查了半天一無所獲,今天早上來繼續查,首先看到packages\apps\Bluetooth\Android.mk中有這麼一條:
LOCAL_STATIC_JAVA_LIBRARIES := com.android.vcard bluetooth.mapsapi sap-api-java-static android-support-v4
可是找了半天也沒找到sap-api-java-static這個庫在哪裏,幸好百度到了這麼一條編譯log:
Protoc: out/target/common/obj/JAVA_LIBRARIES/sap-api-java-static_intermediates/src/proto/Proto.stamp
<= hardware/ril/librilutils/proto/sap-api.proto
到這才真相大白,原來這個庫是在ril中編譯的,之前調試3G模塊時替換了ril庫,沒有clean,導致了這個問題,關鍵是已經很久了,真是不好查啊。
沒想到bluetooth用到的庫竟然在ril中生成,也是非常無語。
解決辦法:
把ril庫替換回系統默認。
總結:其實這個問題遠沒有如此麻煩,只要隨便搜索一下之前new的編譯log,就能很快找到原因,主要是一開始沒想到,
又剛改過bluetooth,方向就錯了,故記錄在此,以此爲戒。