當前位置:首頁 » 編程軟體 » android項目手工編譯

android項目手工編譯

發布時間: 2023-02-06 19:51:46

1. 如何單獨編譯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。

2. 如何單獨編譯Android源代碼中的模塊

第一次下載好Android源代碼工程後,我們通常是在Android源代碼工程目錄下執行make命令,經過漫長的等待之後,就可以得到Android系統鏡像system.img了。以後如果我們修改了Android源代碼中的某個模塊或者在Android源代碼工程新增一個自己的模塊,是不是還是執行make命令呢?答案是否定的,Google為我們准備了另外的命令來支持編譯單獨的模塊,以及重新打包system.img的命令。在繼續學習Android源代碼之前,就讓我們先來看看這個命令吧。
一.首先在Android源代碼目錄下的build目錄下,有個腳本文件envsetup.sh,執行這個腳本文件後,就可以獲得一些有用的工具:
USER-NAME@MACHINE-NAME:~/Android$../build/envsetup.sh
注意,這是一個source命令,執行之後,就會有一些額外的命令可以使用:
-croot:.
-m:Makesfromthetopofthetree.
-mm:.
-mmm:.
-cgrep:GrepsonalllocalC/C++files.
-jgrep:Grepsonalllocaljavafiles.
-resgrep:Grepsonalllocalres/*.xmlfiles.
-godir:.
這些命令的具體用法,可以在命令的後面加-help來查看,這里我們只關注mmm命令,也就是可以用它來編譯指定目錄的所有模塊,通常這個目錄只包含一個模塊。
二.使用mmm命令來編譯指定的模塊,例如Email應用程序:
USER-NAME@MACHINE-NAME:~/Android$mmmpackages/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$makesnod
四.參照Ubuntu上下載、編譯和安裝Android最新源代碼一文介紹的方法運行模擬器:
USER-NAME@MACHINE-NAME:~/Android$emulator
這樣一切就搞定了。

3. android 工程 如何一鍵編譯打包成apk

打包步驟:

1、生成keystore

按照下面的命令行在C:ProgramFilesJavajdk1.6.0_10in>目錄下,輸入keytool-genkey-aliasandroid.keystore-keyalgRSA-validity100000-keystoreandroid.keystore

參數意義:-validity主要是證書的有效期,寫100000天;空格,退格鍵都算密碼。

命令執行後會在C:ProgramFilesJavajdk1.6.0_10in>目錄下生成android.keystore文件。如圖-1

圖-2EclipseAndroid打包工具

接下來的步驟就是不斷的next。下面僅貼出圖片,不解釋。

step2:選擇打包的項目

step3:選擇生成的EclipseAndroid.keystore文件並輸入密碼

step4:選擇aliaskey並輸入密碼

step5:最後選擇生成androidapk文件的目錄及文件名

最終生成的apk文件。

4. Android反編譯(三)— 手動編譯

PS: 最近沒工作,沒工作就沒需求,沒需求就沒什麼技術總結的靈感,那就沒更新什麼。但是兩個月不更新了,要是三個月不更新就會出大事,所以這次打算做一件有意思又不難的事。
之前有發文章寫過反編譯,今天就來試試反編譯之正編譯,開玩笑的,就是試試手動編譯的過程, 平時我們在項目中編譯出包都是使用Gradle直接執行assemble任務就能解決,我打算試試手動模擬整個過程。當然我也是第一次這樣搞,所以如果有寫得不對的地方,還望指出。

眾所周知,apk實質上就是一個壓縮包。復習一下,我們寫個最簡單的Demo,然後打包,然解壓,注意是解壓,不是反編譯,意義是不同的。

注意我這個Demo很簡單,什麼都不引入

然後我們看看整個出包的過程,隨便從網上拿張圖

然後這里我們用Android SDK給我們提供的工具來完成整個流程,工具在sdk文件夾下的build-tools文件夾下,有什麼aapt.exe、dx.bat,用的就是這些

這步應該是整個流程最簡單的吧,我感覺,所以從最簡單的開始。
我們先看看生成的dex有什麼

對比項目,我是一開始最基本的項目,什麼都沒動,所以只有一個MainActivity.clas,所以這里肯定是要先想辦法得到BuildConfig.class和R.class。

輸入命令:
aapt p -f -m -J <輸出路徑> -S <res路徑> -I <android.jar路徑> -M <Manifest路徑>

下一步,我們需要BuildConfig.class
這個BuildConfig.java是由gradle在我們配置好gradle之後自己幫我們生成的,所以我們直接拿來用,然後再javac就得到class文件了

然後我們再編譯我們的MainActivity.java並將它們放到同一個文件夾下, MainActivity因為引用了Android.jar和R文件,所以編譯時注意點,我為此被動好好的復習了一遍javac,都是淚

最後一步,我們用dx工具就能打出dex文件了

然後執行命令就得到一個Dex文件,看看這個文件裡面和上面直接打出的apk中的Dex文件有什麼不同:

看圖,我們上一步已經生成.dex了,那麼我們需要和compiled Resource 還有 Other Resource 一起生成APK。

我們先來生成compiled Resource,也就是resources.arsc
發現之前使用aapt生成R文件的時候沒寫完整,當時可以加一個-F參數直接生成arsc和Manifest

導出的abc.zip裡面就有resources.arsc和AndroidManifest.xml。
因為之前寫漏了,所以肯定要重新編一次MainActivity.java和Dex

我們把剛才的dex文件和aapt生成的resources.arsc、AndroidManifest.xml和res放到一個文件夾裡面。
PS:res文件夾也是上面aapt的命令生成的
然後我們對比這個文件夾和之前apk解壓的文件夾

最後運行

看來是成功了。

再說說遇到的還有兩個問題,並說下我解決問題的思路
(1)我把它們都放到一個文件夾之後,我壓縮成壓縮包,然後改後綴成.apk,然後發現安裝不了,我就直接反編譯,發現發編譯失敗,提示包有問題,以我多點玩包的經驗,我感覺就是壓縮工具出了問題,然後我去下個「好壓」(這不是廣告啊),然後就能正常反編譯了。
(2)但是還是安裝不了,再根據我多年的玩包經驗,我感覺是簽名問題,然後我隨便給這個包上一個簽名,就能正常安裝得到上圖的結果了。

總體來說,還真挺好玩的,這整個過程,就是翻車了幾次。做完之後感覺非常牛逼,為什麼這樣說,因為我知道這整個過程,我就可以做到,我不經過gradle來打包,我自己寫個python腳本來調用aapt和dx來打包也是能做到的。
當然上面純屬異想天開,因為這是個什麼都沒有的Demo所以覺得簡單,要是一個真實的項目,我感覺肯定要有很多坑,別的先不說,一個項目那麼多依賴關系,我這javac要搞死人。
最後如果有不對的地方,希望有大佬能夠指出,畢竟能運行也不能證明完全沒問題。然後我使用的build-tools是28的,不敢保證其它版本包括以後版本的玩法都一樣。

5. android studio 怎麼編譯一個工程

安裝Android Studio的准備工作 1.下載好JDK 去官網上找一個下載下來 2.安裝JDK.並配置環境變數.安裝過程可以一直下一步,無腦操作 3.下載Android Studio的安裝包 去官網上找一個,下載下來 (jdk的環境變數一定要配置) 准備工作完成之後,就可以開始我們的安裝了 1.安裝Android studio也是無腦操作,一直點下一步。直到安裝結束 2.安裝好之後,我們要新建我們的項目。重點從這里開始 點擊 New Project會出現.我們設置好名稱,也可以無腦操作,一直點擊next,直至結束,不過這個過程需要我們耐心的等待。(時間有點漫長)。 然後我們就會進入我們的開發界面。點擊圖片中紅圈的圖標(SDK manager)會出現下圖 這個步驟是安裝Android的sdk,推薦,Android1.6~Android4.4.2全部安裝。(這個耗費時間挺長的,請在網速良好且大量閑暇時光下安裝,安裝過程中可以看部電影) 安裝完之後,就開始配置我們的avd(Android Virtual Device),也就是Android的虛擬環境。點擊,圖片中紅圈的圖標 點擊New(Test是我配置好的) 隨便設置AVD name,建議如圖設置 設置完成之後,就可以點擊下圖的三角號編譯我們的程序了。。。。

6. 自己可以編譯安卓源碼嗎

用最新的Ubuntu 16.04,請首先確保自己已經安裝了Git.沒安裝的同學可以通過以下命令進行安裝:

sudo apt-get install git git config –global user.email 「[email protected]」 git config –global user.name 「test」

其中[email protected]為你自己的郵箱.

簡要說明

android源碼編譯的四個流程:1.源碼下載;2.構建編譯環境;3.編譯源碼;4運行.下文也將按照該流程講述.

源碼下載

由於某牆的原因,這里我們採用國內的鏡像源進行下載.
目前,可用的鏡像源一般是科大和清華的,具體使用差不多,這里我選擇清華大學鏡像進行說明.(參考:科大源,清華源)

repo工具下載及安裝

通過執行以下命令實現repo工具的下載和安裝

mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo

補充說明
這里,我來簡單的介紹下repo工具,我們知道AOSP項目由不同的子項目組成,為了方便進行管理,Google採用Git對AOSP項目進行多倉庫管理.在聊repo工具之前,我先帶你來聊聊多倉庫項目:

我們有個非常龐大的項目Pre,該項目由很多個子項目R1,R2,...Rn等組成,為了方便管理和協同開發,我們為每個子項目創立自己的倉庫,整個項目的結構如下:


這里寫圖片描述

執行完該命令後,再使用make命令繼續編譯.某些情況下,當你執行jack-admin kill-server時可能提示你命令不存在,此時去你去out/host/linux-x86/bin/目錄下會發現不存在jack-admin文件.如果我是你,我就會重新repo sync下,然後從頭來過.

錯誤三:使用emulator時,虛擬機停在黑屏界面,點擊無任何響應.此時,可能是kerner內核問題,解決方法如下:
執行如下命令:

  • ./out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7

  • 通過使用kernel-qemu-armv7內核 解決模擬器等待黑屏問題.而-partition-size 1024 則是解決警告: system partion siez adjusted to match image file (163 MB >66 MB)

    如果你一開始編譯的版本是aosp_arm-eng,使用上述命令仍然不能解決等待黑屏問題時,不妨編譯aosp_arm64-eng試試.

    結束吧

    到現在為止,你已經了解了整個android編譯的流程.除此之外,我也簡單的說明android源碼的多倉庫管理機制.下面,不妨自己動手嘗試一下.

    7. 如何在Android平台下編譯帶STL的C++程序

    1、下載最新的Android SDK,下載Android NDK R9C版本。

    2、如是在windows平台下需要在PATH中設置環境變數,以便於直接調用NDK來編譯C++程序。

    將如下兩個路徑加入到PATH中:<ANDROID_NDK>;<ANDROID_SDK>\platform-tools

    其中<NDK>為你的計算機上Android NDK的安裝路徑,<SDK>為Android SDK的安裝路徑

    如果在你的SDK下沒有platform-tools目錄,則在Eclipse中按照如下截圖進行操作:

    3、為要編譯的C++程序建一個文件夾,如myproject。在myproject下再建一個jni文件夾,將源代碼放在這個文件夾下,myproject/jni。

    mkdir myproject

    mkdir myproject/jni

    4、在jni文件夾下建兩個分別名為:android.mk和
    application.mk文件。android.mk類以於C++程序的makefile,application.mk則指明當前程序依賴的庫。

    android.mk的示例為:

    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := my_first_app #指明C++程序編譯出的可執行程序的名稱

    LOCAL_SRC_FILES:= my_first_app0.cpp \ #指明要編譯的源文件,可以有很多個

    my_first_app1.cpp\



    include$(BUILD_EXECUTABLE)#表明編譯的是可執行程序

    /**************************************************************************/

    application.mk的示例為:(在application.mk中指明STL庫)

    APP_STL:= gnustl_static

    這里選STL庫時有四個選項:

    system - 使用默認最小的C++運行庫,這樣生成的應用體積小,內存佔用小,但部分功能將無法支持
    stlport_static - 使用STLport作為靜態庫,這項是Android開發網極力推薦的
    stlport_shared - STLport 作為動態庫,這個可能產生兼容性和部分低版本的Android固件,目前不推薦使用。
    gnustl_static - 使用 GNU libstdc++ 作為靜態庫

    默認情況下STLPORT是不支持C++異常處理和RTTI,所以不要出現 -fexceptions 或 -frtti ,如果真的需要可以使用gnustl_static來支持標准C++的特性,但生成的文件體積會偏大,運行效率會低一些。

    支持C++異常處理,在Application.mk中加入 LOCAL_CPPFLAGS +=
    -fexceptions這句,同理支持RTTI,則加入LOCAL_CPPFLAGS +=
    -frtti,這里再次提醒大家,第二條說的使用gnustl靜態庫,而不是stlport。

    強制重新編譯 STLPort ,在Application.mk中加入 STLPORT_FORCE_REBUILD := true 可以強制重新編譯STLPort源碼,由於一些原因可能自己需要修改下STLPort庫,一般普通的開發者無需使用此項

    5、打開控制台(cmd),在myproject目錄下用android的NDK build工具編譯C++程序:

    cd myproject

    $NDK/ndk-build

    如果程序沒錯的話,會編譯出android的可執行程序,位置在myproject/libs/armeabi/my_first_app

    8、將編譯出來的my_first_app放到手機或是模擬器上運行。在windows的cmd上運行adb.exe。

    用adb.exe將my_first_app程序push到手機或模擬器的/data/local目錄上:

    adb.exepush myproject\libs\armeabi\my_first_app /data/local。

    9、通過adb,在手機上運行my_frist_app:

    在cmd上運行:

    adb.exe shell

    由此進入到手機的linux終端上,接下來再更改my_first_app的許可權使其可以運行:

    cd /data/local

    chmod 777 my_first_app

    ./my_first_app//如果沒錯的話,這一步即可運行my_first_app

    至此在android上編譯含STL的C++程序的過程結束。

    8. 如何編譯android手機源碼

    編譯android系統源碼准備工作:
    下載android源碼
    在windows上用gitbash ,git clone 下載代碼
    在linux上這樣下載
    創建~/bin目錄,用來存放repo程序,如下:

    $ cd ~
    $ mkdir bin
    初始化repo
    repo是android對git的一個封裝,簡化了一些git的操作。
    創建工程目錄:
    $ mkdir android
    $ cd android
    下載repo腳本並使其可執行:
    $ curl http://android.git.kernel.org/repo >~/bin/repo
    $ chmod a+x ~/bin/repo
    repo初始化:
    $ repo init -u git://android.git.kernel.org/platform/manifest.git
    在此過程中需要輸入名字和email地址。初始化成功後,會顯示:
    repo initialized in /android
    在~/android下會有一個.repo的隱藏目錄。
    5)同步源代碼
    $ repo sync
    這一步要很久很久。
    安裝linux系統,推薦ubuntu,圖形界面
    安裝編譯需要的支持包
    $ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
    安裝java6.0
    $ sudo apt-get install sun-java6-jdk
    配置java環境
    sudo gedit ~/.bashrc

    末尾加上

    JAVA_HOME=/usr/lib/jvm/java-6-sun
    JRE_HOME=${JAVA_HOME}/jre
    export ANDROID_JAVA_HOME=$JAVA_HOME
    export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSPATH
    export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
    export JAVA_HOME;
    export JRE_HOME;
    export CLASSPATH;
    HOME_BIN=~/bin/
    export PATH=${PATH}:${JAVA_PATH}:${HOME_BIN};
    sudo source ~/.bashrc
    是環境變數生效

    編譯android源碼,並得到~/android/out目錄

    $ cd ~/andoird
    $ make
    這一過程很久。
    這就編譯結束了

    9. 如何使用自己的makefile編譯android ndk項目

    其實android ndk上的編譯說到底也就是交叉編譯,只要配置好交叉編譯工具鏈,使用原有的makefile也是可以編譯出在android運行的c、c++程序的。以android-ndk-r4-crystax的ndk版本為例:編譯器路徑 android-ndk-r4-crystax/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin名稱前綴 arm-eabi-頭文件目錄 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/include庫文件目錄 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/lib你可以試一下上面的配置,如果編譯鏈接都沒有問題,可以adb push到android設備上運行看看,什麼結果?有點崩潰,根本運行不起來,你也許想試試看android自帶的ndk例子,確實是能夠運行的,問題在哪兒呢?只是正確配置了編譯器、頭文件、庫文件還不夠,還需要配置編譯、鏈接的參數,android例子中編譯鏈接的參數是什麼呢?你也許想深究一下android的makefile,可是不久你會發現那是更崩潰的事情,裡面用了很多的make腳本函數。其實android的makefile是可以把執行的詳細命令輸出來的,只要make的時候加上V=1即可。可以看到確實帶了很多參數編譯參數:-fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -Wa,--noexecstack -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID 鏈接參數:-nostdlib -Bdynamic -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,noreloc -Wl,--no-undefined -Wl,-z,noexecstack -L$(PLATFORM_LIBRARY_DIRECTORYS) crtbegin_static.o crtend_android.o 這其中鏈接參數中的-Wl,-dynamic-linker,/system/bin/linker、crtbegin_static.o、crtend_android.o是最關鍵的,android使用了自己的進程載入器,並且自定義了c運行時的啟動結束。難怪先前編譯的進程啟動不了。

    熱點內容
    伺服器怎麼搭建中間層 發布:2024-04-20 12:40:02 瀏覽:96
    如何獲取網路的賬號和密碼 發布:2024-04-20 12:34:06 瀏覽:919
    安卓現在哪個品牌用得最久 發布:2024-04-20 12:00:50 瀏覽:276
    小拇指演算法 發布:2024-04-20 11:55:28 瀏覽:954
    域名查看雲伺服器ip地址 發布:2024-04-20 11:49:17 瀏覽:551
    反編譯軟體id 發布:2024-04-20 10:29:49 瀏覽:44
    視頻太長怎麼壓縮發微信 發布:2024-04-20 10:00:14 瀏覽:384
    顯卡怎麼保存配置 發布:2024-04-20 09:28:52 瀏覽:596
    校園交易網站源碼 發布:2024-04-20 09:18:54 瀏覽:701
    江蘇北斗授時伺服器ip雲空間 發布:2024-04-20 08:53:50 瀏覽:931