久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

android.bp,Androidbp 預(yù)編譯jar包

Android.mk轉(zhuǎn)Android.bp

背景:

建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡(luò)程序員、網(wǎng)頁(yè)設(shè)計(jì)師等,應(yīng)用各種網(wǎng)絡(luò)程序開(kāi)發(fā)技術(shù)和網(wǎng)頁(yè)設(shè)計(jì)技術(shù)配合操作的協(xié)同工作。創(chuàng)新互聯(lián)公司專業(yè)提供成都做網(wǎng)站、網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站制作(企業(yè)站、自適應(yīng)網(wǎng)站建設(shè)、電商門戶網(wǎng)站)等服務(wù),從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗(yàn)的提升,我們力求做到極致!

不少APP在P上是Android.mk,在10上變成Android.bp,我們?cè)贛K的時(shí)候需要對(duì)其進(jìn)行轉(zhuǎn)換。

轉(zhuǎn)換方法:

利用Android自帶的工具進(jìn)行轉(zhuǎn)換

使用自帶工具前提:

1.Source full build 過(guò)(最好)

2.在out/soong/host/linux-x86/bin/目錄下存在androidmk文件。

如果不存在androidmk文件,使用m -j blueprint_tools命令生成

具體轉(zhuǎn)換方法:

1.cd out/soong/host/linux-x86/bin/

2.執(zhí)行命令:androidmk android.mk文件 android.bp文件

例子:

1.cd out/soong/host/linux-x86/bin/

2.androidmk ./mk2bp/Android.mk ./mk2bp/Android.bp

例子中step2說(shuō)明:

由于out/soong/host/linux-x86/bin/路徑下文件太多,不好識(shí)別轉(zhuǎn)換后的文件,所以自己建了個(gè)mk2bp文件夾,放要轉(zhuǎn)換的Android.mk。方便查看而已

至于放Android.mk放哪,隨便。

如果遇到內(nèi)容復(fù)雜一點(diǎn)的Android.mk,可能工具轉(zhuǎn)換會(huì)出錯(cuò)。待進(jìn)一步研究。

android 中Bn 和Bp的區(qū)別

Bn意味著B(niǎo)inder Native 端 Bp是Binder Proxy端, 這兩端會(huì)實(shí)現(xiàn)相同的接口,但Proxy端只是通過(guò)binder ipc發(fā)送一個(gè)binder transaction, native端是真正做事情,再將結(jié)果返回。 Android用此機(jī)制實(shí)現(xiàn)高效的遠(yuǎn)程調(diào)用??梢钥纯窗沧堪褪康慕坛蹋?/p>

AndroidFramework 之啟動(dòng) ServiceManager

本文源碼基于 Android 10 ,涉及相關(guān)源碼如下。

ServiceManagaer 是 Binder 的守護(hù)進(jìn)程,在 Binder 機(jī)制中起著重要的作用。本文將從源碼的角度對(duì)其進(jìn)行分析,整體流程如下:

時(shí)序圖如下。

先來(lái)看看 ServiceManager 是如何啟動(dòng)的:

在 Zygote 一文中說(shuō)過(guò), init 進(jìn)程啟動(dòng)的第二階段會(huì)解析 init.rc 文件。

在這之后會(huì)觸發(fā) trigger init 。

結(jié)合 init.rc 看看 action init 做了什么。

當(dāng)觸發(fā) trigger init 后,會(huì)啟動(dòng) servicemanager 服務(wù),其聲明如下。

對(duì)應(yīng)的執(zhí)行文件為 /system/bin/servicemanager ,在編譯前位于 frameworks/native/cmds/servicemanager 下,來(lái)看看 Android.bp 。

其對(duì)應(yīng)的源碼為 service_manager.c 和 binder.c ,入口函數(shù) main() 位于 servicemanager.c 。

啟動(dòng)完 ServiceManager 后會(huì)打開(kāi) Binder 驅(qū)動(dòng)。

在 main() 中首先調(diào)用 binder_open() 。

binder_open() 主要做了如下事情:

給結(jié)構(gòu)體 binder_state 分配內(nèi)存。

系統(tǒng)調(diào)用 open() 打開(kāi) /dev/binder ,如果打開(kāi)驅(qū)動(dòng)失敗,則執(zhí)行 fail_open 釋放內(nèi)存。

簡(jiǎn)單的解釋一下什么是系統(tǒng)調(diào)用?

由于需要限制不同的程序之間的訪問(wèn)能力,防止程序獲取別的程序的內(nèi)存數(shù)據(jù), CPU 劃分出兩個(gè)權(quán)限等級(jí), 用戶態(tài) 和 內(nèi)核態(tài) 。

所有的用戶程序都是運(yùn)行在用戶態(tài),但有時(shí)需要做一些內(nèi)核態(tài)的事情,而唯一可以做這些事情的就是操作系統(tǒng),所以程序需要向操作系統(tǒng)發(fā)起請(qǐng)求,以程序的名字來(lái)執(zhí)行這些操作。這時(shí)就需要一個(gè)從用戶態(tài)切換到內(nèi)核態(tài)但不能控制內(nèi)核態(tài)中執(zhí)行的機(jī)制,這種機(jī)制就是 系統(tǒng)調(diào)用 。

系統(tǒng)調(diào)用 ioctl() 傳入 BINDER_VERSION 命令獲取 Binder 驅(qū)動(dòng)版本,對(duì)比版本是否一致,不一致則執(zhí)行 fail_open 釋放內(nèi)存。

系統(tǒng)調(diào)用 mmap() 映射 128kb 的內(nèi)存空間,即把 Binder 驅(qū)動(dòng)文件的 128kb 映射到內(nèi)存空間供 ServiceManager 使用,內(nèi)存映射失敗則執(zhí)行 fail_map ,關(guān)閉 fd 并釋放內(nèi)存。

ServiceManager 進(jìn)程 mmap 的內(nèi)存大小可以通過(guò) adb shell 命令查看。

可以看到內(nèi)存映射地址為 0xf10f8000 ~ 0xf1118000 ,差為 0x20000 即十進(jìn)制的 128kb 。

打開(kāi) Binder 驅(qū)動(dòng)后會(huì)將 ServiceManager 設(shè)置為上下文管理者。

調(diào)用 binder_become_context_manager() 。

android 10 新增 BINDER_SET_CONTEXT_MGR_EXT 命令來(lái)設(shè)置安全的上下文管理者,如果設(shè)置失敗,則使用原有的 BINDER_SET_CONTEXT_MGR 命令來(lái)設(shè)置上下文管理者,兩者區(qū)別在于是否攜帶參數(shù)。

最后會(huì)進(jìn)入循環(huán),從 Binder 驅(qū)動(dòng)讀取和解析數(shù)據(jù)。

調(diào)用 binder_loop() 進(jìn)入循環(huán),不斷地通過(guò)系統(tǒng)調(diào)用 ioctl() 從 Binder 驅(qū)動(dòng)讀取數(shù)據(jù),并通過(guò) binder_parse() 進(jìn)行數(shù)據(jù)解析。

注意這里調(diào)用 binder_loop() 傳入的 svcmgr_handler() ,后面會(huì)使用到。

binder_write() 會(huì)封裝 struct binder_write_read ,并通過(guò)系統(tǒng)調(diào)用 ioctl() 將對(duì)應(yīng)的命令傳遞給 Binder 驅(qū)動(dòng)。

binder_parse() 用來(lái)解析從 Binder 驅(qū)動(dòng)讀取到的數(shù)據(jù),然后根據(jù)不同的命令執(zhí)行對(duì)應(yīng)的操作。

因?yàn)? cmd 命令可能有多個(gè),所以通過(guò) while 循環(huán)每次處理一個(gè) cmd 命令,多 cmd 的結(jié)構(gòu)大致如下圖所示。

這里重點(diǎn)看下 BR_TRANSACTION 命令。

BR_TRANSACTION 是 Binder 驅(qū)動(dòng)向 Server 端發(fā)送請(qǐng)求數(shù)據(jù)。

binder_transaction_data 的結(jié)構(gòu)如下,其表明了 transcation 傳輸?shù)木唧w語(yǔ)義,語(yǔ)義碼記錄在 code 中,不同語(yǔ)義碼攜帶的數(shù)據(jù)是不同的,這些數(shù)據(jù)由 data 指定。

在解析完 binder_transaction_data 的具體語(yǔ)義后,會(huì)調(diào)用前面?zhèn)鹘o binder_loop() 的 svcmgr_handler() ,其實(shí)就是 switch case 語(yǔ)義碼做不同的事情。

ServiceManager 的功能其實(shí)很簡(jiǎn)單:

至此 ServiceManager 就分析完了。

get compile_commands.json from aosp

soong delete the direct way to get compile_commands, which is suck to use, but instead ,provide a way to get clion project file, you can find it in soong document. but some generated CMakeList.txt is hard use like drm module, there are many CMakeList.txt generated in drm module, but I just want a compile_commands, not so many split .

so I write a script to solve it

perfect version

由于android.mk無(wú)法生成對(duì)應(yīng)的clion工程,所以需要將android.mk轉(zhuǎn)化為android.bp,androidmk適應(yīng)于簡(jiǎn)單情況,當(dāng)android.mk復(fù)雜時(shí)需要手動(dòng)轉(zhuǎn)化。drm就是一個(gè)例子,他的mk文件使用了proto,參照其他bp文件處理proto的方法,做如下修正

aosp/frameworks/av/drm/mediacas/plugins/clearkey

第二章:Android.bp語(yǔ)法

注意 :關(guān)于Android.bp的權(quán)威解釋可以參見(jiàn) android.bp權(quán)威文檔

Google官方語(yǔ)法文檔

從前面的列子可以看出定義一個(gè)模塊從模塊的類型開(kāi)始,模塊有不同的類型,如前面例子中的cc_library_shared,當(dāng)然類型還有很多種,譬如 cc_binary、android_app 、cc_library_static 等等。模塊包含一些屬性格式為“property-name:property-value”,其中name屬性必須指定,其屬性值必須是全局唯一的。

其中默認(rèn)模塊可用于在多個(gè)模塊中重復(fù)相同的屬性

srcs 屬性以字符串列表的形式指定用于編譯模塊的源文件。您可以使用模塊引用語(yǔ)法 “:” 來(lái)引用生成源文件的其他模塊的輸出,如 genrule 或 filegroup。

實(shí)例說(shuō)明:

我們知道Android.mk中可以定義變量,當(dāng)然作為新編譯系統(tǒng)中替代Android.mk的Android.bp也是一定存在,更加何況Android.mk還可以一定條件的轉(zhuǎn)換成Android.bp。

變量范圍限定為聲明它們的文件的其余部分,可以使用 “=” 號(hào)賦值, 但是不能使用 “:=” 賦值。變量是不可變的,但有一個(gè)例外它們可以附上+= 賦值,但僅在變量被引用之前。

下面我們看一下正確使用變量的列子:

我們知道Android.mk中可以進(jìn)行注釋,當(dāng)然Android.bp里面也可以,Android.mk中使用 # 然后添加注釋,Android.bp使用單行注釋 // 和多行注釋 /* */ 兩種方式。

具體支持以下幾種類型:

String類型、字符串列表類型和Map類型支持操作符 + 。

Android.bp可以支持android_app、cc_binary、cc_binary_host等多種類型,具體定義在Android源碼的 build/soong/androidmk/cmd/androidmk/android.go 可以查看,具體如下:

Android.bp可以支持多種預(yù)編譯類型,具體定義在Android源碼的 build/soong/androidmk/cmd/androidmk/android.go 可以查看,如下圖所示:

例如: system/core/libusbhost/Android.bp aosp9.0開(kāi)始

Android.bp是一門實(shí)戰(zhàn)性的東西,光說(shuō)不練沒(méi)有啥用,說(shuō)再多不如直接開(kāi)練來(lái)得舒服。那就直接開(kāi)始手撕實(shí)例了,讓我們開(kāi)戰(zhàn)嗎!

下面幾種庫(kù)編譯類型:

2.1 動(dòng)態(tài)庫(kù)類型

最終編譯為so包

**2.2 java庫(kù)類型: **

最終編譯為jar包

2.3 Andorid應(yīng)用類型

最終編譯為apk包

轉(zhuǎn)自:

網(wǎng)頁(yè)名稱:android.bp,Androidbp 預(yù)編譯jar包
本文鏈接:http://sd-ha.com/article12/dsspjgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、企業(yè)網(wǎng)站制作、網(wǎng)站內(nèi)鏈域名注冊(cè)、標(biāo)簽優(yōu)化、網(wǎng)站收錄

廣告

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

成都網(wǎng)頁(yè)設(shè)計(jì)公司