1. 程式人生 > >利用docker編譯Android原始碼

利用docker編譯Android原始碼

本文描述瞭如何在一個docker上搭建Android編譯環境。

Docker

Docker是一個計算機作業系統的容器,利用主機核心,搭建獨立的檔案系統,讓使用者程式執行在一個與宿主機檔案系統無關的獨立環境中。 Docker支援很多優雅的特性,方便專案的程式開發、除錯和執行。在大資料雲端計算等領域具有不可比擬的優勢,就連jvm就望而生畏。 Docker技術來源於Linux LXC技術,可以說是LXC技術的包裝、升級和商品化。現在,也支援Windows Docker。

Docker有很多用途:

  • 編譯Android,你不用因為主機環境的變化或者系統的升級而煩惱。
  • 學習分散式開發,一臺計算機就能模擬分散式。
  • 搭建代理伺服器,每一個業務邏輯都是分開的,比如搭建一個內部小型網站。
  • 模擬主機作業,先在docker上處理,防止破壞主機環境。

學習Docker時,有問題和需求,第一時間訪問Docker官網,善於從英文文件中檢索資訊。
初學者可能對images和container管理、Dockerfile的CMD和ENTRYPOINT、網路配置、跨系統版本搭建Docker等感到困惑。
簡單的提示一下:
images:靜態存在的映象,可以理解是一個靜態的檔案系統映象,執行它就能得到一個container。
container:一個容器,可以理解是動態的檔案系統映象,我們可以執行它,在其上面作業,停止並刪除它。
CMD:docker run最後一項就是CMD,在Dockerfile中定義CMD會被命令列中的CMD覆蓋。
ENTRYPOINT:docker run後,docker容器的入口點,每次container執行時都會被執行,而且會覆蓋命令列的CMD。
網路配置:Docker預設建立一個bridge,給定一個橋地址,沒開闢一個container,自動分配一個在橋ip段的ip。
自定義網路配置:Docker的網路其實是linux的ip

命令建立的虛擬網路,具體查詢關鍵字linux ip命令maclanvlanvethbridge等。
跨系統版本搭建Docker:比如在ubuntu16.04上搭建一個ubuntu14.04的dokcer,可能會產生核心不相容的情況,比如,如果我們在docker執行service命令將失敗,因為ubuntu16.04核心中使用systemd而不是service管理守護程序。

以上內容,幾乎都能從Docker官網得到答案。

Android Building Docker

這裡採用Dockerfile的方式建立docker映象。

例子:在ubuntu16.04中搭建Android6.0的編譯環境。

  1 FROM ubuntu:xenial
  2 
  3 MAINTAINER jaren 
[email protected]
4 5 ADD sources.list /etc/apt/sources.list #這裡更新一個源,會快很多。 6 RUN apt-get update 7 # 在ubuntu中安裝openjdk7需要單獨新增倉庫。 8 RUN apt-get install -y software-properties-common 9 RUN add-apt-repository ppa:openjdk-r/ppa 10 RUN apt-get update 11 RUN apt-get install -y openjdk-7-jdk 12 # 安裝Android編譯的依賴包,檢視Android官網可以得到。 13 RUN apt-get install -y git-core gnupg flex bison gperf build-essential \ 14 zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \ 15 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \ 16 libgl1-mesa-dev libxml2-utils xsltproc unzip 17 # ubuntu16.04中,預設不包含Python2.7 18 RUN apt-get install -y python2.7 19 20 RUN ln -sf /usr/bin/python2.7 /usr/bin/python 21 # ubuntu16.04中預設不包含bc(一種程式語言) 22 RUN apt-get install -y bc 23 ENV USER=root

例子:在ubuntu16.04中建立ubuntu14.04的docker並編譯Android6.0。
這個跟上一個例子是類似的,只是我們可以簡單安裝openjdk7。並且庫依賴也是完整的,省去了很多麻煩。

  1 FROM ubuntu:14.04
  2 MAINTAINER Jaren <[email protected]>
  3 
  4 # Set to 32bit
  5 #RUN dpkg --add-architecture i386
  6 
  7 ADD sources.list /etc/apt/sources.list
  8 
  9 ADD setup.sh /setup/setup.sh
 10 RUN bash -x /setup/setup.sh
 11 
 12 ENV USER=root

setup.sh

  3 apt-get update || true
  4 
  5 apt-get install -y openjdk-7-jdk
  6 
  7 apt-get -y install git-core gnupg flex bison gperf build-essential \
  8   zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
  9   lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \
 10   libgl1-mesa-dev libxml2-utils xsltproc unzip python-networkx

例子:搭建ubuntu14.04的docker編譯Android7. 此文建立之時,官網說明,建議採用ubuntu14.04編譯,所以,參考官網能實現編譯需求。

參考文獻

http://nextstart.online/2017/01/24/docker-android-build/
http://nextstart.online/2017/01/24/docker-android-build/

相關推薦

利用docker編譯Android原始碼

本文描述瞭如何在一個docker上搭建Android編譯環境。DockerDocker是一個計算機作業系統的容器,利用主機核心,搭建獨立的檔案系統,讓使用者程式執行在一個與宿主機檔案系統無關的獨立環境中。 Docker支援很多優雅的特性,方便專案的程式開發、除錯和執行。在大資

使用docker搭建android原始碼編譯環境

說明  由於工作原因要對android原始碼進行編譯,用於修改底層驅動,對系統進行定製。但是編譯過程中要使用特定ubuntu版本和gcc版本,所以會比較麻煩。當時第一反映是安裝VMware虛擬機器,裝一個指定版本然後將原始碼拷貝進去再編譯,該方法是可行的。後來

利用ccache加快android原始碼和linux核心編譯速度的方法

一、android原始碼編譯加速 當你刪掉out/target目錄或者使用make clean清空輸出重新編譯原始碼的時候,編譯時間通常都很漫長。其實這個問題很容易解決,Android官方為我們帶來了解決方案–ccache編譯器快取。官方這麼講:You can optio

MacOS X 編譯Android原始碼

MacOS X 編譯Android原始碼 本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 由於在工作中遇到了很多關於android內部實現的問題,雖然後面都解決了,有些是看了原始碼實現,有些原始碼看不了只能去google,百度。這就導致了對於很多的問題其實是知其然不知其

Android系統移植與平臺開發(五)- 編譯Android原始碼

2.3編譯Android原始碼 Android原始碼體積非常龐大,由Dalvik虛擬機器、Linux核心、編譯系統、框架程式碼、Android定製C庫、測試套件、系統應用程式等部分組成,在編譯Android原始碼之前,必須要先掌握Android原始碼的組成。 2.3.1An

編譯android原始碼7---android 原始碼目錄結構

Android  |-- Makefile (全域性的Makefile) |-- bionic                        (Android 標準C執行支援庫) |-- bootable                (Android核心載入器

Mac編譯android原始碼的坑

Mac編譯android原始碼 因為專案需要在程式碼線上編譯app,想在mac上直接編譯,省時省力。不過,配置環境過程中遇到不少坑,現在逐一記錄下來。 主要有以下幾點: andr

編譯Android原始碼過程中遇到的錯誤

編譯環境:(1)ubuntu15.04(2)jdk1.6 JDK環境設定:     export JAVA_HOME=/home/zr/jdk1.6.0_45        export JRE_HOME=${JAVA_HOME}/jre       export CL

Linux下編譯Android原始碼問題彙總

前言         本人最近在研究Android原始碼編譯,現將編譯過程中遇到問題彙總於此。 環境         系統:CentOS 7 x86_64         源    :中科大映象源(詳見這裡) 問題彙總 (1)Increase Java heap s

Mac 10.12 編譯 Android 原始碼

Android 原始碼系列文章: 環境準備 這裡只講 Mac 10.12 的環境配置, 其他的我沒有嘗試過, 不好描述 我們需要的編譯的是 Android6.0, 所以我們需要 Xcode , Command L

在Mac OS 10.12 編譯Android原始碼:錯誤小結

在Mac OS 10.12 編譯Android原始碼 錯誤小結 記錄自己遇到的一些問題 1、在Terminal跳轉到映象目錄的命令是 cd /Volumes/映象名稱 即建立的磁碟映象是在根目錄下的Volumes資料夾 2、在通過ma

Mac上下載及編譯android原始碼

參考:     https://blog.csdn.net/u010963246/article/details/71480684     https://blog.csdn.net/qq_25333681/article/details/79838325     https

ubuntu16.04 編譯android 原始碼出現的錯誤

1、openjdk 版本不對 解決:2、/bin/bash: prebuilts/misc/linux-x86/bison/bison: 沒有那個檔案或目錄 build/core/binary.mk:609: recipe for target 'out/host/linu

如何單獨編譯Android原始碼中的模組

      第一次下載好Android原始碼工程後,我們通常是在Android原始碼工程目錄下執行make命令,經過漫長的等待之後,就可以得到Android系統映象system.img了。以後如果我們修改了Android原始碼中的某個模組或者在Android原始碼工程新增一個

多使用者同時在一臺伺服器編譯Android原始碼錯誤——Communication error with Jack server (77)

錯誤: FAILED: /bin/bash -c "(prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-s

單獨編譯Android原始碼中的模組

第一次下載好Android原始碼工程後,我們通常是在Android原始碼工程目錄下執行make命令,經過漫長的等待之後,就可以得到Android系統映象system.img了。以後如果我們修改了Android原始碼中的某個模組或者在Android原始碼工程新增一個自己的模組

ubuntu12.04 64bit 編譯android原始碼時遇到的問題"make: *** [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates"

ubuntu12.04 64bit 編譯android原始碼時出現如下錯誤:         host Executable: cmu2nuance (out/host/linux-x86/obj/EXECUTABLES/cmu2nuance_intermediates/

在Ubuntu16.04上下載並編譯Android原始碼

Android原始碼位於Google的Git程式碼庫中,由於Android原始碼工程過於複雜龐大,所以Google以Git為基礎用Python指令碼,寫了一個管理工具Repo。 1.安裝Repo 在安裝Repo之前,假定已經安裝好了git。 mkdir ~

Ubuntu(64位)編譯Android原始碼常見錯誤解決辦法

錯誤: /usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o]

使用Openjdk7編譯android原始碼出現"Could not initialize NSS"錯誤的解決辦法

最近在編譯andrioid原始碼時遇到了如下奇葩的Error,一臉三角函式懵逼 o_O!! Exception in thread "main" java.security.ProviderExce