最近在做一个项目,第三方给出相应的porting API接口,要求我们按照功能封装成jar,为了项目的顺利推进及后续的更新方便,第三方要求将封装的api接口放在系统下面编译成系统jar包;
直接上图:
jar工程验证的文件结构;
以下是Android.mk文件内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := fmradioif——自己随便命名,最好是相应的包名
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
src/java/com/ti/fm/IFmRadio.aidl
include $(BUILD_JAVA_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := com.ti.fm.fmradioif.xml
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)
生成的系统jar包放在system\framework下面
文件存放在system\etc\permissions下面,注意name是所使用jar起的名字,唯一即可,在apk中会使用到保持一致即可。
然后file指明jar的路径及名称,注意与编译生成时的一致。
以下是com.ti.fm.fmradioif.xml内容<?xml version="1.0" encoding="utf-8"?>
<permissions>
<library name="fmradioif"
file="/system/framework/fmradioif.jar"/>
</permissions>
apk如何引用,在所需要使用的AndroidManifest.xml中添加:
<uses-library android:name="android.user.library" />
经过验证可以达到在第三方升级更改他们应用的情况, 我们的jar不动;我们更新jar porting后第三方不用重新打包他们的APK;
不过这种方式必须有系统相应编译环境才行;个人的开发经验来看 推荐使用
DexClassLoader类 或者 PathClassLoader类来实现动态更新加载——这种方式在我的另一个项目中使用很方便,可以放在网络服务器上随时更新,这就是目前大家使用比较多的android插件开发;