2016年8月22日 星期一

Ubuntu-16.04 下載及編譯android source

這幾天為了在Ubuntu-16.04 下載 android source 和編譯 android,查了很多網站也花很多時間,所以做個筆記記錄一下。
------------------------------------------------------------


更新套件庫資訊
sudo apt-get update

install git

sudo apt install git


Installing Repo 

mkdir ~/bin 
PATH=~/bin:$PATH

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo 
chmod a+x ~/bin/repo

下載android source
建立一個放source的目錄然後進去目錄下,名字可以自訂。

mkdir android
cd android

設定名字和信箱
 git config --global user.name "Your Name"
 git config --global user.email "you@example.com"

執行repo init更新URL的目錄資料,執行完會顯示很多的版本名稱。
repo init -u https://android.googlesource.com/platform/manifest

選要建立的版本
repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1

輸入repo sync就會開始下載android source了,檔案很大超過20GB,所以要等蠻久的。
repo sync

安裝好後還不能編譯,還需要安裝jdk和很多東西


先分別執行這兩行,將java套件放到套件來源,第一行是oracle版本,第二行是openjdk版本的java
sudo add-apt-repository ppa:webupd8team/java
sudo add-apt-repository ppa:openjdk-r/ppa

更新套件庫資訊
sudo apt-get update

搜尋oracle-java或openjdk
apt-cache search oracle-java

會列出很多版本
oracle-jdk7-installer - Oracle JDK7 Installer meta package
oracle-java7-installer - Oracle Java(TM) Development Kit (JDK) 7
oracle-java6-installer - Oracle Java(TM) Development Kit (JDK) 6
oracle-java8-installer - Oracle Java(TM) Development Kit (JDK) 8
oracle-java7-set-default - Set Oracle JDK 7 as default Java
oracle-java6-set-default - Set Oracle JDK 6 as default Java
oracle-java8-set-default - Set Oracle JDK 8 as default Java
oracle-java7-unlimited-jce-policy - Unlimited JCE Policy for Oracle Java 7
oracle-java8-unlimited-jce-policy - Unlimited JCE Policy for Oracle Java 8
oracle-java9-installer - Oracle Java(TM) Development Kit (JDK) 9
oracle-java9-set-default - Set Oracle JDK 9 as default Java
oracle-java9-unlimited-jce-policy - Unlimited JCE Policy for Oracle Java 9

要編譯android的話要選擇對應的jdk版本,
android_4.0是oracle-java6-installer - Oracle Java(TM) Development Kit (JDK) 6請輸入
sudo apt-get install oracle-java6-installer

android_6.0是OpenJDK 7 請輸入
sudo apt-get install openjdk-7-jdk

安裝好之後輸入 java -version 就可以看目前的java版本,如下。
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

如果想要換目前的java和javac版本可以輸入
sudo update-alternatives --config java

然後還需要安裝一些編譯工具,不然編譯的時候會有錯誤訊息,以下是從網路上找到的

-----------------------------------android 4.x--------------------------------------------------
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib

sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386

sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev

sudo apt-get install git-core gnupg flex bison gperf build-essential

sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib

sudo apt-get install libc6-dev-i386

sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev

sudo apt-get install lib32z-dev ccache

sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
----------------------------------------------------------------------------------------------------

-----------------------------android 6.x----------------------------------------------------------
sudo apt-get install git gnupg flex bison gperf build-essential

sudo apt-get install zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386

sudo apt-get install libgl1-mesa-dev g++-multilib mingw32 tofrodos

sudo apt-get install python-markdown libxml2-utils xsltproc zlib1g-dev:i386

sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
--------------------------------------------------------------------------------------------------------


再來...還沒結束
編譯 android 4.0 的話要把 make 套件降版本 改為3.81
從這裡可以下載 make-3.81.tar.bz2
http://ftp.gnu.org/gnu/make/

下載後解開它,然後cd make-3.81到目錄下再執行下面這幾行
sudo ./configure
sudo make
sudo make install

執行完後要 重新開一個終端機 才能確定是不是安裝成功
make -version

成功就會顯示
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-unknown-linux-gnu


編譯 android 6.0 的話要修改android source下的一個檔案,
因為直接編譯的時候有遇到錯誤訊息。

檔案是 android/art/build/Android.common_build.mk
在75行左右

ifneq ($(WITHOUT_HOST_CLANG),true)
改為
ifeq ($(WITHOUT_HOST_CLANG),false)

到這邊準備工作終於完成了,最後將你要編譯的app專案整個放到 packages/apps/ 底下
並在專案裡面建一個Android.mk檔,檔案內容輸入這幾行,或參考底下的網站。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Name of the APK to build
LOCAL_PACKAGE_NAME := LocalPackage
# Tell it to build an APK
include $(BUILD_PACKAGE)

存檔後離開,在終端機中目標指向source的目錄
make clean
cd ~/Android
 . build/envsetup.sh
注意前面有個".",執行上面這行後,編譯器才能使用mm || mmm指令
mm packages/apps/Music
make Music

接著就會開始編譯了。
如果編譯失敗的話可以把專案裡的R.java檔刪除再編譯試試看。

編譯成功後會顯示檔案放的位置
例如Android4編譯完就顯示
Install: out/target/product/generic/system/app/Music.apk
apk就在out/target/product/generic/system/app/底下。






以下是參考網站
----------------------------------------------------------------------------------------------------



Android 4.3源码的下载和编译环境的安装及编译:http://jingyan.baidu.com/article/c85b7a641200e0003bac95a3.html

Android源码下载及开发环境的搭建: http://sammor.iteye.com/blog/1337612

Ubuntu 16.04 64bit 编译 Android 4.4 源码: http://www.jianshu.com/p/2b2c723825a9

如何在 Ubuntu 14.04 中安裝 Oracle/Open JDK: http://www.team-bob.org/linux-%E5%A6%82%E4%BD%95%E5%9C%A8-ubuntu-14-04-%E4%B8%AD%E5%AE%89%E8%A3%9D-oracleopen-jdk/

How do I install openjdk 7 on Ubuntu 16.04? http://askubuntu.com/questions/761127/how-do-i-install-openjdk-7-on-ubuntu-16-04

在Ubuntu Server14.04上編譯Android6.0源碼: http://www.zendei.com/article/9949.html

Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程: http://www.zendei.com/article/9949.html
(上面這個有解決android6遇到編譯問題的方法)


-----------------------------------------------------------------------------------------------------------