ラベル AOSP の投稿を表示しています。 すべての投稿を表示
ラベル AOSP の投稿を表示しています。 すべての投稿を表示

2019年7月22日月曜日

在 Ubuntu 18.04 make AOSP 8.1 遇到的錯誤

這陣子一直在搞 AOSP
但是 build AOSP 的時候好像很容易就出現錯誤了= =

TL;DR

$ export LC_ALL=C



遇到的錯誤訊息

flex-2.5.39: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed.
Aborted (core dumped)
ninja: build stopped: subcommand failed.
ninja failed with: exit status 1




解決方法

$ export LC_ALL=C
locale 這個東西是用來設定執行的程式的不同語言環境用的
基本上包括了 Language、Territory、Codeset
locale 總共分成 12 類
所以有 12 個 define 值
LC_CTYPE
LC_NUMERIC
LC_COLLATE
LC_TIME
LC_MONETARY
LC_MESSAGES
LC_NAME
LC_ADDRESS
LC_TELEPHONE
LC_MEASUREMENT
LC_PAPER
LC_IDENTIFICATION
而 LC_ALL 的優先級別則高於上述的全部
所以設定 LC_ALL 的時候
就會完全不管上述的 locale sensitive 的設定
LC_ALL=C 的 “C” 指的是 POSIX
這意味著你的程式根本不管 locale 的設定
這樣就和多國語言的設計理念看起來有點衝突了的說= =

2019年7月21日日曜日

用 Android Studio 對 AOSP 進行除錯


這篇主要是要說
怎麼在 android studio 導入 aosp-based 的專案進行除錯
這篇拿 vamrs 的 rock960 的 android sdk 當範例

TL;DR

前提是這個專案已經 make 完了!!
$ cd ${project_root}
$ source build/envsetup.sh
$ mmm development/tools/idegen/
$ sudo development/tools/idegen/idegen.sh



需要的東西

  1. android studio
  2. 已經 make 過的 aosp-based project
因為這篇的重點是要除錯
所以一定要是 make 完的專案
如果只是要看 aosp 的 source 的話
基本上不需要 make 過的專案!!

執行環境設定

基本上只要能 make aosp-based project 就不需要在額外設定了
如果不行的話
也許可以參考之前寫的這篇:用 Ubuntu 18.04 建立 Android 系統建置環境

產生 idegen.jar

$ source build/envsetup.sh
$ mmm development/tools/idegen/

















產生的 idegen.jar 會在下面這個路徑裡
out/host/linux-x86/framework/idegen.jar
這個東西是用來等等要產生 android studio 用的 project config 用的
所以一定要確定這個東西有產生!!












產生 android.iml 和 android.ipr

有了剛剛產生的 idegen.jar 之後就可以產生 android studio 用的 config 了
而 android.iml 和 android.ipr 就是所謂的 project config 了
這時候只要執行 idegen.sh 就行了
$ development/tools/idegen/idegen.sh










怎麼可能呢...
事情竟然沒有這麼單純…@@
竟然被說沒有權限了!!
看了一下這個路徑還真的被劃了一個X...















加個 sudo 試試看
結果竟然可以了!!
$ sudo development/tools/idegen/idegen.sh





然後輸出的 android.iml 和 android.ipr 會在專案的根目錄下














導入 AOSP

接下來就輪到 android studio 出場了














選 [Open an existing Android Studio project]
然後找到剛剛的 android.ipr




















然後就跳出了個警告@@











然後直接選 [Convert] 就好
它不太會有什麼影響
接著就會看到整個專案被導入了













不對…
好像怪怪的=口=
仔細看了一下 IDE 底下的 log 才發現竟然出錯了@@
他說看起來剛剛產生的 iml 檔好像壞掉了( ´・д・)エッ
Load Settings: Cannot load settings from file 'android.iml'
最後看起來檔案好好的
只是因為 android studio 讀檔太慢了= =
所以不要緊張!!
它自己產生的 bug !!
幫它放置一段時間之後
它自己讀完就好了!!
它最後就會把整個專案讀進來了!!












這時候卻又報了一個警告
External file changes sync may be slow
The current inotify(7) watch limit is too low. More details.


讓我題外話一下
這個時候我突然想到一件事
前陣子在用 visual studio code 的時候
因為導入整個 linux kernel 5.x 全部的 source files
結果太大導致 VSC 吃不完
所以就調整了 fs.inotify 的監看數量















就是因為這個數值可能大了點…
所以換 android studio 抱怨檔案太多速度會變慢了=口=


結果 android studio 同步完整個專案花了超多時間地說OTL
就是 sync + indexing 大概花了 30 分鐘左右的時間
(i7-8559U + 16GB DDR4-3200 + Plextor m9peg 1TB)

設定 JDK

基本上如果只是要看 aosp 的 source 的話其實這個不太重要
不過因為要除錯
所以需要整個 framework 的 source 才行
不然它會去抓一些不是你想看的東西來用
這樣是沒辦法除錯的!!
打開 [File]->[Project Structures]
然後找到左邊 SDKs 的 Tab
按一下上面的 [+] 來新增一個 JDK












然後它會跳出一個對話框讓你選 JDK 的路徑
直接 [OK] 就好






















然後新增加出來的這個 jdk 的 [Name] 隨便取就好
那不太重要
可以認得出它就行了















然後找到下面的 Android API 28 Platform
把 Java SDK 選項換成剛剛新增的 JDK
















接著到左邊的 TAB 中找到 [Project Settings]->[Project]















把 剛剛新增加的 SDK 指定給現在這個 project















在旁邊的 TAB 找到 [Project Settings]->[Modules]
然後找到 [Dependencies]















把它們全部刪掉!!
但是要記得留下一些東西
像下面這張圖這樣















找到右邊的[+]
把 frameworks 和 external 兩個路徑給加進去












在追加路徑的時候
它會出現一個對話框
也是直接按[OK]就好




















加完之後看起來會像下面這張圖這樣















這時候 project tree 會在剛剛那兩個路徑後面顯示[library root]















然後就可以打開 source 下斷點進行除錯了!












大概就是這樣了(´∀`)ノシ

2018年5月27日日曜日

[AOSP] 用 Ubuntu 18.04 建立 Android 系統建置環境


在 Ubuntu 上使用 AOSP(Android Open Source Project) 編譯 android 系統

過了好多年,從之前的 ubuntu 14.04 到現在的 ubuntu 18.04

AOSP 都從 5.x 進化到 8.x 了

感覺現在連建置都變簡單了

所以只好再打一篇來記錄一下

之前好像還要打些什麼的

不過內容太多了就懶的寫了

這篇也偷懶直接複製之前的來修改w

所以這篇依然是 AOSP 的 master 的建置



為了減少除錯的時間同樣這次直接使用乾淨的系統(。-_-。)

手邊好像也沒有多餘的機器所以直接開 VM 來做...

等預算夠再來搞一台實體機好了XD

需要的東西

1. Virtualbox 任何可以安裝 Ubuntu 18.04 x64系統的版本都好
2. Ubuntu 18.04 x64 系統映像檔


然後用預設的方式安裝系統

雖然說是預設...

但是根據上面的夠強大的硬體...

基本上有三個東西要調整...

一個叫做 CPU

一個叫做 記憶體

一個叫做 硬碟

CPU 可能的話請給到 2 個核心以上

記憶體如果可能的話請給到 8GB 以上

硬碟容量分配無論如何請不要小於 100GB ← \_(・ω・`)ココ重要!

因為實際整個建置完之後的系統容量就超過 80G 了


在裝好後乾淨的 Ubuntu 系統上什麼都不要做

連更新什麼的都不要...O(>﹏<)O

雖然其實做了也不影響就是ww

然後直接在 Ubuntu 上打開終端機(alt + F2 → gnome-terminal, ctrl + alt + T)

在 terminal 裡照著下面的指令一行一行的敲就好...

沒有意外的話最後就會出現結果了XD



安裝必要的套件

$ sudo apt-get install git repo gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev lib32z1 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev g++-multilib tofrodos python-markdown libxml2-utils software-properties-common xsltproc libx11-dev:i386 liblz4-tool android-tools-adb android-tools-fastboot google-android-build-tools-installer bzip2 libbz2-dev libbz2-1.0 libghc-bzlib-dev squashfs-tools pngcrush schedtool dpkg-dev make optipng maven python-mako python3-mako python python3 syslinux-utils

安裝 OpenJDK

和之前不同的是,這次只需要 OpenJDK 就行了
$ sudo apt-get install openjdk-8-jdk

設定 git/repo

$ mkdir ~/bin
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ git config --global user.email "android"
$ git config --global user.name "android"

user.email 和 user.name 的 "android"可以是任意的名稱

所以隨意就好XD

設定環境變數


再來就是要 build 整個專案了...

在 AOSP 中有許多分支

這裡只記錄 master 分支 (現時點的AOSP master 分支版本為 8.1)

這邊跟之前的不一樣,這次不再需要對 JAVA 做設定了

所以這個步驟可以直接跳過(*^▽^*)


把 AOSP master 分支的 source 抓下來

這邊要注意的是 source 很多而且很大...

所以下完指令後就可以去睡覺了...XD
$ repo init -u https://android.googlesource.com/platform/manifest
$ repo sync -j8
這裡的 sync 的參數 -j8 是根據現在正在執行這個指令的電腦的CPU資源決定的

可以不寫讓它用預設的方式執行也可以

8 指的是現在這台電腦的核心數

理論上越多就越快...

所以也可以給 -j16 或 -j24 之類的數字

沒那麼多的話給 -j2 或 -j4 也可以XD



建置 AOSP master 分支

再建置之前先重新讀取資源
$ source build/envsetup.sh

再來就是執行建置的動作啦...
$ lunch aosp_arm-eng
$ make -j8
至於選擇 aosp_arm-eng 則是因為現在手機大部分都是這個規格XD

其實這還有其他選項就是了...

有興趣可以直接下 lunch 指令看XD

而這裡的 -j8 和 上面的 -j8 是一樣的意思

不過個人的習慣是 8G 的記憶體會給 -j4 然後 4G 的記憶體會給 -j2

至於為什麼o(‧"‧)o...好像也沒為什麼...就只是壞習慣而已XD

然後因為 android 是個巨大的專案...

所以下完 make 指令之後又可以去睡覺了...(´▽`*)

另外題外話一下

根據網路上找到的資料是用 intel xeon 8C16T 的 CPU 配 24GB 的記憶體

建置需要花 37 分鐘的時間

然後這次我拿 intel m7-6y75 開 VM 分資源 2C2T 的 CPU 配 8G 的記憶體

建置花了超過 9.5 個小時...Σ(゚д゚) エッ!?

用 AMD R7-1700 開 VM 分資源 8C8T 的 CPU 配 8G 的記憶體

只要 1 個小時 50 分鐘就結束了。

看來選 CPU 是一件很重要的事ww



基本上到這邊只要 make 跑完沒有錯誤就全部結束了...

然後建置完的輸出檔案會再 out/target/product/generic 資料夾下

最重要的有 system.img、userdata.img 和  ramdisk.img 三個映像檔

一定要確認這三個檔案有沒有存在...XD


最後就是把好不容易建好的系統放到模擬器上面執行了...


模擬測試

$ emulator

嗯...就這麼一個指令而已XD

然後就慢慢等模擬器自己動作了XD

沒意外的話就會在模擬器上面看到自己建置的 Android 系統了XD

有意外的話就只好慢慢 debug 啦~~(σ≧▽≦)σ

...

其實一定會有意外啦....ε=ε=┏( >_<)┛

因為模擬器預設的資源非常少...

所以會一直 crash 或是運作不順之類的XD

其實還有很多東西要設定...

不過這篇主要是在寫環境建置

所以模擬器設定就省略不寫了XD


=====


相關來源:

android - building the system
https://source.android.com/source/building.html

2015年10月5日月曜日

[AOSP] 用 Ubuntu 14.04 建立 Android 系統建置環境


在 Ubuntu 上使用 AOSP(Android Open Source Project) 編譯 android 系統

不知道是不是我關鍵字下的不對...

這東西怎麼資料那麼少...(´・ω・`)?

所以只好自己打一篇來做記錄了OTL

其實這篇大概拖了快一年了XD

這篇主要是 AOSP 的 master 的建置



為了減少除錯的時間所以在這邊直接使用乾淨的系統(。-_-。)

手邊好像也沒有多餘的機器所以直接開 VM 來做...

等預算夠再來搞一台實體機好了XD

需要的東西

1. Virtualbox 任何可以安裝 Ubuntu 14.04 x64系統的版本都好
2. Ubuntu 14.04 x64 系統映像檔
3. 其實這點是打完整篇才想到要加的...基本上要有夠強大的硬體支撐才行!!


然後用預設的方式安裝系統

雖然說是預設...

但是根據上面的夠強大的硬體...

基本上有三個東西要調整...

一個叫做 CPU

一個叫做 記憶體

一個叫做 硬碟

CPU 可能的話請給到 2 個核心以上

記憶體如果可能的話請給到 8GB 以上

硬碟容量分配無論如何請不要小於 100GB ← \_(・ω・`)ココ重要!



在裝好後乾淨的 Ubuntu 系統上什麼都不要做

連更新什麼的都不要...O(>﹏<)O

然後直接在 Ubuntu 上打開終端機(alt + F2 → gnome-terminal)

在 terminal 裡照著下面的指令一行一行的敲就好...

沒有意外的話最後就會出現結果了XD



安裝必要的套件

$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev lib32z1 x11proto-core-dev libx11-dev lib32readline-gplv2-dev lib32z-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils python-software-properties xsltproc libx11-dev:i386 android-tools-adb android-tools-fastboot liblz4-tool gcc-4.6 g++-4.6 gcc-4.6-multilib g++-4.6-multilib

安裝OracleJDK 和 OpenJDK

OpenJDK 是在 build AOSP 的 master 和 5.0.0 時會需要用到的
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update && sudo apt-get install oracle-java6-installer
$ sudo apt-get install openjdk-7-jdk

設定 git/repo

$ mkdir ~/bin
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ git config --global user.email "android"
$ git config --global user.name "android"

user.email 和 user.name 的 "android"可以是任意的名稱

所以隨意就好XD

設定環境變數

在 ~/bin 路徑下新增一個環境變數檔案叫做 android-env.sh
sudo gedit ~/bin/android-env.sh

然後在新增的 android-env.sh 裡加入 export 敘述句

下面這四行是要打在 android-env.sh 檔案裡的!!
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin
export ANDROID_JAVA_HOME=$JAVA_HOME
export PATH=$PATH:~/bin

打完後記得存檔再關閉離開
然後要重新載入剛剛打完的 android-env.sh 檔案
所以執行下面的敘述句
$ source ~/bin/android-env.sh

也是可以直接寫到 ~/.bashrc 之類的裡面

不過這樣會變成常態性一直在讀取這個檔案

所以這邊不這麼做XD



然後到這邊建置環境就設定完了XD

再來就是要 build 整個專案了...

在 AOSP 中有許多分支

這裡只記錄 master 分支 (現時點的AOSP master 分支版本為 5.1)

如果 分支的 android 版本小於 5.0.0 (不含) 則還有其他的環境變數要設定...

可能之後可以再打一篇文章這樣XD



把 AOSP master 分支的 source 抓下來

這邊要注意的是 source 很多而且很大...

所以下完指令後就可以去睡覺了...XD
$ repo init -u https://android.googlesource.com/platform/manifest
$ repo sync -j8
這裡的 sync 的參數 -j8 是根據現在正在執行這個指令的電腦的CPU資源決定的

可以不寫讓它用預設的方式執行也可以

8 指的是現在這台電腦的核心數

理論上越多就越快...

所以也可以給 -j16 或 -j24 之類的數字

沒那麼多的話給 -j2 或 -j4 也可以XD



建置 AOSP master 分支

再建置之前先重新讀取資源
$ source ~/bin/android-env.sh
$ source build/envsetup.sh

再來就是執行建置的動作啦...
$ lunch aosp_arm-eng
$ make -j8
至於選擇 aosp_arm-eng 則是因為現在手機大部分都是這個規格XD

其實這還有其他選項就是了...

有興趣可以直接下 lunch 指令看XD

而這裡的 -j8 和 上面的 -j8 是一樣的意思

不過個人的習慣是 8G 的記憶體會給 -j4 然後 4G 的記憶體會給 -j2

至於為什麼o(‧"‧)o...好像也沒為什麼...就只是壞習慣而已XD

然後因為 android 是個巨大的專案...

所以下完 make 指令之後又可以去睡覺了...(´▽`*)

另外題外話一下

根據網路上找到的資料是用 intel xeon 8C16T 的 CPU 配 24GB 的記憶體

建置需要花 37 分鐘的時間

然後我拿 intel i7-3820 開 VM 分資源 2C2T 的 CPU 配 4G 的記憶體

建置花了超過 6 個小時...Σ(゚д゚) エッ!?

實際上到底是多久我也不知道...XD

因為我等了 6 個小時候它還沒跑完所以就去睡覺了→_→



基本上到這邊只要 make 跑完沒有錯誤就全部結束了...

然後建置完的輸出檔案會再 out/target/product/generic 資料夾下

最重要的有 system.img、userdata.img 和  ramdisk.img 三個映像檔

一定要確認這三個檔案有沒有存在...XD


最後就是把好不容易建好的系統放到模擬器上面執行了...


模擬測試

$ emulator

嗯...就這麼一個指令而已XD

然後就慢慢等模擬器自己動作了XD

沒意外的話就會在模擬器上面看到自己建置的 Android 系統了XD

有意外的話就只好慢慢 debug 啦~~(σ≧▽≦)σ

...

其實一定會有意外啦....ε=ε=┏( >_<)┛

因為模擬器預設的資源非常少...

所以會一直 crash 或是運作不順之類的XD

其實還有很多東西要設定...

不過這篇主要是在寫環境建置

所以模擬器設定就省略不寫了XD


=====

整篇到這邊就結束了...

至於最重要的是

要怎麼把很辛苦建好的系統放到手機上執行

這好像才是花那麼多時間做上面整件事的最主要目的...o(‧"‧)o?

雖然是這麼說啦....

可是要怎麼放上去就...

嗯...有空再打另外一篇好了XD







相關來源:

android - building the system
https://source.android.com/source/building.html

AndroidのOS本体をビルドしてみよう
http://note.chiebukuro.yahoo.co.jp/detail/n185974

M Preview Downloads
https://developer.android.com/about/versions/marshmallow/download.html

Factory Images for Nexus Devices
https://developers.google.com/android/nexus/images?hl=en

CentOS7でAndroid4.4(AOSP)ビルド環境
http://qiita.com/Mask_Siva/items/cf65d9889893a7e62342

Android: ソースからシステムを構築しエミュレータで実行
http://otake.knowd2.com/drupal-rotake/?q=node/119

Android 4 (Ice Cream Sandwich) をビルドしてみる
http://www.gadgety.net/shin/tips/unix/android4.html

Ubuntu 14.04 64bit版での Android ビルド環境
http://blog.sola-dolphin-1.net/archives/4633272.html