精华内容
下载资源
问答
  • ApkPlug

    2014-09-16 17:11:00
    是以云与端并重的模式,开发者一方面可以使用ApkPlug提供的如插件托管,广告聚合等云服务一站式的集成移动应用的周边辅助功能。另一方面开发者可以根据自己业务,自己开发插件。将应用进行有效的分解和组装。这样...

         移动互联网的发展以前所未有的速度向前迈进,各种应用陈出不穷,而随着应用功能的不断深入发展,应用的体积和复杂度也成倍增加。现如今稍微大型的移动应用都可能超过数十兆,其中集成了不下于数十种功能和开发组件。怎样有效的管理和维护这些代码,并且完美的将其呈现给用户成为软件工程师和产品经理的共同问题。

       ApkPlug希望以模块化的思路来解决这一些列的问题,首先模块化在软件设计中并非一个新的概念,它以在过去数十年的软件开发发展中得到了广泛应用和验证。而如今随着移动应用的愈发臃肿,用户体验应用功能愈发复杂,此时模块化技术正当其时。

      ApkPlug是以云与端并重的模式,开发者一方面可以使用ApkPlug提供的如插件托管,广告聚合等云服务一站式的集成移动应用的周边辅助功能。另一方面开发者可以根据自己业务,自己开发插件。将应用进行有效的分解和组装。这样不仅简化了移动应用开发流程同时也降低了应用的开发和维护成本。


    转载于:https://my.oschina.net/u/1376153/blog/314192

    展开全文
  • apkplug开发案例

    2013-10-22 07:13:26
    apkplug插件化开发框架的开发demo,功能展示的很到位
  • android apkplug

    2015-12-09 14:09:24
    ApkPlug ApkPlug是一款Android系统下的模块化解决方案,可以帮助开发者以模块化方式开发和改造应用,ApkPlug为开发者从“云”和”端”两个方向提供API。ApkPlug可以帮开发者减少APK应用代码,缩小APK应用体积。...
    ApkPlug
    
    ApkPlug是一款Android系统下的模块化解决方案,可以帮助开发者以模块化方式开发和改造应用,ApkPlug为开发者从“云”和”端”两个方向提供API。ApkPlug可以帮开发者减少APK应用代码,缩小APK应用体积。ApkPlug同时支撑动态加载、应用内进行更新升级,支持第三方插件接入,为开发者开发APP减少人力和时间成本。
    点豆科技自主研发的模块化开发框架Apkplug,是一款为Android APP 开发商提供模块化开发,应用内动态升级的解决方案。
    Apkplug框架具有开发简单和操作简单的特点,可以支持多apk融合,支持apk免安装运行等功能,是移动模块化开发的先驱者。
    组件市场
    ApkPlug组件市场 是专门为开发者开放的组件平台,初衷是希望能够通过集合众多移动开发工具组件,帮助开发者一键集成。
    应用内工具箱SDK
    基于ApkPlug实现的应用内工具SDK,可以更加便捷的为用户推送扩展功能与服务。
    移动广告平台聚合AdsPlug
    AdsPlug是基于ApkPlug技术实现的,几段代码不到500K大小的SDK即可接入全国20多种移动广告平台,如需新增广告只需在云端绑定一下。
    主题皮肤功能
    基于ApkPlug实现的主题换肤不同于一般意义上的图片替换,它是完全与Android原生样式相融合,也就可以设计出与原生主题样式一样丰富的主题。

    [url]http://www.apkplug.com/[/url]
    展开全文
  • apkplug主题功能目前处于授权付费阶段,应用须有apkplug.pem证书才会启用主题功能。 一 阅读授权服务协议  服务与授权> 二 申请获取apkplug.pem文件  将文件放入主应用的assets目录下(文件名为apkplug....

    apkplug主题功能目前处于授权付费阶段,应用须有apkplug.pem证书才会启用主题功能。

    一 阅读授权服务协议

        <服务与授权>

    二 申请获取apkplug.pem文件

        将文件放入主应用的assets目录下(文件名为apkplug.pem)

    三 功能与测试

        如果你想体验该项功能以此判断是否购买授权,你可以下载demo源码http://git.oschina.net/plug/IMThemeDemo

    展开全文
  • apkplug使用体验

    千次阅读 2015-06-23 09:32:44
    官网地址:http://www.apkplug.com/ 先说下插件的配置,因为主程序要用到 插件的配置 首先在assets目录下添加plugin.xml文件 如下:  Bundle-Name="huanxindemo"  Bundle-SymbolicName=...

    官网地址:http://www.apkplug.com/

    先说下插件的配置,因为主程序要用到

    插件的配置

    首先在assets目录下添加plugin.xml文件

    如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <plugin-features
             Bundle-Name="huanxindemo"
             Bundle-SymbolicName="com.easemob.chatuidemo"   
             Bundle-Version="2.1.6"
             date="2015.3.12"
             provider-name="Apkplug"
             provider-url=""
             Bundle-Activator="com.easemob.chatuidemo.SimpleBundle"
             Bundle-Activity="com.easemob.chatuidemo.activity.SplashActivity"
             >
    </plugin-features>

    、、、要属性说明

    Bundle-Name                        插件名称
    Bundle-SymbolicName       插件包名  -与应用packagename可一一对应
    Bundle-Version                     插件版本  -1.0.0
    Bundle-Activator                    插件入口  -与Appliction 类似
    Bundle-Activity                       插件界面  -多个Activity可用 ,  分割
    Bundle-Service                     插件Service  -多个Service可用 , 分割    (v2.0.0新增)
    Bundle-Receiver                  插件广播    -多个广播类可用 , 分割         (v2.0.0新增)


    第二:添加jar包libs/osgi2.8.0.jar

    入口文件com.easemob.chatuidemo.SimpleBundle.java

    package com.easemob.chatuidemo;


    import org.osgi.framework.BundleActivator;
    import org.osgi.framework.BundleContext;


    import com.easemob.chatuidemo.activity.SplashActivity;


    import android.content.Intent;


    public class SimpleBundle implements BundleActivator
    {
        private BundleContext mcontext = null;
        public void start(BundleContext context) throws Exception
        {
            System.err.println("你好我是插件,我将为你展示启动acitivty我已经启动了 我的BundleId为:"+context.getBundle().getBundleId());
            context.getBundleContext().startActivity(new Intent(context.getBundleContext(), SplashActivity.class));
        }
       
        public void stop(BundleContext context)
        {
         System.err.println("你好我是插件,我被停止了 我的BundleId为:"+context.getBundle().getBundleId());
          
        }

    }






    第一步,注册登录,就不说了

    第二步:登陆后进入如图界面,我们点击上方的--应用授权--申请一个appid。填入对应的包名等即可。


    第三:将申请好的appid复制到AndroidManifest.xml文件中。


    配置应用权限

    主应用需要几个基础的权限配置,请将以下的几个权限加入到主应用的AndroidManifest.xml中
    <!-- 插件平台需要的权限! --> 
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

    另外将一下加入到<application></application>节点中

    <!-- 插件平台需要的配置! -->
       <activity
                android:name="org.apkplug.app.apkplugActivity"  
                android:theme="@style/android:Theme.Light"
                android:configChanges="orientation|keyboardHidden"
           />
    最后 将我们从Apkplug管理后台申请到的AppAuth加入到配置文件中,也就是第三步那个东西

    <meta-data  android:name="apkplug-auth" android:value="xxxxxxxx" ></meta-data>

    需要注意的:
    比如我们的插件为环信,我们还需要要环信需要的权限都添加到主程序里。。
    还有对应的meta-data数据,比如环信的appkey也得写在这里。


    第四:copy对应的jar包
    libs/armeabi/libndkfoo.so
     libs/Bundle2.8.1.09-Release.jar

    第五:将我们的插件apk放到assets目录下
    插件的安装方法如下,红色方法参数的意义在代码里鼠标放上边可以自己看啥意思
    private FrameworkInstance frame=null;
    private void initplug(){
    try
           {
            //启动框架
    frame=FrameworkFactory.getInstance().start(null,this);
    BundleContext context =frame.getSystemBundleContext();
    InstallBundle ib=new InstallBundle(context);
    ib.
    install (context, "ChatUIDemo.apk", "1.0.0", new installCallback(){
    @Override
    public void callback(int arg0, Bundle arg1) {
    if(arg0==installCallback.stutas5||arg0==installCallback.stutas7){
    Log.d("",String.format("插件安装 %s : %d",arg1.getName(),arg0));
    }
    else{
    Log.d("","插件安装失败 :%s"+arg1.getName());
    }
    }
    },
    2, false);

           }
           catch (Exception ex)
           {
               System.err.println("Could not create : " + ex);
               ex.printStackTrace();
               int nPid = android.os.Process.myPid();
    android.os.Process.killProcess(nPid);
           }
    }

    附录:InstallBundle.java工具类如下

    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;


    import org.apkplug.Bundle.BundleControl;
    import org.apkplug.Bundle.OSGIServiceAgent;
    import org.apkplug.Bundle.installCallback;
    import org.apkplug.app.FrameworkFactory;
    import org.apkplug.app.FrameworkInstance;
    import org.osgi.framework.BundleContext;
    import org.osgi.framework.ServiceReference;


    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.util.Log;
    /**
     * 替代PropertyInstance.AutoStart()的功能
     * @author 梁前武
     */
    public class InstallBundle {
    private SharedPreferences sp;
    private SharedPreferences.Editor editor;
    public boolean DEBUG=true;
    OSGIServiceAgent<BundleControl> agent=null;
    public InstallBundle(BundleContext mcontext){
    agent=new OSGIServiceAgent<BundleControl>(mcontext,BundleControl.class);
    sp = mcontext.getAndroidContext().getSharedPreferences("apkpluginstallconfig.ini",0);
    editor=sp.edit();
    }
    public void putString(String key, String value){
    editor.putString(key, value);
    editor.commit();
    }
    public String getString(String key, String value){
    return sp.getString(key,value);
    }
    /**

    * @param mcontext    
    * @param plugfile        assets目录下的文件名  如 drag-sort-listview.apk
    * @param version         当前安装的插件版本号   如下次更新宿主时,可以提高这个版本好,以让框架安装最新宿主assets目录下的插件
    * @param callback        安装事件回掉接口
    * @param startlevel      插件启动级别 小于2 插件会在框架启动时被自动启动
    * @param isCheckVersion  是否对比当前安装的插件与已安装插件的版本好,如果为true时 新插件与已安装插件版本相同将不被更新。如果为false时将不检测版本直接覆盖已安装插件
    * @throws Exception
    */
    public void install(BundleContext mcontext,String plugfile,String version,installCallback callback,int startlevel,boolean isCheckVersion) throws Exception{
    // startlevel设置为2插件不会自启 isCheckVersion不检测插件版本覆盖更新
    File f1=null;
    try {

    if(!DEBUG){
    //不是调试模式
    String PlugVersion=this.getString(plugfile,null);
    if(PlugVersion!=null){
    if(PlugVersion.equals(version)){
    //如果本地已安装的插件版本等与目前插件的版本,那么就不安装了
    return ;
    }
    }
    InputStream in=mcontext.getAndroidContext().getAssets().open(plugfile);
    f1=new File(mcontext.getAndroidContext().getFilesDir(),plugfile);
    if(!f1.exists()){
    copy(in, f1);
    }
    agent.getService().install(mcontext, "file:"+f1.getAbsolutePath(),callback, startlevel,isCheckVersion,false,false);
    //安装完成后删除文件
    f1.delete();
    //将最新的插件版本号保存到本地
    this.putString(plugfile, version);
    }else{
    InputStream in=mcontext.getAndroidContext().getAssets().open(plugfile);
    f1=new File(mcontext.getAndroidContext().getFilesDir(),plugfile);
    copy(in, f1);
    agent.getService().install(mcontext, "file:"+f1.getAbsolutePath(),callback, startlevel,isCheckVersion,false,false);
    }

    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (Exception e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();

    }
    /**
    * 将 assets目录下文件拷贝到文件夹中
    * @param is
    * @param outputFile
    * @throws IOException
    */
    private void copy(InputStream is, File outputFile)
           throws IOException
       {
           OutputStream os = null;


           try
           {
               os = new BufferedOutputStream(
                   new FileOutputStream(outputFile),4096);
               byte[] b = new byte[4096];
               int len = 0;
               while ((len = is.read(b)) != -1)
                   os.write(b, 0, len);
           }
           finally
           {
               if (is != null) is.close();
               if (os != null) os.close();
           }
       }
    }



    第六步,启动,SplashActivity 为插件的启动页面

    Intent i=new Intent();
    i.setClassName(this,"com.easemob.chatuidemo.activity.SplashActivity");
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(i);


    说明,上边的启动的类就是我们插件里在 plunin.xml里的参数Bundle-Activity里对应的的activity。我们这里要启动哪个,那里就要写对应的哪个,可以有多个那里。


    ==============


    展开全文
  • android ApkPlug使用

    2019-08-12 01:22:12
    NULL 博文链接:https://iaiai.iteye.com/blog/2262909
  • Apkplug中的插件也是一个完整的apk,它与普通应用的区别有以下3点: 1、插件assets目录下有一个plugin.xml文档,通过它可判断一个工程是主应用还是插件。2、插件有一个入口类BundleActivator3、插件会外部
  • apkplug_demo

    2015-06-09 13:18:57
    一个app可以在另一个app中当插件使用,缩小了app的体积。这是一个简单的demo,对android模块化的学习很有帮助
  • 使用apkplug实现Android客户端插件化

    千次阅读 2014-04-04 11:20:56
    使用apkplug实现Android客户端插件化,apkplug代码虽然不是开源的,但是说明文档比较全,可以很快到实现客户端插件化开发。
  • android插件化-apkplug框架启动-02

    千次阅读 2014-05-12 10:58:44
    apkplug是android插件化/模块化开发的解决方案,利用apkplug可轻松实现安卓APP的模块化,简化开发难度,减小APP大小。本系列文讲解apkplug的基本结构与开发原理。
  • apkplug主题切换是一项简单且强大的功能,它为应用实现个性化提供了可能。但由于该功能是一项创新的以前所未有的方式实现,以至于大部分 开发者无此概念,以下我们将对apkplug的主题功能基本结构和功能进行简单的...
  • android插件化-apkplug框架基本结构-01

    千次阅读 2014-05-12 10:48:06
    apkplug是android插件化/模块化开发的解决方案,利用apkplug可轻松实现安卓APP的模块化,简化开发难度,减小APP大小。本系列文讲解apkplug的基本结构与开发原理。
  • apkplug主题皮肤切换之通用主题-04

    千次阅读 2014-05-26 22:33:51
     apkplug主题切换有两个层次的切换,这篇文章只讲解通用主题切换层次 一 何为通用主题切换  apkplug通用主题切换可以简单的理解为一套可动态替换的系统主题(由主题包提供)。它是apkplug在系统主题与应用...
  • apkplug主题皮肤切换之自定义样式-05

    千次阅读 2014-05-26 22:34:40
    本文基于apkplug V1.6.9讲解 一 何为apkplug自定义样式切换  apkplug主题切换包含两个层次  1.通用主题,与系统主题相似  2.自定义控件样式切换 根据上一篇文章讲解我们可以判定通用主题有其局限性,在很多...
  • android插件化-apkplug插件开发-07

    千次阅读 2014-05-15 17:25:39
    从文章apkplug框架基础结构-01>>了解到apkplug框架中的插件是普通的apk文件,本节讲解插件开发流程。 一 插件工程结构  apkplug插件只比普通app多三个特殊文件  1.org.osgi.framework.BundleActivator --...
  • apkplug插件托管服务简化与简介-05

    千次阅读 2014-05-26 22:31:26
     apkplug插件托管服务是提供给开发者一个远程发布插件的管理平台,但v1.0.0版本接口调用有些复杂我们在v1.1.0版本中着重对其进行了简化 与封装,使开发者能更简单明了的使用这项服务。   apkplug插件托管分为两...
  • android插件化-安装apkplug插件-04

    千次阅读 2014-05-14 13:12:33
    本节我们将练习怎样安装(更新)一个插件。本文章基于v1.6.7版本进行说明,最新的方式以官网为准 ... apkplug插件是一个apk文件,它与普通的android APP基本相同(开发方式),本节只讲插件安装接口而插件开发将在后面的章
  • 经过几个月断断续续的摸索开发,终于有了apkplug的第一个版本,将大部分的业余时间都用于研发这个东东说实话感觉挺累的,不过努力总算没有白费,目前插件平台功能基本还令我满意。在这里写下一个开发demo希望各位大牛多...
  • apkplug简介

    2014-08-15 17:34:00
     今天学习下使用apkplug实现Android客户端插件化,apkplug代码虽然不是开源的,但是说明文档比较全,可以很快到实现客户端插件化开发,参考文档: http://www.apkplug.com/   由于文档非常详细,这里记录些概念...
  • 插件是一个apk文件它存在自己的Activity界面和UI显示,本节将解说如何配置插件的启动Activity以及...与普通app不同,插件AndroidManifest.xml配置在apkplug框架中是无效的,我们须要在plugin.xml里面配置才干被apkplug...
  • 主题包与普通插件开发相同,只是须上传服务器进行编译生成apk主题包 ...按照apkplug插件开发流程添加必要文件 apkplug插件开发>  osgi.jar应使用osgi1.6.8.jar    3.将主应用导出的主题切换接口jar包(I
  • Apkplug最大的亮点就在于它的强大功能-插件化apk,就是多个APK在一个APK上运行,可实现应用内更新等需求。还可以搭建聚合广告,聚合支付等平台。 今天先介绍其插件化apk的功能。接入流程可归结如下图: 步骤...
  • 上一篇文章成功的将apkplug框架嵌入了应用中而且启动 链接http://www.apkplug.com/blog/?post=10这一篇文章实现怎样获取全部已安装插件 一 获取框架的SystemBundle的上下文BundleContext apkplug框架启动会...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 261
精华内容 104
热门标签
关键字:

apkplug