文章來源:https://my.oschina.net/zhoulc/blog/112573
通常我們進行android開發(fā)的時候運用到了兩種格式的jar包文件。
1.在eclipse環(huán)境下,引入第三方jar包,指的是通過eclipse工具export出來的包含.class文件的jar包。
2.在源碼環(huán)境下,通過配置Android.mk文件生成的jar包,也是我們在源碼下開發(fā)依賴的jar包文件是包含class.dex的jar包文件。class.dex 是通過Android系統(tǒng)中可以在Dalvik虛擬機上直接運行的文件格式。
兩個jar包之間的轉(zhuǎn)換:1).class=>class.dex dx工具的作用是將.class轉(zhuǎn)換為dex文件
2)class.dex=>.class 可以使用反編譯工具
具體如何通過Eclipse 導出jar包以及在源碼下生成jar包就不詳述了,網(wǎng)上資料很多
第三方jar包依賴的緣由:
在平常過程中,假如項目需要支持引用第三方jar包,假如是通過Eclipse進行開發(fā),直接是把含有.class文件的jar包直接加載到項目中,最后編譯出來的apk里面就包含了整個jar包文件(class.dex),假如是通過源碼進行編譯,在Android.mk里面直接添加對system/framework下面jar包文件的依賴,最后jar包文件也和apk編譯到了一起。
由于此次開發(fā)項目需要做到,app應用與jar包分離,也就是jar包文件需要獨立出來,不能與apk編到一起,通俗來講就是apk的大小將大大減小。
一、在Eclipse下新建一個Java Project(作為jar包文件)
在Person類里面實現(xiàn)一些接口,屬性,如果Person類調(diào)用了android sdk方法,請看第二步,如果沒有直接跳過第二步驟,進行第三步驟。(作者在jar包中沒有調(diào)用android SDK中的方法)
android.jar包到SDK里面自帶的例子里面找。在工程上點擊鼠標右鍵,在properties里面Java Build Path -> Libraries-》Add Jars選擇android.jar.
三、為工程添加注冊文件<permission xml file name>.xml
該文件是用來向系統(tǒng)注冊庫用的,名稱可以自己定,在下面假設該文件為 mylibxml.xml。
在文件中加入以下內(nèi)容:
- <?xml version="1.0" encoding="UTF-8"?>
- <permissions>
- <library name="com.mytest.lib"
- file="/system/framework/mylib.jar"/>
- </permissions>
其中的 library 用于將其下的 name 和 file 兩個屬性關聯(lián)起來,name 的值后邊會用到。
這里的 name 指定為工程的包名。
這里的 file 指定為庫文件的存放路徑,應該是:
/system/framework/<jar file name>.jar
四、為工程添加makefile文件
在庫文件工程的根目錄下創(chuàng)建以下文件:
Android.mk
該文件是用來編譯工程的,名稱固定。
在文件中加入以下內(nèi)容:
- 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 文件。
五、把java project所有代碼拷入android源碼的編譯環(huán)境
一般拷入到system/app/下面
然后通過mm編譯,在android源碼編譯環(huán)境中將會生成一個 .jar 文件和一個 .xml 文件。
以上兩個文件是應用程序在運行時需要用到的。
調(diào)試應用前,需要將兩個文件拷貝到設備的相應目錄上去:
.jar 文件:/system/framework/
.xml 文件:/system/etc/permissions/
拷貝到設備使用以下命令:
$ sudo adb push <.jar or .xml file path> <path in device>
拷貝完以后需要重啟設備。
六、前期準備工作基本就緒,開始寫測試case。(驗證apk是否能在設備中找到jar包文件)
(1)使用Eclipse工具新建一個Android 測試case
注:正常情況下,編譯器會給我們報錯,我這里為了看著舒服,就通過Eclipse把上面的java project導出成了一個jar文件加載進來了,所以編譯器沒有提示報錯信息。
(2)編輯AndroidManifest.xml文件
編輯工程根目錄下的 AndroidManifest.xml 文件。
在 application 下添加以下內(nèi)容:
<uses-library
android:name="com.mytest.lib">
</uses-library>
其中的 :name 表示所引用的庫文件的包名。
其與庫工程的 .xml 文件中的 name 應該是一致的。
這樣在應用運行時就能夠找到相應的 .jar 文件了。
如果引用了多個庫,需要添加多個 uses-library 標簽。
在庫文件工程的根目錄下創(chuàng)建以下文件:
Android.mk
該文件是用來編譯工程的,名稱固定。
在文件中加入以下內(nèi)容:
- 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源碼編譯環(huán)境編譯
把測試case同樣拷入system/app下面
然后通過mm編譯生成了myapp.apk
然后通過adb install 命令把apk安裝到設備
最后按照常規(guī)方式用eclipse編譯生成的apk與通過此方法編譯生成的apk,發(fā)現(xiàn)兩個大小差異非常大
聯(lián)系客服