1. 程式人生 > >Android中各類.mk檔案的編寫

Android中各類.mk檔案的編寫

LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)

LOCAL_STATIC_JAVA_LIBRARIES := xsocket jackson-mapper logging jackson-core javatar log4j

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := test


 LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)

##################################################
 include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := xsocket:lib/xSocket-2.8.14.jar \
     jackson-mapper:lib/jackson-mapper-asl-1.6.2.jar \
     logging:lib/commons-logging.jar \
     jackson-core:lib/jackson-core-asl-1.6.2.jar \
     javatar:lib/javatar-2.5.jar \
     log4j:lib/log4j-1.2.15.jar

include $(BUILD_MULTI_PREBUILT)

# Use the folloing include to make our test apk.
 include $(call all-makefiles-under,$(LOCAL_PATH))

 

以上是我的一個專案中所需要的第三方jar包,主要參考了Android原始碼中的Calculator應用,該應用也引用了一個第三方的jar包arity-2.1.2.jar。

需要注意的是,當你要引用的jar包不止一個時,有兩個關鍵的地方需要注意的。

LOCAL_STATIC_JAVA_LIBRARIES := xsocket jackson-mapper logging jackson-core javatar log4j

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := xsocket:lib/xSocket-2.8.14.jar \
     jackson-mapper:lib/jackson-mapper-asl-1.6.2.jar \
     logging:lib/commons-logging.jar \
     jackson-core:lib/jackson-core-asl-1.6.2.jar \
     javatar:lib/javatar-2.5.jar \
     log4j:lib/log4j-1.2.15.jar

xsocket jackson-mapper logging jackson-core javatar log4j這幾個只是名字,可以隨便取。LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES後面才是真正其作用的地方。如:

xsocket:lib/xSocket-2.8.14.jar 引用的是lib目錄中的xSocket-2.8.14.jar。

還要注意的是 := 不要寫成了+=了哦。

 

附:編寫各種型別的Android.mk,出處我忘記了,是以前瀏覽是拷貝下來的。如果侵犯了作者的權益,煩請聯絡我
[email protected]
。我及時刪除。

 

一、編譯一個簡單的APK

LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 # Build all java files in the java subdirectory
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 # Name of the APK to build
 LOCAL_PACKAGE_NAME := LocalPackage
 # Tell it to build an APK
 include $(BUILD_PACKAGE)

二、編譯一個依賴靜態.jar檔案的APK

LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 # List of static libraries to include in the package
 LOCAL_STATIC_JAVA_LIBRARIES := static-library
 # Build all java files in the java subdirectory
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 # Name of the APK to build
 LOCAL_PACKAGE_NAME := LocalPackage
 # Tell it to build an APK
 include $(BUILD_PACKAGE)
 注:LOCAL_STATIC_JAVA_LIBRARIES 後面應是你的APK程式所需要的JAVA庫的JAR檔名。

三、編譯一個需要platform key簽名的APK (系統限制的許可權)

LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 # Build all java files in the java subdirectory
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 # Name of the APK to build
 LOCAL_PACKAGE_NAME := LocalPackage
 LOCAL_CERTIFICATE := platform
 # Tell it to build an APK
 include $(BUILD_PACKAGE)
 注:LOCAL_CERTIFICATE 後面應該是簽名檔案的檔名

四、編譯一個需要特殊vendor key簽名的APK

LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 # Build all java files in the java subdirectory
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 # Name of the APK to build
 LOCAL_PACKAGE_NAME := LocalPackage
 LOCAL_CERTIFICATE := vendor/example/certs/app
 # Tell it to build an APK
 include $(BUILD_PACKAGE)

五、裝載一個普通的第三方APK

LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 # Module name should match apk name to be installed.
 LOCAL_MODULE := LocalModuleName
 LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
 LOCAL_MODULE_CLASS := APPS
 LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
 LOCAL_CERTIFICATE := platform
 include $(BUILD_PREBUILT)

六、裝載需要.so(動態庫)的第三方apk

LOCAL_PATH := $(my-dir)
 include $(CLEAR_VARS)
 LOCAL_MODULE := baiduinput_android_v1.1_1000e
 LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
 LOCAL_MODULE_CLASS := APPS
 LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
 LOCAL_CERTIFICATE := platform
 include $(BUILD_PREBUILT)

#################################################################
 ####### copy the library to /system/lib #########################
 #################################################################
 include $(CLEAR_VARS)
 LOCAL_MODULE := libinputcore.so
 LOCAL_MODULE_CLASS := SHARED_LIBRARIES
 LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
 LOCAL_SRC_FILES := lib/$(LOCAL_MODULE)
 OVERRIDE_BUILD_MODULE_PATH := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)
 include $(BUILD_PREBUILT)

七、編譯一個靜態java庫

LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 # Build all java files in the java subdirectory
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 # Any libraries that this library depends on
 LOCAL_JAVA_LIBRARIES := android.test.runner
 # The name of the jar file to create
 LOCAL_MODULE := sample
 # Build a static jar file.
 include $(BUILD_STATIC_JAVA_LIBRARY)
 注:LOCAL_JAVA_LIBRARIES表示生成的java庫的jar檔名。



在Android原始碼開發過程中,需要整合進第三方APP到系統中,作為內建應用。如果是第三方APP是以APK形式整合進專案中,那麼根據平臺和公司的要求,只需修改編譯指令碼就可以實現整合,這裡不再贅述;本文講解拿到的第三方app是原始碼,需要自己寫android.mk檔案實現編譯apk功能。
       現在Android app ide主要是兩個工具eclipse和android studio。Eclipse已經從google的android開發者網站中移除了下載連結,現在主流的android app開發工具就是Android studio。
        android 原始碼中package/app目錄下的應用大部分還是eclipse的程式碼結構,第三方app如果是eclipse編寫的,那麼去原始碼中package/app目錄下找一個應用的android.mk 類比改一下就可以。這裡主要講一下android studio 專案的android.mk怎麼寫。
       android studio編寫的app,app原始碼程式碼結構就跟eclipse不一樣,實際上有用的app目錄下的內容。我的android.mk就放在app/src/main目錄下(一般android.mk都放在應用目錄下,但實際上android原始碼在編譯時會遍歷package/app目錄下的android.mk檔案,不放心可以在專案應用根目錄下寫android.mk)
       首先檢視app/src/main目錄下的build.gradle檔案,在這個檔案中會寫明在開發中引用了哪些包,如果不是android原始碼中帶有的(如android-support-v4,android-support-v7-xxx等),那麼要去android studio的安裝目錄下找到這些jar包,放到app/src/main/libs/目錄下(沒有就自己建立一個),因為android studio在使用時會自動下載需要的包到安裝目錄下,所以在拿到原始碼時實際上這些包是沒有的,在本地用android studio匯入專案,它會自動聯網同步這些包。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)  (經典開頭兩句)
LOCAL_PACKAGE_NAME := xxx(apk的名字,如果這個值寫的是Test,那麼編譯出來的就是Test.apk)
LOCAL_CERTIFICATE := platform (系統簽名)

LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/res
src_dirs := java/
LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))
##宣告使用的java檔案和資原始檔地址,如果使用到aidl,需要特別宣告,常見寫法如下
#LOCAL_SRC_FILES += \
# src/xx/xx/xx/aidl/XxxOne.aidl \
# src/xx/xx/xx//aidl/XxxTwo.aidl
LOCAL_MULTILIB := 32(新增這句是為了防止在編譯後使用apk時,提示so是32位而不是64位導致應用fc)
LOCAL_PREBUILT_JNI_LIBS_x86 := jniLibs/x86/libxxx.so
LOCAL_PROGUARD_ENABLED := disabled (新增這句是為了防止在編譯後使用apk時,提示找不到so庫中對應的方法導致fc)
#如果使用了jni就要這麼寫

LOCAL_STATIC_JAVA_LIBRARIES +=  design \
                                android-support-v4 \
                                android-support-v7-appcompat \
                                android-support-v7-recyclerview \
                                recyclerview-v7 \
                                itextpdf(第三方包名)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += \
            itextpdf:libs/itextpdf-5.5.9.jar
#第三方包需要通過LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES宣告

LOCAL_PROGUARD_FLAG_FILES := proguard.flags
##在編譯時如果提示包中有warning時,需要按照要求在檔案中寫dontwarn,proguard.flags需要自行建立,android studio不會建立這個檔案
下面是我寫的android.mk,以供參考:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)


LOCAL_PACKAGE_NAME := 應用名


LOCAL_CERTIFICATE := platform


#如果使用的系統的包,需要引入他們使用的資原始檔,否則會提示編譯資源找不到的錯誤
LOCAL_RESOURCE_DIR += frameworks/support/v7/appcompat/res
LOCAL_RESOURCE_DIR += frameworks/support/v7/gridlayout/res
LOCAL_RESOURCE_DIR += frameworks/support/v7/recyclerview/res
LOCAL_RESOURCE_DIR += frameworks/support/design/res

LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/res

src_dirs := java/

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

#LOCAL_SRC_FILES += \
# src/xx/xx/xx/XxxOne.aidl \
# src/xx/xx/xx/XxxTwo.aidl

LOCAL_STATIC_JAVA_LIBRARIES +=  design \
                                android-support-v4 \
                                itextpdf \
                                android-support-v7-appcompat \
                                android-support-v7-recyclerview \
                                recyclerview-v7

LOCAL_PREBUILT_JNI_LIBS := jniLibs/xx/libxxx.so

LOCAL_MULTILIB := 32

LOCAL_PROGUARD_FLAG_FILES := proguard.flags

LOCAL_AAPT_FLAGS := --auto-add-overlay
LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompat
LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.gridlayout
LOCAL_AAPT_FLAGS += --extra-packages com.android.datetimepicker
LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.recyclerview
LOCAL_AAPT_FLAGS += --extra-packages android.support.design

LOCAL_PROGUARD_ENABLED := disabled

include $(BUILD_PACKAGE)

include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += \
itextpdf:libs/itextpdf-5.5.9.jar

include $(BUILD_MULTI_PREBUILT)

include $(call all-makefiles-under,$(LOCAL_PATH))



特別補充:
1.第三方APP如果使用到了design-xx.jar包中的類,編譯可以通過,但是在使用時APP會出現crash問題,log反應是design中類找不到。design是android提供的jar包,出現這個問題是,要去framework/support/design/目錄下執行mm編譯出design對應的jar包,再編譯app,這時編譯出的apk就沒有找不到類的異常了

2.可以把android.mk放到應用的跟根目錄下,這時候需要修改java檔案,資原始檔,包的引用目錄地址

3.忘了是從哪篇看到了,博主若要本人刪除,請聯絡我。。。

相關推薦

Android各類.mk檔案編寫

LOCAL_PATH:= $(call my-dir)  include $(CLEAR_VARS) LOCAL_STATIC_JAVA_LIBRARIES := xsocket jackson-mapper logging jackson-core javatar lo

Android5.1 內建第三方APK及Android.mk檔案編寫(以在amlogic5.1公版系統內建百度輸入法為例)

Android.mk檔案用來向編譯系統描述如何編譯你的原始碼。在編譯整個工程的情況下,系統所找到的所有的Android.mk將會先存入subdir_makefiles變數中,隨後一次性一次性include進整個編譯檔案中。 示例 Android.mk內容:

android讀取properties檔案

java中經常用到properties檔案,然後通過使用Properties類來解析,這裡不再陳述使用properties檔案的好處,主要探討如何在android中使用properties檔案! 方法一:context.getAssets()  因為最終是通過流檔案來進行prop

安卓開發筆記(五)——資料儲存SharedPreference以及Android常見的檔案操作方法

中山大學資料科學與計算機學院本科生實驗報告 (2018年秋季學期) 一、實驗題目 個人專案3 資料儲存(一)應用開發 二、實現內容 第九周任務 實驗目的 學習SharedPreference的基本使用。 學習Android中

SSM框架JAVAWEB專案各類配置檔案模板及作用

最近學習ssm框架的一些東西,首先就是各種配置檔案,以及檔案和專案中類和介面的對映關係,稍稍總結記錄,以做不時之需 如有不正確的地方,請留言指正。 1、web.xml檔案 這個檔案是建立web專案時生成的,預設路徑:main/WEB-INF/web.xml 首先看下總體的模板吧

Android編譯過程總結及android各種img檔案的作用以及系統啟動過程

編譯環境:ubuntu 10.04(或者更高)(windows平臺目前不被支援) 本文以編譯android2.3為例,64位作業系統 1、編譯環境的準備  (1)確保安裝有ubuntu系統或者虛擬機器 (2)安裝JDK1.6(對於Android2.3以上程式碼) $ sud

Androidxml佈局檔案使用include引入佈局進行復用(解決使用include佈局重疊,顏色設定無效問題)

使用include引入佈局的作用   提取重複的佈局程式碼,方便進行復用 如何使用   比如我們想要線上性佈局中建立三塊需要複用的佈局headview、centerview、butto

【String.xml】修改Androidstrings.xml檔案, 動態改變資料

有些朋友可能會動態的修改Android中strings.xml檔案中的值,在這裡給大家推薦一種簡單的方法。strings.xml中節點是支援佔位符的,如下所示: <string name="data">整數型:%1$d,浮點型:%2$.2f,字串:%3$s&

Androidattrs.xml檔案的使用詳解

1. attrs.xml 的作用 控制元件有很多屬性,如 android:id、android:layout_width、android:layout_height等,但是這些屬性都是系統自帶的屬性。使用attrs.xml檔案,可以自己定義屬性,下面我會寫些小

AndroidAndroidManifest清單檔案以及許可權詳解!

每個Android應用都需要一個名為AndroidManifest.xml的程式清單檔案,這個清單檔名是固定的並且放在每個Android應用的根目錄下。它定義了該應用對於Android系統來說一些非常重要的資訊。Android系統需要這些資訊才能正常執行該應用。Android程式清單檔案主要具有下面作用:

解決Android單個dex檔案方法數越界的問題

通常一個Android應用中單個dex檔案所能包含的最大方法數為65536個,這包含FrameWork、依賴的第三方jar包以及應用本身程式碼中的所有方法。 一般來說一個簡單的應用裡面的方法很難達到65536這個值,但是對於一些比較大型的專案來說,65536也是比較容易達

編寫Android.mk檔案備錄

前言:     由於目前供職於機器人公司,從事基於android系統的軟體開發,因此常常需要進行原始碼編譯(當然也可以基於機器人的sdk和android studio環境進行開發)。   進行原始碼編譯,少不了編寫Android.mk檔案。通常類比前人的Android.mk檔案修修改

在原始碼環境編譯Android studio專案時的mk指令碼編寫

1、Main專案是主工程,下面有名為app的專案       CommonLib是庫工程,下面有名為lib的專案       Main專案會用到CommonLib庫。 2、原始碼環境中兩個專案是在同一個目錄下,平級的。Android.mk分別在各自的根目錄下。 3、參考

專案Android.mk檔案根據專案名稱選擇不同的AndroidManifest.xml檔案 && 如何使用系統設定的日期顯示格式

專案中根據專案名稱選擇不同的AndroidManifest.xml檔案 MY_PROJECT_NAME := $(subst full_,,$(TARGET_PRODUCT)) ifeq ($(strip $(MY_PROJECT_NAME)), xxxxxx)# xxxx

關於androiddrawable資料夾下各類xml樣式檔案的使用詳解

1、引言 在Eclipse中android程式專案目錄結構下的res資料夾新建drawable資料夾,並在drawable資料夾下新建各類的xml樣式檔案,供layout資料夾下的xml佈局檔案引用,以滿足對程式介面的需求開發。如圖1和圖2是drawable下

ndk開發Android.mk檔案與Application.mk詳解及例項

Android.mk檔案的作用: An Android.mk file is written to describe your sources to the build system. 中文意思是:寫一個Android.mk檔案是為了向生成系統描述你的原始碼。

Android多媒體檔案、文件以及各類檔案的獲取

最近專案中需要對好友進行傳送檔案需求,在android中對檔案以及其它文件的獲取一直沒有找到一個好的案例,自己在分析“仿小米資料夾管理”時感覺自己非常的菜B,看不懂原始碼。我也問了他人的思路,但是他們給我遞迴方法去掃描感覺很2B,想想在android中就QQ的檔案目錄都大

Android初試--Android檔案操作之SDcard操作(2)

SDCARD:通俗的說,就像外接硬碟。 在模擬器中使用SDCard,你需要先建立一張SDCard卡(當然不是真的SDCard,只是映象檔案)。建立SDCard可以在Eclipse建立模擬器時隨同建立,也可以使用DOS命令進行建立,在DOS視窗中進入android SDK安裝路徑的tools

Android初試--Android檔案操作之ROM操作(1)

RAM(Random Access Memory)隨機儲存器,在手機中稱為執行記憶體。通俗的說,就像電腦的記憶體。在斷電以後儲存在上面的資料會自動消失。 ROM(Read-Only Memory)只讀儲存器,存放手機韌體程式碼的儲存器,比如手機的作業系統、一些應用程式如遊戲等。通俗的說,就

LeakCanary Android 記憶體洩漏分析利器 原始碼編譯配置mk檔案

LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := \ $(call all-java-files-under, src) LOCAL_SRC_