需求:引入第三方的jar 包,但是只编译进中国的产品中,国外的产品不能有这个jar文件。
因为所有产品的代码都是一套,如果直接import 第三方API的话,会导致某些产品编译不通过,所以只有采用反射的方式比较合适。
1,编写Android.mk文件
# ============================================================
# Copy the lib (yellowpage-services.jar) to /system/framework
# ============================================================
include $(CLEAR_VARS)
LOCAL_MODULE := yellowpage-services.jar
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)
LOCAL_SRC_FILES := $(LOCAL_MODULE)
LOCAL_REQUIRED_MODULES := yellowpageAPI.xml
include $(BUILD_PREBUILT)
# ============================================================
# Install the permissions file into system/etc/permissions
# ============================================================
include $(CLEAR_VARS)
LOCAL_MODULE := yellowpageAPI.xml
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)
yellowpageAPI.xml:
<permissions>
<library name="yellowpage-services"
file="/system/framework/yellowpage-services.jar" />
</permissions>
在使用此jar包的工程的AndroidManifest.xml添加:
<uses-libraryandroid:name="yellowpage-services"android:required="false"/>
这是我在做一个集成第三方(jar,apk)实际例子。碰到的问题:
1,按照上面的Android.mk,使用反射的时候,一直报找不到第三方的类的exception。检查发现在/system/framework和/system/etc/perssiom也有jar和xml文件。
后来发现反射需要使用Classes.dex,而第三方给的jar中没有,后来加进去后就行了。因为Android的虚拟机Dalvik vm不能像java的虚拟机一样动态识别jar中的byte code。所以需要执行dx --dex --output="classes.dex" ./yellowpage-services.jar,得倒classes.dex文件,然后执行aapt add yellowpage-services.jar classes.dex,把classes.dex加入到yellowpage-services.jar
2,用反射的时候,出现了OOM, 解决的办法是把Class.forName("***")放到static{}中,只调用一次