如何使用空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包中的接口。