如何使用空jar包实现动态加载技术
来源:互联网 发布:菲律宾网络娱乐牌照 编辑:程序博客网 时间:2024/06/16 18:17
动态jar包技术是一种动态引用技术,即平台提供一个空的静态jar包给第三方应用,保证第三方应用引用到jar包中的接口时能编译通过,而接口的具体实现却是在平台系统层动态实现,表面上应用层引用的是静态jar包中的接口,实际调用的却是本平台终端动态jar部署的接口。
优点:实现了代码解耦,模块清晰化;平台在不影响第三方使用的前提下可动态修改接口的实现,封装灵活性更高;上层应用无法查看接口的具体实现,版权保密性更高;
缺点:上层应用引用动态jar包之后在gradle、打包和清单文件中的配置增多,否则不能正确引用;平台还需要生成。具体配置参考以下注意点。
下面以生成com.haming.xxx.jar为例说明具体需要配置的地方。
应用引用动态jar包注意点:
1)、由于jar包中很多接口调用到Android原生系统接口,要求三方应用拥有系统权限”android.uid.system”,具体配置参考以下代码片段:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.haming.xxx" android:sharedUserId="android.uid.system">
2)、另外需要在清单文件中加入uses-library,以便于应用在调用时能真正引用到系统固件里对应的接口,实现动态加载。参考代码片段如下:
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <uses-library android:name="com.haming.xxx"/>...... //此处省略很多行 </application>
3)、做完以上操作,还需要配置的是在build.gradle进行如下修改,确保这个空jar包在编译时不被打包到apk中。
//compile fileTree(dir: 'libs', include: ['*.jar']) provided files('libs/com.haming.xxx.jar')4)、最后还需要在平台内部生成权限文件,注意生成的权限文件名必须和jar包名称一致,生成的文件最终是保存在/system/etc/permission/下:
就比如生成com.haming.xxx.jar的权限文件com.haming.xxx.xml
<?xml version="1.0" encoding="utf8"?><permissions> <library name="com.haming.xxx.xml" file="/system/framework/com.haming.xxx.jar"/></permissions>
接下来简要的说明一下动态jar包的开发和生成步骤:(这里以android studio为开发工具)1、在android studio中新建一个工程,指定对应的包名为:com.haming.xxx, 这个包名必须和平台动态jar的包名保持一致,否则上层应用在调用静态jar中的接口时会找不到对应的动态jar包里的接口。
生成对应的jar包(具体生成步骤这里不做阐述,后续有机会再写):com.haming.xxx.jar // 这个jar包里面接口的方法体都是空的,用于提供给第三方的应用调用
package com.haming.xxx;import android.content.Context;/** * Created by haming on 17-11-02. */public class CommonManager { private Context mContext; /** * @param context * @retrun the object which is constructed from the Context. */ public CommonManager (Context context){ this.mContext = context; } public void mathod1(){ //注意此处的接口方法体是空的 }
}2、在系统framework层建立动态jar包的模块
比如我就是在/framework/base/cmds/haming/目录下建立的自己的模块,模块构成有:
/framework/base/cmds/haming/src/com/haming/xxx/CommonManager.java
/framework/base/cmds/haming/Android.mk
/framework/base/cmds/haming/com.haming.xxx.xml
这里面的CommonManager.java中就需要把接口的具体实现都写出来,com.haming.xxx.xml就是前面所说的权限文件,最后会一起编译生成对应的XML文件。
Android.mk的具体实现如下:
LOCAL_PATH:= $(call my-dir)#MAKE_JARinclude $(CLEAR_VARS)LOCAL_MODULE := com.haming.xxxLOCAL_DEX_PREOPT := falseLOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_MODULE_TAGS := optionalinclude $(BUILD_JAVA_LIBRARY)#MAKE_XMLinclude $(CLEAR_VARS)LOCAL_MODULE := com.haming.xxx.xmlLOCAL_MODULE_CLASS := ETCLOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissionsLOCAL_SRC_FILES := $(LOCAL_MODULE)LOCAL_MODULE_TAGS := optionalinclude $(BUILD_PREBUILT)这样在整个系统代码编译完之后(当然你也可以单独编译这一个模块),你能在system/framework/目录下看到你所生成的动态jar包,在system/etc/permission/目录下看到生成的权限文件,然后报这些文件都push到平台设备对应的目录下,重启设备。
/out/target/product/platform/system/framework/com.haming.xxx.jar
/out/target/product/platform/system/etc/permission/com.haming.xxx.xml
3、上述操作做完之后,你就可以开始开发第三方应用程序了,第三方应用程序引用上述第1步中生成的静态jar包,然后结合上面所说的注意点1),2),3)进行配置,最后编译生成对应的apk,经过系统签名之后生成signed.apk,这时你就可以通过:
adb install -r signed.apk
将生成的应用直接安装到平台设备上,这时就可以在第三方应用中调用jar包中的接口。
- 如何使用空jar包实现动态加载技术
- 深入浅出Android动态加载jar包技术
- 深入浅出Android动态加载jar包技术
- Android如何动态加载jar包
- 实现java classloader 动态加载jar包
- java动态加载jar包
- java动态加载jar包
- java动态加载jar包
- android动态加载jar包
- android动态加载jar包
- JAVA动态加载JAR包
- Java 动态加载jar包
- Android动态加载JAR包的实现方法
- Android动态加载Jar包并实现Native方法
- Android 如何动态加载 .jar
- Android 如何动态加载 .jar
- 动态加载jar包的方法
- ClassLoader和动态加载Jar包举例
- linux交叉编译VLC的webPlugin--npapi-vlc/npapi-vlc的交叉编译
- win 10系统安装jdk 64位
- Spring详细教程
- Java NIO (二) 通道(Channels)
- 吴恩达deeplearning.ai课程系列笔记08
- 如何使用空jar包实现动态加载技术
- c语言练习(3)
- linux下find(文件查找)命令的使用
- Android studio 导入Eclipse 项目
- Servlet技术
- spring-DI注入(1设值注入,2构造注入,3集合注入)
- 证明:AB+AC>DB+DC(D为三角形ABC的一个内点)。
- CSS选择器
- simple.data强类型转换