天天看點

android 源碼編譯apk,在Android源碼裡編譯apk

有時候不得已需要在Android源碼裡編譯應用。譬如說用到了Andorid的隐藏類,譬如說要與系統一起起來的system權限apk,譬如說用eclipse編譯時,明明是正确的代碼卻報錯時。就不得不用到在源碼裡編譯了。至于說有apk了,要成為Android預裝的應用,那倒是簡單,隻需要将apk放到out/system/app/目錄下重新打包image檔案即可,不在本文讨論範疇。

我用到這個的原因就是上述的第三點,完全不知道這個eclipse發了什麼神經,明明是正确代碼卻總是報錯。于是乎将其放在Android源碼裡,隻留下res和src目錄,以及AndroidManifest.xml檔案。由于這個工程還用到了兩個jar檔案,是以也将它們拷貝過來。然後編輯Android.mk檔案(這裡主要就是講這個mk檔案如何編寫),就可以看到目錄下是如此的:

Analytics_Android_SDK_2.0.jar  AndroidManifest.xml  Android.mk  jcifs-1.3.15.jar  res  src

那麼,如何編輯Android.mk呢?首先看我這個Android.mk的寫法:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional#debug

LOCAL_STATIC_JAVA_LIBRARIES := libanalytics \

libjcifs

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_SDK_VERSION := current

LOCAL_PACKAGE_NAME := FileExpert

include $(BUILD_PACKAGE)

##################################################

include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libanalytics:Analytics_Android_SDK_2.0.jar \

libjcifs:jcifs-1.3.15.jar

include $(BUILD_MULTI_PREBUILT)

解釋一下,其中LOCAL_MODULE_TAGS := optional是說可以配置的,要在core.mk配置,如果你是想将其預裝到系統裡,最好去配置一下,或者直接:=debug好了。如果不是的話,隻是想單獨編譯一下這個apk,那随你怎麼寫了,我這裡寫的就是optional,并且沒有在其它build目錄下的mk檔案裡添加内容,因為我隻需要編譯這一個apk。

LOCAL_STATIC_JAVA_LIBRARIES是這個apk也依賴的庫。在eclipse裡都好說,隻要改一下build path就可以了。但是在Android源碼裡就沒有這麼好了,得自己加上去。這裡,我用到的兩個jar庫都是Analytics_Android_SDK_2.0.jar和jcifs-1.3.15.jar,這裡兩個libanalytics和libjcifs的名字随你怎麼取好了,但是關鍵取好之後要記得,還用得着它們呢。看這個mk檔案的倒數兩三行LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libanalytics:Analytics_Android_SDK_2.0.jar libjcifs:jcifs-1.3.15.jar,這裡就指定了這兩個庫跟剛才兩個名字的關聯關系了。後面的include $(BUILD_MULTI_PREBUILT)可别忘記了,這裡就跟另一個檔案有關了。

在build/core/user_tags.mk裡,這個build目錄是android源碼總目錄下面的build目錄,幾乎所有的編譯規則都在這個目錄下。修改user_tags.mk檔案裡的GRANDFATHERED_USER_MODULES變量,在末尾處添加上面寫的兩個lib,我這裡的這個檔案原來的末尾是zipalign,是以添加兩個之後就是這樣的:

zipalign \

libanalytics \

libjcifs

這個就對應着上面寫的那個名字,是以說上面寫過的東西都要記得。Android.mk文嘉的其它部分就按上面的寫好了,隻是LOCAL_PACKAGE_NAME := FileExpert要換成你想要的,按照這個編譯出來,最後就是FileExpert.apk檔案了。

至此,Android.mk檔案編輯好,回到Android源碼總目錄,叫Android-src好了。在Android-src目錄下,執行指令:

. build/envsetup.sh

執行這個指令主要是設定一下目前shell的環境變量。然後進入到你apk的源碼目錄,如我這裡放到Android-src/packages/apps/FileExpert,是以我就到這個目錄下執行這個指令

mm TARGET_PRODUCT=product_name

這個TARGET_PRODUCT=product_name随你了,如果你原來編譯系統直接用的是make指令,那麼這個TARGET_PRODUCT=product_name也可以省下了,直接執行mm就可以了。

編譯完後,你就可以去Android-src/out/target/product/product_name/system/app目錄下找你的apk檔案了。