1. 程式人生 > >ANDROID原始碼編譯開發總結

ANDROID原始碼編譯開發總結

 

說明:這篇文章是介紹如何開發Android原始碼,包括各平臺的原始碼而非僅僅Google釋放的原始碼,我採用的是MSM7267.


        前提不需要SDK,不需要ADT,通過整個工程的編譯都可以生成。為了在Eclipse中除錯原始碼如Phone、MMS、Contact……


        由於以前都沒接觸過Java、Eclipse、ADT... 這些,在網上看了N多的文章,就這篇詳細,所以貼出來共享,同時 加入了、


        自己在配置中 的TroubShooting。如果你是剛接觸Android, 那配置這些可能一時半會搞不定,要做好心理準備。


        官方配置網址:http://source.android.com/source/using-eclipse.html


帶著問題出發


1、Android的檔案系統結構是怎樣的,我們安裝的程式放在那裡?
編譯Android原始碼之後,在out/target/product/generic一些檔案:
ramdisk.img、system.img、userdata.img、 system、 data、root
其中, system.img是由 system打包壓縮得到的, userdata.img是由 data打包壓縮得到的。



ramdisk.img是模擬器的檔案系統,把ramdisk.img解壓出來可知道,ramdisk.img裡的檔案跟root資料夾的檔案基本一樣。
模擬器裝載ramdisk.img並解壓到記憶體,接著分別把system.img和userdata.img掛載到 ramdisk下的system和data目錄。我們編譯出來的應用程式就是放在system/app下的。使用者安裝的程式則是放在data/app下。


2、Android SDK和android原始碼能為我們提供什麼工具?
Android
SDK提供有很多工具,如adb,ddms,emulator,aapt等,並提供kernel-qemu、ramdisk.img、
system.img、userdata.img。因此,只要有android SDK,我們就可以在模擬器上把android跑起來。
Android原始碼可以編譯出android SDK、adb等工具、android檔案系統,以及ADT外掛,也就是說,我們可以從android原始碼編譯出所有android相關的東西。


3、 把Android源 碼”make”之後會生成許多工具和android檔案系統(system.img等),我們又可以使用“make
sdk”來生成android SDK,android
SDK也包括有工具和android檔案系統(system.img等),而原來安裝的時候我們也安裝了android
SDK,那麼我們在開發時應該使用那些工具和android檔案系統呢?
這個問題在後面回答。


4、官方推薦我們使用
eclipse+adt進入開發應用程式,我們的HelloActivity程式也是這裡開發的。當我們把Android原始碼/packages
/apps/下的工程匯入eclipse時,一般都會出現找不到包的錯誤。那麼我們怎樣修改、編譯、除錯android原始碼呢?Google又是用什麼工
具來開發android的?
這個問題在後面回答。


下面系統地講述Android開發環境建立以及開發工具的使用


一、Android SDK和eclipse的安裝以及android開發環境建立
Android工具鏈比較完善,需要外部的工具比較少。具體的安裝過程可參考官方文件或<<android模擬器在Ubuntu 8.10的安裝>>和<<android原始碼的編譯>>。

裡需要注意的是,用”make”來編譯Android源 碼時,我們可以使用JDK5或JDK6;用”make
sdk”來編譯時,會用到javadoc來生成文件,javadoc就必須使用JDK5的javadoc,否則編譯是通不過的。因此,我們可以把JDK5

和JDK6都裝上,然後只把javadoc和javadoc.1.gz指向JDK5相應的工具,其它工具還是用JDK6的。當然,我們可以只安裝JDK5
或只用JDK5的工具。具體操作可以參考<<android原始碼的編譯>>


二、使用eclipse來開發Android原始碼
這裡主要參考官方文件
https://sites.google.com/a/Android.com/opensource/using-eclipse


下面,從官方文件總結出具體怎樣用eclipse來開發Android原始碼


1、建立基本的Android開發環境
請參考官方文件或<<Android模擬器在Ubuntu 8.10的安裝>>


2、編譯Android原始碼
Android原始碼根目錄下通過make進行編譯,請注意一些配置,具體可參考<<android原始碼的編譯>>


3、把eclipse工程配置檔案複製到Android原始碼根目錄下
cp development/ide/eclipse/.classpath ./
chmod u+w .classpath # Make the copy writable
4、修改eclipse程式的配置
1)、增大eclipse記憶體設定
把eclipse.ini(在eclipse軟體的安裝目錄下)的3個值改為下面的值:
-Xms128m
-Xmx512m
-XX:MaxPermSize=256m
2)、把Android-formatting.xml和android.importorder匯入eclipse(可選)
Android-formatting.xml、.classpath和android.importorder都放在development/ide/eclipse/下
Android-formatting.xml用來配置eclipse編輯器的程式碼風格;android.importorder用來配置eclipse的import的順序和結構。
在window->preferences->java->Code style->Formatter中匯入Android-formatting.xml
在window->preferences->java->Code style->Organize Imports中匯入Android.importorder
3)、安裝anyedit外掛(可選)
在http://andrei.gmxhome.de/anyedit/下載並匯入eclipse中


5、把Android原始碼作為一個工程匯入eclipse
匯入前先檢查.classpath裡的檔案在Android原始碼中是否有相應的檔案(資料夾),否則也會破壞android原始碼(一般是多新增檔案/資料夾),.classpath裡多餘的路徑可刪除
新建Java Project(不是Android project,否則會破壞android原始碼),www.linuxidc.com選擇從已存在的工程匯入,工程名任意,完成。
匯入時,eclipse要build工程,比較慢。導完後,一般都沒有錯誤。
這裡也就回答了第4個問題



注:


1.新建java 工程步驟不對也會造成解析錯誤,我的eclipse在new java project時無 法選擇從已存在的工程匯入,所以採取下面的步驟,先建立再匯入 :


新建:New java project


      Project name 隨便填


     不使用default location,把Location指定成程式碼所在目錄,即


      uncheck  “use default location“,Location 選擇工程的根目錄(這個一定要選擇,否則 package列表會出現錯誤) ,點選 Finish,   要花一段時間開始build workspace。。。。。


匯入:File-> Import->select,General 選擇 Exiting projects into workspace,->Next 選擇原始碼的根目錄,Finish。


      在 eclipse的 package Explorer就會列出所有關聯的原始碼。


2.如果解析有錯誤就無法debug,我碰到的最大問題出在這裡,eclipse中的problem視窗老實有錯誤,下面是解決辦法


刪除.classpath的下面兩行


<classpathentry kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/google -common_intermediates/javalib.jar"/>
<classpathentry kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/gsf-client_intermediates/javalib.jar"/>
添 加


<classpathentry kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/android-common_intermediates/javalib.jar"/>


這時還提示 CalendarProvider和ContactProvider中EventLogTags有錯誤,再進行下面的修改:


1. 展開packages/providers/CalendarProvider/src
2. 展開包: com.android.providers.calendar
3. 右鍵點選包com.android.providers.calendar
4. 選擇 "new file"
5. 在對話方塊中選擇點選  "Advanced >>" 按鈕, 可以看到"Link to file in the file system" checkbox,
6. 勾選上 checkbox.  這時 "Browse..." 可用.
7.
點選 "Browse..." 按鈕,選擇EventLogTags.java
(e.g.,out/target/common/obj/APPS/CalendarProvider_intermediates/src/src/com/android/providers/calendar/EventLogTags.java)
8. 點選OK
9. 點選 Finish (in "New File")
 同樣的方式修改com.android.providers.contacts的問題


這樣eclipse解析整個原始碼就只有warning了 。



6、eclipse上除錯Android裡的程式。
為了不讓其它版本的Android工具和android檔案系統影響下面的編譯和除錯,需要從環境變數中去除android工具和android檔案系統的路徑:
vim ~/.bashrc
看看有沒有在PATH變數中加入Android工具和android檔案系統的路徑,如果加有,則註釋它。通過下面的方法,我們是不需要在.bashrc中新增android工具和android檔案系統的路徑的
執行:
cd Android原始碼目錄



. build/envsetup.sh #設了環境變數之後,會多出mmm等命令,可以通過輸入help來檢視
lunch 1   # 把emulator等工具和ramdisk.img等檔案的路徑對應起來,就可以直接呼叫emulator等工具,也解決了第3個問題
emulator & 
ddms &
注意,先啟動ddms,再啟動eclipse,這樣eclipse中就不會說埠衝突
然後在eclipse中配置除錯型別和埠:
在Run->Debug
Configurations->Remote java
application上雙擊,然後,”Host:”設為localhost,”Port:”設為8800,”Connection
Type”為Standard(Socket Attach)
然後“Apply”
注意,上面設定的埠要與DDMS中設定的埠(檢視路
徑File -->Preference,選左側的Debugger,右側Port of Selected
Port)一致,ADT外掛使用了8700埠,因此上面設定的埠是8800。如果出現連不到VM的錯誤時,請注意,要先在DDMS中選中某一程序(對
應某一應用程式),才能在eclipse執行 Debug(在Java檢視的情況下,點選Right-top 位置的Open
Perspective,選擇debug,就進入debug 視窗)。
在eclipse除錯時,可以設斷點、單步除錯。估計google團隊也是這樣開發、除錯Android應用程式的


7、編譯Android原始碼
執行:
cd Android原始碼目錄
. build/envsetup.sh
那 麼就會多出mm/mmm等命令,mm/mmm用來編譯模組(包括C、C++、JAVA程式)。我們也可以直接在 Android 源
碼根目錄下執行“make
模組名”來編譯模組(模組名可以在.mk檔案中找到)。模組編譯後會在out/target/product/generic/system/app下生
成對應的.apk包。但是,用mm/mmm來編譯生成的.apk並不會打包到system.img中,需要我們手動通過make snod把
system資料夾打包為system.img,不過這就得重新執行模擬器了,這也是很麻煩了。對於我們開發者來說,我們可以這樣做:
1)把需要修改、除錯的模組(比如AlarmClock.apk)從out/target/product/generic/system/app下移除,然後make snod,這樣system.img就沒有AlarmClock.apk了。
2)執行模擬器,就看不到AlarmClock了
3)修改AlarmClock原始碼並用mm/mmm來編譯,在/system/app下生成AlarmClock.apk
4)通過adb把AlarmClock.apk安裝到Android檔案系統中,安裝方法有兩個:
    A、通過adb install xxx/AlarmClock.apk
    B、通過adb push xxx/AlarmClock.apk /data/app

種方法都可以把 AlarmClock安裝到/data/app下,Android會
自動把它顯示在主選單中(只要AlarmClock.apk中有一Activity包
含android.intent.category.LAUNCHER屬性),不過A方法在/data/app生成
com.android.alarmclock.apk,B方法則是 AlarmClock.apk。用A方法時,如果原來已經安裝了
AlarmClock,你還得先adb uninstall 它,而B方法則不用。推薦使用B方法。同樣,解除安裝可以通過adb
uninstall或adb shell rm xxx/xxx.apk來,也推薦用刪除的方法來解除安裝


8、如何開發自己的工程
前面主要是講如何在eclipse上開發Android原有的工程。對於自己的工程,我們可以這樣做:
1)新建一個Android工程。
建Android工程的好處就是可以充分使用ADT的功能。
2)匯入需要的包
3)編譯、執行、除錯
4)加入到Android原始碼相應的目錄下,應用程式一般放在packages/apps下
我們觀察packages/apps原有的工程就會發現,它們的程式碼是很“乾淨”的,沒有ADT自動生成的assets、bin等資料夾和R.java,當然也沒有.classpath和.project
5)編寫Makefile檔案xxx.mk
用Android原始碼提供的專用Makefile檔案xxx.mk,它的格式比較簡單
6)把剛加入的工程新增到eclipse的Android工程中
可以在eclipse中新增,也可以在.classpath中直接加入相應路徑。如在.classpath中新增:
<classpathentry kind="src" path="packages/apps/HelloWorld/src"/>
R.java

中編譯時自動生成的,其實所有工程用到“資源”的,都會用到R.java,這些R.java是放在out/target/common/R下。我們在原始碼

根目錄下make全部程式碼時,才會對每個模組生成R.java;在make時,已經編譯過並生成有.apk檔案的模組是不會被編譯的。因此,如果新加入的

工程已經(用mm/mmm)編譯過的話,我們先對該工程的“資源”改動一下(必須是改動“資源”,因為R.java是由“資源”生成的),再make,就

在會out/target/common/R對應的包路徑下看到你的工程的R.java。重新整理在eclipse的out/target/common/R
子工程,再在你用到R類的地方加入它的包,如
import com.Android.example.test.inside.helloworld.R;這樣就不會出現找不到R定義的錯誤。
其實,這個錯誤對我們是沒有任何影響的,因為我們是在shell中編譯。
7)在Android原始碼目錄下編譯剛加入的工程
可以用mm/mmm或make 模組名
8)用版本控制元件工具(svn或git或其它)把該工程上傳到伺服器


從官方文件和實踐可以總結出幾點:


1、可以使用eclipse來編輯JAVA程式、檢查錯誤(主要是類庫包含和語法方面),但是不能在eclipse上編譯執行Android 原始碼,還是得在shell中make(或mm或mmm)
2、Android原始碼資料夾裡提供有一些eclipse配置檔案,
.claapath:eclipse工程的配置檔案,方便我們直接把Android原始碼相應的檔案和JAVA包匯入工程
Android-formatting.xml和android.importorder:這個很重要,主要是用來規範我們的編碼風格,更容易使我們的程式碼風格一致
3、把Android原始碼作為一個工程匯入eclipse時,必須注意兩點
1)、新建的工程必須是java project,不能是Android project,否則會破壞android原始碼(一般是多新增檔案/資料夾)
2)、匯入前最好檢查.classpath裡的檔案在Android原始碼中是否有相應的檔案(資料夾),否則也會破壞android原始碼(一般是多新增檔案/資料夾)


總的來說:
1、用eclipse來編輯程式碼、檢查錯誤
2、不在eclipse上編譯、執行Android原始碼程式,只能在命令列通過make(或mm或mmm)編譯android原始碼
3、可以在eclipse上除錯Android原始碼程式(原理:eclipse通過ddms伺服器在emulator上進行除錯),並可以單步除錯、斷點除錯。
4、需要除錯的程式把它從/system/app/移除,安裝到data/app下,這樣更方便
5、安裝、解除安裝程式通過adb push 和adb shell rm更方便


**************************************************************************************************************


7、編譯Android原始碼的補充(編譯模組)


android中的一個應用程式可以單獨編譯,編譯後要重新生成system.img


在原始碼目錄下執行


  . build/envsetup.sh (.後面有空格)


就 多出一些命令:


   - croot:   Changes directory to the top of the tree.


  - m:       Makes from the top of the tree.


  - mm:      Builds all of the modules in the current directory.


   - mmm:     Builds all of the modules in the supplied directories.


  - cgrep:   Greps on all local C/C++ files.


  - jgrep:   Greps on all local Java files.


  - resgrep: Greps on all local res/*.xml files.


  - godir:   Go to the directory containing a file.


可以加—help檢視用法


我們可以使用mmm來編譯指定目錄的模組,如編譯聯絡人:


  mmm packages/apps/Contacts/


編完之後生成兩個檔案:


   out/target/product/generic/data/app/ContactsTests.apk


   out/target/product/generic/system/app/ Contacts.apk


可以使用make snod重新生成system.img


再執行模擬器


8 我的情況


當我在eclipse裡修改了原始碼時,用第7步mmm 



packages/apps/Contacts/ 然後再make snod 再emulator,emulator不能執行。




後來看android官方文件的說明,再每次修改後都



cd /path/to/android/root 



. build/envsetup.sh 

lunch 1    

make       

emulator

成功

相關推薦

ANDROID原始碼編譯開發總結

  說明:這篇文章是介紹如何開發Android原始碼,包括各平臺的原始碼而非僅僅Google釋放的原始碼,我採用的是MSM7267.         前提不需要SDK,不需要ADT,通過整個工程的編譯都可以生成。為了在Eclipse中除錯原始碼如Phone、MMS、Con

android原始碼編譯問題總結

1. View cannot be resolved to a variable檢視指定行 相關未匯入包2.Error:Security problem ,see jack server log多人同時

Android原始碼編譯學習問題總結

首先說明下自己的編譯環境 作業系統:Ubuntu 18.10 Android 原始碼版本:Android 8.1.0 kernel 版本: 3.18.0 AOSP 官網的教程 ======================================================

Android原始碼編譯——RK3128開發板基於Android5.1原始碼編譯小記

前言: 本次小記主要分為三段。前兩段相當於對原始碼編譯的一個回顧。本次小記主要第三段,記下了編譯中出現的幾個問題,以便日後需要。 1、編譯時編譯執行緒過多。導致編譯失敗。 2、編譯image沒問題打包OTA時出現錯誤。 一、編譯環境 1、硬體環境:(以

Android原始碼編譯——RK3128開發板多款紅外遙控器常用按鍵適配

最近拿到一塊Demo板,由於種種原因忘了入手遙控器。想到公司產品也是通過遙控操作,就抱著試一試的心態使用公司遙控器除錯。一路下來發現只有上下鍵可以使用。然而是相反的。以前沒做過底層,查閱相關資料後發現又有什麼RC5、RC6、NEC編碼,整個人都不好了。看了核心原

編譯Android原始碼與核心總結

這些天花了些時間自己下載了android原始碼來編譯,其中走了一些彎路導致耗了些時間,現在重新梳理總結下,讓有相同想法的人自己編譯的時候能少走些彎路,官方指導文件在http://source.android.com/source/initializing.html。 1、安

android studio ndk開發總結

javah 打印格式 tar link lis targe 簡單 執行 native 1、path環境變量 2、android studio關聯ndk local.properties ndk.dir gradle.properties andro

Android 原始碼編譯make的錯誤處理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android原始碼編譯之Nexus5真機編譯

轉載:https://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 在Android安全的研究工作中,我們時常要對Android進行改進並對其進行原始碼編譯,由於目前幾乎所有的手機廠商均

python 自動操作 android原始碼編譯某一個apk

import os def getCmdEexcuteResult(cmd): tmp = os.popen(cmd).readlines() return tmp def doWork(): cmdList=['adb root', '

Android原始碼編譯jar包BUILD_JAVA_LIBRARY 與BUILD_STATIC_JAVA_LIBRARY的區別

 Android原始碼編譯jar包BUILD_JAVA_LIBRARY 與BUILD_STATIC_JAVA_LIBRARY的區別(一) http://www.cnblogs.com/zhhd/p/5392913.html 上面是參考文章的連結,下面是我的編譯指令碼(An

android原始碼閱讀三》android原始碼編譯匯入android studio

1、安裝 Java 輸入命令 java,報以下錯誤: Command 'java' not found, but can be installed with: sudo apt insta

Android 原始碼編譯環境搭建

我這邊自己使用Ubuntu 14.04 搭建了一個android原始碼的編譯環境,並打包成系統映象,送給不會搭建編譯環境的同學們。 連結:https://pan.baidu.com/s/1boDx

Android 原始碼編譯aidl_language_l 相關錯誤解決

Android 原始碼編譯報錯: Lex: aidl <= frameworks/base/tools/aidl/aidl_language_l.l flex-2.5.39: loadlocale.c:130:_nl_intern_locale_data: ?? 'c

android原始碼編譯(ubuntu16.04 64位)

編譯步驟 1. 原始碼下載; 2. 構建編譯環境; 3.編譯原始碼; 4.執行. 編譯之前首先要下載和安裝repo和gitt工具。 repo和git Google採用Git對AOSP專案進行多倉庫管理. 為了方便需要,對git語句進行了封裝,也就形成了repo.

Android編譯技術總結

一、Apk反編譯工具及其使用方法 1.原理 學習反編譯之前,建議先學習一下Apk打包的過程,明白打包完成後的Apk裡面都有什麼檔案,各種檔案都是怎麼生成的。 這裡有兩篇AndroidWeekly中推薦過的好文章: Apk技術也有非常多的技術可以學習,主要都是圍繞著如何

Android 原始碼編譯 指定userdata.img、system.img、cache.img容量大小【轉】

本文轉載自:https://blog.csdn.net/baodinglaolang/article/details/49791041 修改build/target/board/generic_x86(對應編譯平臺)/BoardConfig.mk檔案BOARD_SYSTEMIMAGE_PARTITION_S

解決Android 原始碼編譯“audio_processing_impl”時,報錯“fatal error: list: No such file or directory”問題

我的系統是Linux Mint 17,使用的平臺是Tiny4412,編譯的是友善之臂提供的Android 4.2.2 原始碼。之前編譯沒有問題,今天編譯時,報出這個錯誤,查遍 百度/Google 都沒解決,後來發現是我之前手賤多配置了一個環境變數 NDK_ROOT 導致的問

Android原始碼編譯環境搭建問題及解決方案小結

1. ImportError: No module named bz2 for Python 2.7.2 (1)$ source build/envsetup.sh (2)$ lunch aosp_arm-eng (3)$ mak

Android原始碼編譯JNI

在android開發中,有時候需要編寫一些C/C++程式碼,這時候就要用到JNI技術,我們需要將C/C++程式首先編譯成so庫,在java中通過native方法呼叫so庫中的函式。 實現以上目的有三種方式: 1、單獨編譯so庫檔案,將它push到手機的sys