成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Android源代碼編譯原理與有什么前期準(zhǔn)備

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)Android源代碼編譯原理與有什么前期準(zhǔn)備,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

10年積累的網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有柏鄉(xiāng)免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

大家都知道,Android是開源的,可以在Android Open Source Project(點擊打開鏈接)下載。下載的流程與方法,可以訪問上述網(wǎng)頁查看詳細(xì)說明。

首先,我們應(yīng)該對Android的編譯原理有所了解。普通的Android應(yīng)用開發(fā),多數(shù)是在eclipse中開發(fā)的。在eclipse中,Android Project是通過安裝在eclipse中ADT插件進(jìn)行編譯的。這種編譯方式與在Liunx系統(tǒng)下的編譯方式是不同的。

在Liunx系統(tǒng)下,Android源代碼的編譯方式是通過make file(Android.mk)來實現(xiàn)的。也就是說,在編譯過程中,編譯命令會查找每個文件夾中是否存在Android.mk文件,如果存在,那么系統(tǒng)就會按照Android.mk文件中的編譯規(guī)則進(jìn)行編譯。

「jdk版本不符合」

我們都知道,Android編譯的命令是make -j*(*代表CPU的核發(fā)數(shù))。執(zhí)行make -j*后,執(zhí)行的文件就是build/core/main.mk。在開始編譯之前,會檢測系統(tǒng)是否符合編譯需要的要求。例如檢測系統(tǒng)是否安裝jdk以及jdk的版本等。

不同的Android版本對jdk的版本要求也不盡相同。本文將以android-4.1.2_r1為例進(jìn)行講解。

Android 4.1規(guī)定的jdk版本是1.6,也就是說,如果Linux系統(tǒng)安裝的jdk版本不是1.6的話,編譯將無法繼續(xù)進(jìn)行。

在終端在會出現(xiàn)以下提示信息:

You are attempting to build with the incorrect version

Your version is:  1.7.0_21.
The correct version is: Java SE 1.6.

解決這個問題的方法就是修改Android源代碼中的文件,將其規(guī)定的版本號改為本機中已安裝的jdk的版本號即可。

修改文件:

android-4.1.2_r1/build/core/main.mk

# Check for the correct version of java
java_version := $(shell java -version 2>&1 | head -n 1 | grep '^java .*[ "]1\.6[\. "$$]')
ifneq ($(shell java -version 2>&1 | grep -i openjdk),)
java_version :=
endif
ifeq ($(strip $(java_version)),)
$(info ************************************************************)
$(info You are attempting to build with the incorrect version)
$(info of java.)
$(info $(space))
$(info Your version is: $(shell java -version 2>&1 | head -n 1).)
$(info The correct version is: Java SE 1.6.)
$(info $(space))
$(info Please follow the machine setup instructions at)
$(info $(space)$(space)$(space)$(space)https://source.android.com/source/download.html)
$(info ************************************************************)
$(error stop)
endif

如果本機中安裝的jdk版本為1.7,那么只需將

java_version := $(shell java -version 2>&1 | head -n 1 | grep '^java .*[ "]1\.6[\. "$$]')

修改為

java_version := $(shell java -version 2>&1 | head -n 1 | grep '^java .*[ "]1\.7[\. "$$]')

即可。

同樣,javac的版本號也需要修改。

# Check for the correct version of javac
javac_version := $(shell javac -version 2>&1 | head -n 1 | grep '[ "]1\.6[\. "$$]')
ifeq ($(strip $(javac_version)),)
$(info ************************************************************)
$(info You are attempting to build with the incorrect version)
$(info of javac.)
$(info $(space))
$(info Your version is: $(shell javac -version 2>&1 | head -n 1).)
$(info The correct version is: 1.6.)
$(info $(space))
$(info Please follow the machine setup instructions at)
$(info $(space)$(space)$(space)$(space)https://source.android.com/source/download.html)
$(info ************************************************************)
$(error stop)
endif


javac_version := $(shell javac -version 2>&1 | head -n 1 | grep '[ "]1\.6[\. "$$]')

修改為

javac_version := $(shell javac -version 2>&1 | head -n 1 | grep '[ "]1\.7[\. "$$]')

「編譯中常見問題」

解決了jdk版本的問題后,隨著編譯的進(jìn)行可能會出現(xiàn)其他錯誤(主要為command not found),導(dǎo)致編譯中止。

如果在沒有修改過的源代碼中編譯,出現(xiàn)錯誤的話,絕大部分是由于系統(tǒng)中缺少必要的軟件造成的。

經(jīng)過本人親身實踐,編譯中會用到下列軟件:

 bison
 zlib1g-dev
 flex
 libncurses-dev
 gperf
 xsltproc
 build-essential
 g++
 g++-multilib
 ia32-libs
 libxml2-utils

解決辦法就是在編譯之前,提前安裝上述軟件,安裝命令如下:

sudo apt-get install bison
sudo apt-get install zlib1g-dev
sudo apt-get install flex
sudo apt-get install libncurses-dev
sudo apt-get install gperf
sudo apt-get install xsltproc
sudo apt-get install build-essential
sudo apt-get install g++
sudo apt-get install g++-multilib
sudo apt-get install ia32-libs
sudo apt-get install libxml2-utils

安裝完上述軟件后,再重新進(jìn)行編譯,就可以正常編譯了。普通的4核電腦整個編譯過程大約會需要4個小時。

「out文件夾」

編譯成功后,會在android-4.1.2_r1目錄下生成一個out文件夾。out里面的文件就是編譯后的產(chǎn)物。

下面對out文件夾的構(gòu)成做簡單的講解。

out下有兩個文件夾

 host

 target

其中,target文件夾中有我們需要的東西。

target下又有兩個文件夾

common

product

common 文件夾中用的最多的就是取得編譯生成的java libraries。因為在sdk中所有標(biāo)記為@hide的方法或變量都是無法訪問的,所以當(dāng)你需要訪問他們的時候,就必須使用下面文件夾內(nèi)的library。

out/target/common/obj/JAVA_LIBRARIES

product文件夾,顧名思義,就是編譯后最終生成的文件的存放位置。

標(biāo)準(zhǔn)Android源代碼中,生成的文件夾叫g(shù)eneric。廠商定制之后,這個文件夾的名字會發(fā)生變化,會變成手機的型號。

在generic文件夾內(nèi),有兩個地方是比較重要的。

一個是system.img

這是編譯生成的system文件夾的鏡像文件,制作ROM必不可少的文件。

另一個就是system文件夾

這里面有我們需要的apk文件,存放在system/app文件夾下。

「odex與dex」

需要說明的是,默認(rèn)情況下sytem/app文件夾下的apk包括兩個文件:

Launcher2.apk

Launcher2.odex

這是因為編譯過程中沒有將classes.jar與資源文件打在同一個文件中(classes.dex),而是單獨生成了odex文件。

關(guān)閉odex化的方法是

修改android-4.1.2_r1/build/core/package.mk

ifneq (true,$(WITH_DEXPREOPT))
LOCAL_DEX_PREOPT :=
else
ifeq (,$(TARGET_BUILD_APPS))
ifneq (,$(LOCAL_SRC_FILES))
ifndef LOCAL_DEX_PREOPT
#feizl mod start
#LOCAL_DEX_PREOPT := true
LOCAL_DEX_PREOPT := false
#feizl mod end
endif
endif
endif
endif
ifeq (false,$(LOCAL_DEX_PREOPT))
LOCAL_DEX_PREOPT :=
endif

LOCAL_DEX_PREOPT := true

修改為

LOCAL_DEX_PREOPT := false

同樣,如果想讓framework也不生成odex文件的話,就可以修改以下文件

android-4.1.2_r1/build/core/java_library.mk

ifneq (true,$(WITH_DEXPREOPT))
LOCAL_DEX_PREOPT :=
else
ifeq (,$(TARGET_BUILD_APPS))
ifndef LOCAL_DEX_PREOPT
#feizl mod start
#LOCAL_DEX_PREOPT := true
LOCAL_DEX_PREOPT := false
#feizl mod end
endif
endif
endif
ifeq (false,$(LOCAL_DEX_PREOPT))
LOCAL_DEX_PREOPT :=
endif

LOCAL_DEX_PREOPT := true

修改為

LOCAL_DEX_PREOPT := false

修改之后,重新執(zhí)行編譯命令,但要注意提前刪除system/app和system/framework下的文件。

在編譯完成后,上述文件夾內(nèi)的文件就是classes與資源文件合二為一了。

上述就是小編為大家分享的Android源代碼編譯原理與有什么前期準(zhǔn)備了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站欄目:Android源代碼編譯原理與有什么前期準(zhǔn)備
標(biāo)題來源:http://jinyejixie.com/article44/pgeihe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)移動網(wǎng)站建設(shè)、、網(wǎng)站排名、軟件開發(fā)、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
岳阳市| 房山区| 大冶市| 镇坪县| 水城县| 白沙| 弥勒县| 娱乐| 栾城县| 霍城县| 宜州市| 永新县| 黄陵县| 登封市| 玛沁县| 鹰潭市| 饶阳县| 霍邱县| 吴堡县| 盘锦市| 会同县| 罗甸县| 五峰| 平陆县| 定远县| 潜江市| 长寿区| 布拖县| 思茅市| 宜兰市| 大厂| 乌兰察布市| 马山县| 德庆县| 普陀区| 邵东县| 章丘市| 东至县| 海原县| 台山市| 山西省|