Apkplug 安卓插件化开发以及应用热更新

当下移动互联网高速发展,企业纷纷向移动化转型,移动应用更成为创业者的宠儿,随着移动应用热度的提升,各种第三方库层出不穷,apk的体积也越来越大,很容易就触到著名的65535界限。因此我们推出 ApkPlug:android 插件化开发框架,它能帮您解决65535问题,同时也是一种新的开发方式。

ApkPlug: 为开发者提供插件化,模块化,轻应用开发方案。你可利用它解决 apk 文件过大,代码臃肿,更新代价大等问题。以及支撑应用内更新,支撑第三方插件接 入等功能。同时 APKPLUG 还提供移动支付聚合,渠道接入等 众多实用开发工具。

移动应用开发另一个绕不开的问题就是版本控制,移动应用不像服务器应用,有新版随时发布就行了,通常手机应用的更新都需要先提示用户,然后用户手动下载并重新安装。即使只更新一个图片也要这么做,这个过程中就有用户流失的风险。而且对于某些紧急bug,使用这种方式修复也是不方便的。我们提供的热更新服务能很好的解决这些的问题。

热更新:可以使您的apk在不打扰用户的情况下,后台更新,以便处理您的各种更新需求、bug修复等,可以做到对用户完全透明。

下图清晰的展示了ApkPlug和应用的关系

如下是ApkPlug的经典应用场景


插件化开发最核心最麻烦的莫过于插件和宿主间通信,ApkPlug提供一种类RPC通信方式,能比较简单方便的实现通信功能,下面是一个插件提供服务宿主使用服务的简单示例,示例如下:

1、声明通信接口:

public interface RpcTest {
    void test(String s, IHostBean bean, Action2<String,IPlugBean> callback);
}

2、声明通信数据接口

public interface IPlugBean {
    String getName();
}

public interface IHostBean {
    String getHostName();
    int getId();
}

3、服务实现 public class RPCProcessor implements RpcTest {

@Override
public void test(String s, IHostBean bean, Action2<String,IPlugBean> callback) {
    Log.e("sss",s);
    Log.e("bean",bean.getHostName());
    callback.call("plugrpc", new IPlugBean() {
        @Override
        public String getName() {
            return "plugbean";
        }
    });
}

}

4、服务注册

只需在asstes/plugin.xml中配置一个rpc-processor标签即可

<rpc-processor
    uri="apkplug://plug/rpc"
    className="com.apkplug.plug.RPCProcessor"
/>

5、服务获取

BundleRPCAgent agent = new  BundleRPCAgent(FrameworkFactory.getInstance().getFrame().getSystemBundleContext());

    try {
        RpcTest rpcTest = agent.syncCall("apkplug://plug/rpc",RpcTest.class);

        rpcTest.test("host", new IHostBean() {
            @Override
            public String getHostName() {
                return "host";
            }

            @Override
            public int getId() {
                return 2;
            }
        }, new Action2<String, IPlugBean>() {
            @Override
            public void call(String s, IPlugBean iPlugBean) {
                Log.e("action2",s+" "+iPlugBean.getName());
            }
        });

    } catch (Throwable throwable) {
        throwable.printStackTrace();
    }

热更新使用非常简单

1 在application中加入几行代码 在application的attachBaseContext方法中加入:

if(PackerManager.getInstance().applicationAttachBaseContext(ctx,this)){
    return;
}

在application的onCreate方法中加入:

if(PackerManager.getInstance().applicationOnCreate(this,“your publickey”)){
    return;
 }

2 调用更新方法

    PackerManager.getInstance().updata(new OnUpdataListener() {
        @Override
        public void onSuccess(String filePath, DownloadInfo downloadinfo) {
            //更新成功
     }

    @Override
    public void onFailure(int state, String responseMsg) {
        //LogUtil.e(state+" : "+responseMsg); 更新失败
    }

    @Override
    public void onProgress(String url, String filePath, long bytesWritten, long totalBytes) {
        //更新文件的下载过程
    }
});