一般咱們進行android開發的時候運用到了兩種格式的jar包文件。 java
1.在eclipse環境下,引入第三方jar包,指的是經過eclipse工具export出來的包含.class文件的jar包。 android
2.在源碼環境下,經過配置Android.mk文件生成的jar包,也是咱們在源碼下開發依賴的jar包文件是包含class.dex的jar包文件。class.dex 是經過Android系統中能夠在Dalvik虛擬機上直接運行的文件格式。 shell
兩個jar包之間的轉換:1).class=>class.dex dx工具的做用是將.class轉換爲dex文件 app
2)class.dex=>.class 可使用反編譯工具 eclipse
具體如何經過Eclipse 導出jar包以及在源碼下生成jar包就不詳述了,網上資料不少 工具
第三方jar包依賴的原因: 測試
在日常過程當中,假如項目須要支持引用第三方jar包,假如是經過Eclipse進行開發,直接是把含有.class文件的jar包直接加載到項目中,最後編譯出來的apk裏面就包含了整個jar包文件(class.dex),假如是經過源碼進行編譯,在Android.mk裏面直接添加對system/framework下面jar包文件的依賴,最後jar包文件也和apk編譯到了一塊兒。
因爲這次開發項目須要作到,app應用與jar包分離,也就是jar包文件須要獨立出來,不能與apk編到一塊兒,通俗來說就是apk的大小將大大減少。 ui
1、在Eclipse下新建一個Java Project(做爲jar包文件) spa
在Person類裏面實現一些接口,屬性,若是Person類調用了android sdk方法,請看第二步,若是沒有直接跳過第二步驟,進行第三步驟。(做者在jar包中沒有調用android SDK中的方法) 調試
2、在TestToJar工程裏面添加對Android jar包的引用(即SDK接口)
android.jar包到SDK裏面自帶的例子裏面找。在工程上點擊鼠標右鍵,在properties裏面Java Build Path -> Libraries-》Add Jars選擇android.jar.
3、爲工程添加註冊文件<permission xml file name>.xml
該文件是用來向系統註冊庫用的,名稱能夠本身定,在下面假設該文件爲 mylibxml.xml。
在文件中加入如下內容:
<?xml version="1.0" encoding="UTF-8"?> <permissions> <library name="com.mytest.lib" file="/system/framework/mylib.jar"/> </permissions>
其中的 library 用於將其下的 name 和 file 兩個屬性關聯起來,name 的值後邊會用到。
這裏的 name 指定爲工程的包名。
這裏的 file 指定爲庫文件的存放路徑,應該是:
/system/framework/<jar file name>.jar
4、爲工程添加makefile文件
在庫文件工程的根目錄下建立如下文件:
Android.mk
該文件是用來編譯工程的,名稱固定。
在文件中加入如下內容:
LOCAL_PATH:= $(call my-dir) #MAKE_JAR 編譯jar包過程到 /system/framework下面 APK須要的jar包include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_MODULE := mylib include $(BUILD_JAVA_LIBRARY) #MAKE_XML 編譯XML過程到 /system/etc/permissions/下面include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_MODULE := mylibxml.xml LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions LOCAL_SRC_FILES := $(LOCAL_MODULE) include $(BUILD_PREBUILT)
其中,MAKE_JAR 部分的 LOCAL_MODULE 部分指定爲想要生成的jar包文件的名字,
須要與 .xml 文件中的 library 下的 file 部分一致。
其中,MAKE_XML 部分的 LOCAL_MODULE 部分指定爲用於註冊庫的 .xml 文件。
5、把java project全部代碼拷入android源碼的編譯環境
通常拷入到system/app/下面
而後經過mm編譯,在android源碼編譯環境中將會生成一個 .jar 文件和一個 .xml 文件。
以上兩個文件是應用程序在運行時須要用到的。
調試應用前,須要將兩個文件拷貝到設備的相應目錄上去:
.jar 文件:/system/framework/
.xml 文件:/system/etc/permissions/
拷貝到設備使用如下命令:
$ sudo adb push <.jar or .xml file path> <path in device>
拷貝完之後須要重啓設備。
6、前期準備工做基本就緒,開始寫測試case。(驗證apk是否能在設備中找到jar包文件)
(1)使用Eclipse工具新建一個Android 測試case
注:正常狀況下,編譯器會給咱們報錯,我這裏爲了看着舒服,就經過Eclipse把上面的java project導出成了一個jar文件加載進來了,因此編譯器沒有提示報錯信息。
(2)編輯AndroidManifest.xml文件
編輯工程根目錄下的 AndroidManifest.xml 文件。
在 application 下添加如下內容:
<uses-library
android:name="com.mytest.lib">
</uses-library>
其中的 :name 表示所引用的庫文件的包名。
其與庫工程的 .xml 文件中的 name 應該是一致的。
這樣在應用運行時就可以找到相應的 .jar 文件了。
若是引用了多個庫,須要添加多個 uses-library 標籤。
在庫文件工程的根目錄下建立如下文件:
Android.mk
該文件是用來編譯工程的,名稱固定。
在文件中加入如下內容:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_JAVA_LIBRARIES := mylib LOCAL_PACKAGE_NAME := myapp LOCAL_CERTIFICATE := platforminclude $(BUILD_PACKAGE)
其中的 LOCAL_JAVA_LIBRARIES 表示程序會用到的庫文件。
其名成與庫工程下的 .mk 文件中 MAKE_JAR 部分下的 LOCAL_MODULE 應該是一致的。
其中的 LOCAL_PACKAGE_NAME 表示應用最後生成的名稱。
(4)把Android 測試case拷入android源碼編譯環境編譯
把測試case一樣拷入system/app下面
而後經過mm編譯生成了myapp.apk
而後經過adb install 命令把apk安裝到設備
最後按照常規方式用eclipse編譯生成的apk與經過此方法編譯生成的apk,發現兩個大小差別很是大