如下:
1.在ubuntu系統下,進入源碼根目錄,運行如下命令。
mmm命令編譯idegen模塊,在源碼目錄下的out/host/linux-x86/frameworks/目錄下生成了idegen.jar文件。
2.在源碼目錄下繼續執行如下命令:
3.development/tools/idegen/idegen.sh命令執行完成,會在根目錄下生成
android.iml和android.ipr這兩個文件,這兩個文件是Android Studio的工程配置文件。
4.到這一步我們可以打開Android Studio導入源碼了,不過還有一些要注意的地方,如果我們就這么直接導入,會把所有的源碼模塊導入到Android Studio中,這會很慢的,想想源碼那麼多文件,直接全部導入,如果你的電腦配置不好,可能會直接假死。所以我們最好過濾一下我們不需要的源碼文件,只導入我們需要的模塊。
對比源碼下目錄,我把除了frameworks模塊的其他所有模塊都過濾掉了。這樣導入的速度很快,3分鍾左右就導入完成了。
5.所有配置完成了,下面啟動Android Studio開始導入源碼。
6.Android Studio導入源碼
點擊ok,大概過了3-5分鍾,就導入完成了。
7.好了,現在我們可以愉快的使用Android Studio查看源碼了。
8.如果你不想編譯源碼,還想把源碼導入Android Studio的簡單方法是什麼呢,到這一步我想大家都知道了,就是把上面生成的兩個文件android.iml和android.ipr拷貝到你的未編譯源碼根目錄就可以用Android Studio導入了。
9.當然,一般我們大部分人不在ubuntu下開發app ,為了能在Windows或Mac系統下也能使用Android Studio查看未編譯的源碼,我們也可以像上一步那樣直接拷貝ubuntu下的android.iml和android.ipr文件到Windows或Mac系統下的android源碼根目錄下,然後導入Adnroid Studio中,這樣就可以在這兩個平台上進行查看源碼了,不用一直開虛擬機了。
② 如何單獨編譯Android源代碼中的模塊
一. 首先在Android源代碼目錄下的build目錄下,有個腳本文件envsetup.sh,執行這個腳本文件後,就可以獲得一些有用的工具:
USER-NAME@MACHINE-NAME:~/Android$ . ./build/envsetup.sh
注意,這是一個source命令,執行之後,就會有一些額外的命令可以使用:
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the moles in the current directory.
- mmm: Builds all of the moles 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命令來編譯指定的模塊,例如Email應用程序:
USER-NAME@MACHINE-NAME:~/Android$ mmm packages/apps/Email/
編譯完成之後,就可以在out/target/proct/generic/system/app目錄下看到Email.apk文件了。Android系統自帶的App都放在這具目錄下。另外,Android系統的一些可執行文件,例如C編譯的可執行文件,放在out/target/proct/generic/system/bin目錄下,動態鏈接庫文件放在out/target/proct/generic/system/lib目錄下,out/target/proct/generic/system/lib/hw目錄存放的是硬體抽象層(HAL)介面文件
三. 編譯好模塊後,還要重新打包一下system.img文件,這樣把system.img運行在模擬器上時,就可以看到程序了。
USER-NAME@MACHINE-NAME:~/Android$ make snod
四. 參照Ubuntu上下載、編譯和安裝Android最新源代碼一文介紹的方法運行模擬器:
USER-NAME@MACHINE-NAME:~/Android$ emulator
這樣一切就搞定了。
③ 條件編譯形式
條件編譯形式允許程序在運行時根據特定條件選擇執行不同的代碼塊。這種形式通常用於在不同平台或配置下優化代碼或實現兼容性。以 NNN 和 MMM 作為條件示例,其結構如下:
#if NNN
statement1;
#elif MMM
statement2;
#else
statement3;
#endif
此結構中,`#if`、`#elif` 和 `#else` 是預處理器指令,用於根據 NNN 和 MMM 的值決定執行哪部分代碼。當 NNN 為真(通常表示為1)時,執行 `statement1`;當 NNN 為假(通常表示為0)且 MMM 為真時,執行 `statement2`;當 NNN 和 MMM 均為假時,則執行 `statement3`。
條件編譯的形式在軟體開發中非常有用。它允許開發者在不修改源代碼的情況下,針對不同環境或配置提供不同功能。例如,在編寫跨平台應用時,可以使用條件編譯來根據目標平台的特性選擇使用特定的功能庫或功能實現。這有助於減少代碼冗餘,提高代碼效率和可維護性。
此外,條件編譯還能用於在開發過程中進行調試和測試。通過條件地啟用或禁用某些功能或代碼塊,開發者可以更容易地定位和解決問題。在生產環境中,可以使用條件編譯來禁用調試代碼、日誌記錄或性能測試代碼,從而減少應用程序的大小和運行時消耗。
總之,條件編譯是一種強大的工具,能夠根據運行環境和需求動態地調整程序的行為。它簡化了代碼維護和跨平台開發的過程,有助於提高軟體的性能和可移植性。
一般情況下,源程序中所有的行都參加編譯。但有時希望對其中一部分內容只在滿足一定條件下才進行編譯,即對一部分內容指定編譯條件,這就是「條件編譯」(conditional compile)。條件編譯語句排版時,需考慮以下三種位置:1)條件編譯語句塊與函數定義體之間不存在相互嵌套(主要在(.h)文件中);2)條件編譯語句塊嵌套在函數體之外(主要在(.c)文件中);3)條件編譯語句嵌套在函數體內 (主要在(.c)文件中)。條件編譯指令將決定那些代碼被編譯,而哪些是不被編譯的。可根據表達式的值或某個特定宏是否被定義來確定編譯條件。
④ 如何用android:sharedUserId屬性生成帶有系統許可權的apk
如何用android:sharedUserId屬性生成帶有系統許可權的apk?
通過源碼編譯apk獲取系統許可權,主要有兩種方法:使用Android系統源碼的環境下用make命令編譯,或者使用eclipse源碼編譯,無需使用make命令。
方法1:Android源碼環境下的make命令編譯。首先在android源碼根目錄下執行以下命令:
- build/envsetup.sh 設置編譯環境
- lunch 選擇編譯目標
- make 編譯整個系統
Android平台提供常用命令如:
- make 編譯整個系統或單個模塊
- mmm 編譯指定目錄下的模塊
- mm 編譯當前目錄下的模塊
- mma 編譯當前目錄及其依賴模塊
- mms 編譯指定目錄及其依賴模塊
- make sdk 編譯SDK
- make snod 生成系統映像,速度較快但不穩定
方法2:使用eclipse源碼編譯。在signapk.java代碼目錄下執行命令:
- javac signapk.java 獲取SignApk$SignatureOutputStream.class和SignApk.class
- 將兩個class文件放入目錄下並生成signapk.jar文件
- 復制platform.pk8和platform.x509.pem文件至signapk.jar和SignApk.mf所在的目錄
- 使用java -jar signapk.jar簽名apk文件
在加入android:sharedUserId="android.uid.system"屬性後,程序運行在系統進程中,擁有系統許可權。但還需使用platform.pk8和platform.x509.pem兩個文件簽名apk,確保在系統中安裝和運行。生成的程序僅在原始Android系統或自己編譯的系統中可用。
系統中使用不同共享UID的APK具有不同的許可權和用途。遵循上述方法,你可以嘗試編譯帶有sharedUserId許可權的apk,並將其放置在開發版的/system/priv-app/目錄下,以實現靜默ota升級。
本文章總結了使用android:sharedUserId屬性生成帶有系統許可權的apk的方法和注意事項,希望對開發者有所幫助。後續將介紹ota升級的理論、實踐和原理等內容。歡迎關注知乎主頁以獲取更多Android開發知識。sunst 2019-06-15 23:30
⑤ 如何單獨編譯Android源碼中的模塊
1.make 模塊名稱
需要查看Android.mk文件的LOCAL_PACKAGE_NAME變數。
2.mmm命令
用於在源碼根目錄編譯指定模塊,參數為模塊的相對路徑。只能在第一次編譯後使用。比如要編譯Phone部分源碼,需要在終端中執行以下命令:
$mmm packages/apps/phone
3.mm命令
用於在模塊根目錄編譯這個模塊。只能在第一次編譯後使用。例如要編譯Phone部分源碼,需要在終端中執行以下命令:
$cd packages/apps/phone
$mm
註:mmm和mm命令必須在執行「.build/envsetup.sh」之後才能使用,並且只編譯發生變化的文件。如果要編譯模塊的所有文件,需要-B選項,例如mm -B。