1. 程式人生 > >android AIDL在編譯中執行的過程

android AIDL在編譯中執行的過程

  AIDL是安卓提供的一個工具,它存在的目的是為了方便使用者編寫程序間通訊的介面,其實如果不嫌麻煩,又瞭解binder通訊的機制的話,自己手動也可以寫出不同程序間通訊的介面。由於介面的函式是為了程序間使用的,所以函式的引數必須是程序間可傳遞的,比如基礎資料型別,還有就是實現了Parcelable介面的類的例項。在eclipse中的工程使用aidl的話相對簡單,只要寫上介面就好,有所限制就是函式的引數不能是自己定義的實現了Parcelable介面的類的例項。

   做android相關專案開發的時候,我們一般情況下是在android的整套程式碼的編譯環境中去編譯相關app或者jar,android的app編譯命令是mmm,比如編譯phone的程式碼的時候,命令就是:

   source build/envsetup.sh

  mmm packages/apps/Phone

 這種形式的編譯由app根目錄下的Android.mk控制,該檔案下控制編譯的是include $(BUILD_PACKAGE),一般這都是Android.mk的最後一句話,它的意思很簡單,BUILD_PACKAGE是一個變數,定義在build/core/config.mk中,

BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk

它對應著package.mk這個檔案,這個檔案中有一系列的執行語句讓make去執行,最終目標是生成apk,其中有一條語句就是

 define transform-aidl-to-java
@mkdir -p $(dir

[email protected])
@echo "Aidl: $(PRIVATE_MODULE) <= $<"
$(hide) $(AIDL) -d$(patsubst %.java,%.P,[email protected]) $(PRIVATE_AIDL_FLAGS) $< [email protected]
 endef

這個就是AIDL起作用的命令,將AIDL的檔案轉化成.java檔案和.p檔案,在android官網上我們可以看到各個引數所代表的意義,比如 -I 就是aidl檔案中所需要import的類的位置,

比如aidl檔案中import android.os.Bundle;  那麼在aidl的執行語句中就要將 framework/base/core/java這段路徑加進去,上面那段程式碼中並沒有-I這個引數,它存在於變數PRIVATE_AIDL_FLAGS中,看它的定義:

$(aidl_java_sources): PRIVATE_AIDL_FLAGS := -b $(addprefix -p,$(aidl_preprocess_import)) -I$(LOCAL_PATH) -I$(LOCAL_PATH)/src $(addprefix -I,$(LOCAL_AIDL_INCLUDES))

這裡我們看到了-I,而且LOCAL_AIDL_INCLUDES就是定義了需要匯入的路徑的變數,在pathmap.mk中定義

LOCAL_AIDL_INCLUDES += $(FRAMEWORKS_BASE_JAVA_SRC_DIRS)

FRAMEWORKS_BASE_SUBDIRS := \
$(addsuffix /java, \
   core \
   graphics \
   location \
   media \
   media/mca/effect \
   media/mca/filterfw \
   media/mca/filterpacks \
   drm \
   opengl \
   sax \
   telephony \
   wifi \
   keystore \
)

FRAMEWORKS_BASE_JAVA_SRC_DIRS := \
$(addprefix frameworks/base/,$(FRAMEWORKS_BASE_SUBDIRS))

看到這裡我們可以看到,希望在aidl介面的函式中使用自己定義的類做引數,只需將該類實現Parcelable介面,並且將該類存放的路徑加入到LOCAL_AIDL_INCLUDES中,同時在該類的同一目錄下建立aidl檔案,就可以編譯了。

比如你的類名是 haha.java,包名是com.android.example;那麼在同一目錄下再建立檔案haha.aidl,檔案中的內容寫成這樣

package com.android.example;


parcelable haha;

這基本就是AIDL在整個編譯中執行的過程了吧

相關推薦

android AIDL編譯執行過程

  AIDL是安卓提供的一個工具,它存在的目的是為了方便使用者編寫程序間通訊的介面,其實如果不嫌麻煩,又瞭解binder通訊的機制的話,自己手動也可以寫出不同程序間通訊的介面。由於介面的函式是為了程序間使用的,所以函式的引數必須是程序間可傳遞的,比如基礎資料型別,還有就是實

C++ 編譯執行過程 具體解釋。

string -m span font ont 程序 fas 全局 內容 要更深入了解C++, 必需要知道一個程序從開始到結束都幹了些什麽, 怎麽幹的。 所以我從C++編譯到執行過程,解析下程序是怎麽跑的。

Android在程式碼執行root命令

​ public void runRootCommand(String command) { Process process = null; DataOutputStream dataOutputStream = null;

Android APP編譯執行原理

在本篇中,主要介紹Android平臺應用程式的執行原理,在閱讀了SDK文件中“Application Fundamentals”一篇的內容後,根據自己的理解繪製了下面的示意圖:       每個應用程式安裝後,系統便會為其分配一個獨立的儲存空間,所謂的“Securi

程式的編譯執行過程

本文以C程式為例。 構建C程式需要4個步驟,分別使用4個工具完成: preprocessor, compiler, assembler, and linker.四步完成後生成一個可執行檔案。 第一步,預處理. 這一步處理 標頭檔案、條件編譯指令和巨

android jitsi編譯執行

下載了jitsi android的版本程式碼後,直接匯入eclipse可能報錯,需要先使用命令生成一下libs庫。 針對上面的步驟可能會遇到如下的錯誤:   1.當執行ant setup-libs時,提示錯誤sdk.dir is missing : 解決:

gcc 編譯連結執行過程

1、gcc g++ [option ]-o file  生成指定檔名為file的輸出檔案-E 只進行預處理-S 只進行預處理和編譯-C 只進行預處理、編譯和彙編-wall  生成所有級別的警告資訊-w 關閉所有警告,建議不使用此選項生成靜態、動態庫,比如一個工程裡包含的檔案有

程式的編譯執行過程

程式的編譯 組成一個程式的每個原始檔通過編譯過程目的碼(objiect code)。 每個目標檔案由連結器(linker)捆綁在一起,形成一個單一而完整的可執行程式。 連結器同時也會引入標準C函式庫

android編譯執行python版的tensorflow

    Tensorflow採用python作為主語言,雖然tensorflow提供了運行於android的例子,但採用是java。基於原始碼,採用NDK,可以編譯出android版本的tensorflow。     編譯環境採用ubuntu 16.04,NDK使用r13b

SparkSQL學習- SparkSQL編譯執行過程

Unresolved Logical Plan Spark使用Antlr將SQL/DataFrame 編譯為一顆Unresolved Logical Plan(抽象語法樹AST),樹上的節點不帶有資料型別等資訊。SparkSqlAstBuilder類與此相關。 R

C++ 編譯執行過程 詳解。

        要更深入瞭解C++, 必須要知道一個程式從開始到結束都幹了些什麼, 怎麼幹的。 所以我從C++編譯到執行過程,解析下程式是怎麼跑的。         首先,初略的說一下之前C++的編譯過程,C++編譯過程包括預編譯-》彙編-》編譯-》連結。稱為一個可執行檔案

android -x86 編譯遇到的問題

錯誤1: build/core/base_rules.mk:69: unusual tags systembuilder on badblocks at external/e2fsprogs/misc target Dex: framework target SharedL

android O 編譯執行

1 編譯Android7.0+更改Java heap Size Android7.0(也就是Android N)上預設使用JACK編譯器,當記憶體較小的機器編譯時可能會出現: Out of memory error (version 1.2-rc4 ‘Car

NDK編譯執行文件在Android 運行顯示error: only position independent executables (PIE) are supported.失敗問題解決辦法。

Language target 安全 問題 可執行 port ace 知識 基於 由於使用了NDK編譯的可執行文件在應用中調用,在Android 7.0上的運行情況發現,當運行該可執行文件時,報如下錯誤: error: only position independent e

app在android 6.0或以上平臺版本執行過程請求許可權

前言 從android 6.0(API 23)開始,安裝app時不需要對app的許可權申請進行授權,而是在app執行的時候,使用者才需要對app進行授權。這種流程精簡了app的安裝過程,使用者不需要在安裝或者升級app的時候進行授權操作。這同樣

程式執行過程編譯與連線階段

一個C程式的生成要經歷以下步驟:  1.編寫程式碼,生成.c或.cpp檔案,這時候它還是文字的; 2.編譯,就是Compile,由C編譯程式對你寫的程式碼進行詞法和句法分析,發現並報告錯誤,有錯時編譯不能通過。如若無錯,則生成中間程式碼,副檔名為obj,此時它便是二進位制的了; 3.連線,在彙編裡稱Link,

Android init.rc各條命令開機過程執行順序

1. 所有的action運行於service之前2.  下面為各個section的執行順序,英文編號的section是系統內建的(寫死在init.c中的命令)1) early-init    a) wait_for_coldboot_done    b) property_i

angualar入門學習-- 自定義指令 指令編譯執行過程

監聽 監聽器 註冊 sco lar scl $watch 學習 排序 3個階段: 一、加載階段 加載angular.js的源碼,找到ng-app確定應用邊界範圍。 二、編譯階段 compile 查找所有指令,保存在一個列表中 對所有指令按優先級(property屬性值)排序

存儲過程執行動態Sql語句

查詢 需要 一點 定義 data 復制 ast 我們 臨時   在最近的項目中,有用到動態執行sql語句,SQL為我們提供了兩種動態執行SQL語句的命令,分別是EXEC和sp_executesql;通常,sp_executesql則更具有優勢,它提供了輸入輸出接口,而EXE

java --代碼編譯執行的整個過程

pan home 面向 share 簡單的 下一條 c++ oot 註解 1. 什麽是 JVM   JVM 是 Java 的核心和基礎,在 Java 編譯器和 os 平臺之間的虛擬處理器。它是一種基於下層的操作系統和硬件平臺並利用軟件方法來實現的抽象的計算機,可以在上面執行