Apkplug 快速接入指南(fastdoc)

开发流程

一、后台操作

1 注册/登陆

使用云端插件托管需要有一个Apkplug账号来登陆后台。

2 创建应用

为了能够识别为哪个宿主应用下载插件或更新插件,需要首先创建一个主应用,其中应用详情中有应用必须配置的appid和publickey

3 创建插件

创建插件以供下载或更新

为插件添加apk文件

二、插件开发

插件开发首先需要引入osgi.jar(只引用不打包,参考osgi引入),插件可以是一个普通apk,不同之处即以下几点:

1、需要在assets里加如一个plugin.xml,plugin.xml格式如下:

<?xml version="1.0" encoding="UTF-8"?>

<plugin-features

Bundle-Name="Plug"

Bundle-SymbolicName="com.xxx.xxx"

Bundle-Version="1.0.0"

Bundle-Activator="com.xx.xxx"

date="2016.08.26"

provider-name="APKPLUG"

start-level ="1"

start-up="true"

Use-Host-MetaData="true"

Short-Links=""

plug_id=""

>

<rpc-processor uri="apkplug://xxx/xxx"

    className="com.xxx.xxx"/>

</plugin-features>







1 plug_id             --插件id,用于标识这个插件,在后台插件详情获取

2 Short-Links      --短链方式操作的插件需要把插件短链的值配置到这个项

3.Bundle-Name          --插件名称

4.Bundle-SymbolicName  --插件唯一标识类似安卓程序应用标识

5.Bundle-Version       --插件版本号 如100

6.Bundle-Activator     --插件入口类 ,通过它框架可在启动插件的时候找到并调用start()函数

7.Bundle-Activity      --插件的 Lanucher Activity路径(多个包以 ‘,‘ 分割)

8.Export-Package       --提供给其他插件使用的java类需要导出对应包路径(多个包以 ‘,‘ 分割)

9.Import-Package       --插件内部没有这样的java类需要从其他插件导入(多个包以 ‘,‘ 分开)

10.Bundle-Service       --插件的Service类路径  (多个包以 ‘,‘ 分割)   【v2.0.0新增】

11.Bundle-Receiver      --插件接收系统广播类路径  (多个包以 ‘,‘ 分割)   【v2.0.0新增】

2、可以实现一个BundleActivator作为插件入口,并配置在plugin.xml中,参考1

3、可以通过插件通信方式对外提供功能实现

插件间通信参考下面文档:

RPC方式

三、 宿主应用开发

1 下载sdk jar包和so文件,并在工程中引入

SDK下载链接:下载

2 配置manifest文件

权限配置

<uses-permission android:name="android.permission.ACCESSNETWORKSTATE" />

<uses-permission android:name="android.permission.BINDMIDIDEVICESERVICE" />

<uses-permission android:name="android.permission.READPHONESTATE" />

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.MOUNTUNMOUNTFILESYSTEMS" />

<uses-permission android:name="android.permission.READEXTERNALSTORAGE"/>

<uses-permission android:name="android.permission.WRITEEXTERNALSTORAGE"/>

<uses-permission android:name="android.permission.MOUNTUNMOUNTFILESYSTEMS"/>

Application标签内配置

<meta-data android:name="apkplug_appid" android:value="appid : 后台应用详情中去复制"/>



<meta-data android:name="apkplug_containerid" android:value="containerid: 后台容器详情中复制"/>(使用容器绑定方式需要配置,使用短链不用)



<activity android:name="org.apkplug.app.apkplugActivity"

    android:theme="@android:style/Theme.Translucent.NoTitleBar"

    android:configChanges="orientation|keyboardHidden">



    <intent-filter>

    <action android:name="android.intent.action.MAIN"></action>

    </intent-filter>



</activity>



<service android:name="org.apkplug.app.apkplugService"/>

<service android:name="com.apkplug.libmerge.common.MergeServeice"

    android:process=":merge" />



<provider android:name="org.apkplug.app.apkplugProvider" android:authorities="xxx.apkplugprovider"/>

3 初始化sdk

在使用任何api前保证已经调用过如下初始化代码,初始化一次即可

PlugManager.getInstance().init(this,FrameworkFactory.getInstance().start(null,this).getSystemBundleContext(), "你的publickey");

4 从云端安装插件

安装插件需要先查询云端有哪些插件

PlugManager.getInstance().getPlugInfo(new GetPlugInfoRequest(), new OnGetPlugInfoListener() {

            @Override

            public void onSuccess(List<PlugInfo> plugInfos) {



                showInfo(infoList);

            }



            @Override

            public void onFailure(String responseMsg) {

                Log.d("onFailure",responseMsg);

            }

        });

在onSuccess回调里可以得到插件的列表,然后利用这些pluginfo只需一个函数即可从云端安装插件

PlugManager.getInstance().installPlug(context, plugInfo, new OnInstallListener() {

    @Override

    public void onDownloadProgress(String url, String filePath, long bytesWritten, long totalBytes) {

        Log.d(filePath,"had downloaded "+bytesWritten+" all in "+totalBytes);

    }



    @Override

    public void onInstallSuccess(org.osgi.framework.Bundle bundle, PlugInfo plugInfo) {

        Log.d("onInstallSuccess",bundle.getName()+" had installed");

    }

    @Override

    public void onInstallFailuer(int i,org.osgi.framework.Bundle bundle, PlugInfo plugInfo,String errorMsg) {

        Log.d("onInstallFailure",bundle.getName()+errorMsg);

    }



    @Override

    public void onDownloadFailure(String errorMsg) {

        Log.d("failure",errorMsg);

    }

});

5 使用短链安装插件

如果想直接从云端安装一个插件可以使用短链的形式,这种方式不需要容器,但需要插件的plugin.xml里配置一个:Short-Links=“你的短链”,短链在插件详情中获得。

短链方法安装:

PlugManager.getInstance().installPlugFromShortLink("http://yyfr.net/q0Y", new OnInstallSLPlugListener() {

    @Override

    public void onDownloadProgress(String s, String s1, long l, long l1) {

        System.out.println("正在下载 百分比:"+l/l1);

    }



    @Override

    public void onInstallSuccess(org.osgi.framework.Bundle bundle) {

        System.out.println("安装成功了");

    }



    @Override

    public void onInstallFailuer(int i, String s) {

        System.out.println("安装失败了");

    }



    @Override

    public void onDownloadFailure(String s) {

        System.out.println("下载失败了");

    }

});

6、 安装本地插件

Apkplug最简单的使用场景就是安装本地插件,只要把插件apk放到assets目录,即可安装到主应用中使用。

安装assets插件:

PlugManager.getInstance().installAssets(context,"assets中apk的文件名",“插件版本号”,OnInstallListener listener)

如上即可安装成功

7 使用插件

如果使用插件的四大组件,可以像同一个应用那样使用,这里不做举例。如果是使用插件的一些功能函数,则可以参考这个文档:

RPC方式

8 更新插件

使用如下方法可以查询本地安装了哪些插件,每一个bundle代表一个插件:

BundleContext context =frame.getSystemBundleContext();

Bundle[] plugs = context.getBundles();

for(int i=0;i<plugs.length;i++)

{

//获取已安装插件

//打印插件信息

   Bundle b = plugs[i];

  StringBuffer sb=new StringBuffer();

  sb.append("\n插件名称:"+b.getName());

  sb.append("\n插件应用名称:"+b.getSymbolicName());

  sb.append("\n插件版本:"+b.getVersion());

  sb.append("\n插件ID:"+b.getBundleId());

  sb.append("\n插件当前状态:"+b.getState());

  sb.append("\n插件启动Activity:"+b.getBundleActivity());

  System.out.println(sb.toString());

}

获取本地插件后,可以调用如下函数进行更新,:

PlugManager.getInstance().updataPlug(bundle , new OnUpdataListener() {

        @Override

        public void onDownloadProgress(String url, String filePath, long bytesWritten, long totalBytes) {

            Log.d(filePath,"had downloaded "+bytesWritten+" all in "+totalBytes);

        }



        @Override

        public void onUpdataSuccess(org.osgi.framework.Bundle bundle) {

            Log.d("onInstallSuccess",bundle.getName()+" had installed");

        }



        @Override

        public void onUpdataFailuer(int i, org.osgi.framework.Bundle bundle,String errorMsg) {

            Log.d("onInstallFailuer",bundle.getName()+errorMsg);

        }



        @Override

        public void onDownloadFailure(String errorMsg) {

            Log.d("failure",errorMsg);

        }

    });

使用短链方式更新

如果你的插件是通过短链安装的,同样可以用短链更新:

PlugManager.getInstance().updatePlugByShortLink("http://yyfr.net/q0Y", new OnUpdateSLListener() {

    @Override

    public void onDownloadProgress(String s, String s1, long l, long l1) {

         System.out.println("正在下载 百分比:"+l/l1);

    }



    @Override

    public void onUpdataSuccess(org.osgi.framework.Bundle bundle) {

        System.out.println("更新成功了");

    }



    @Override

    public void onUpdataFailuer(int i, String s) {

        System.out.println("更新失败了");

    }



    @Override

    public void onDownloadFailure(String s) {

        System.out.println("下载失败了");

    }

});

9 示例demo

ApkplugDemo