精华内容
下载资源
问答
  • 增量更新

    千次阅读 2019-05-28 15:34:14
    增量更新是指在进行更新操作时,只更新需要改变的地方,不需要更新或者已经更新过的地方则不会重复更新,增量更新与完全更新相对。对于我们app来说,一般对于用户来说用户的流量是很宝贵的,如果我们只改变了app中的...

    一、定义

    增量更新是指在进行更新操作时,只更新需要改变的地方,不需要更新或者已经更新过的地方则不会重复更新,增量更新与完全更新相对。对于我们app来说,一般对于用户来说用户的流量是很宝贵的,如果我们只改变了app中的一个变量,比如i。那么我们就需要重新发版,供用户下载更新整个app,而增量更新就不需要这样的操作了,虽然最终也是需要用户来安装的,但是用户下载的只是我们更改的部分。并且这个技术已经很完善。

    二、使用

    打成差分包过程windows和linux平台是有差异的

    1、windows环境

    下载bsdiff windows工具,可以自行百度下载。下载完成以后,进入目录,可以看到有两个工具bsdiff.exe和bspatch.exe.其中bsdiff是做差分包使用的,bspatch是用作合成新的app。

    2、linux环境

    3、配置android环境

    (1)首先需要下载bispatch.c文件。下载地址bsdiff

    (2)得到bispatch.c文件拷贝到项目的cpp目录下,发现需要bzlib.h,由于它不是系统文件,那么需要从外部引入

    (3)下载bzip,它是可以实现压缩解压的过程,在合成差分包的过程用它进行压缩,那么在服务器下载的patch包就需要通过它进行解压。从它里面能够拿到bzlib.h相关代码文件,下载地址,bzip

    (4)根据bzip提供的makeFile配置只保留以下文件,放入到cpp/bzip目录下

    (5)此时编译发现还是提示找不到bzlib.h。因为我们上引入的方式是不正确,<>是只能引入系统文件,如果要引入外部文件,可以使用以下方式。重新编译成功了

    #include "bzip/bzlib.h"
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <err.h>
    #include <unistd.h>
    #include <fcntl.h>

    (6)定义native层修复文件bspatcher.cpp,代码如下:

    #include <jni.h>
    
    // extern 声明在 bspatch.c
    extern "C" {
    extern int p_main(int argc, const char *argv[]);
    }
    
    extern "C"
    JNIEXPORT void JNICALL
    Java_com_cxz_bspatchlib_BsPatcher_bsPatch(JNIEnv *env, jobject instance, jstring oldApk_,
                                              jstring patch_, jstring output_) {
        // 将Java字符串转为C/C++的字符串,转换为UTF-8格式的char指针
        const char *oldApk = env->GetStringUTFChars(oldApk_, 0);
        const char *patch = env->GetStringUTFChars(patch_, 0);
        const char *output = env->GetStringUTFChars(output_, 0);
    
        // bspatch, oldfile, newfile, patchfile
        const char *argv[] = {"", oldApk, output, patch};
        p_main(4, argv);
    
        // 释放指向Unicode格式的char指针
        env->ReleaseStringUTFChars(oldApk_, oldApk);
        env->ReleaseStringUTFChars(patch_, patch);
        env->ReleaseStringUTFChars(output_, output);
    }

    其中会调用bspatch.c中的p_main方法。传递两个参数,第一个参数固定为4,第二个参数传递的是指针数组,分别为olkApk(旧的apk),patch(差分包)和output(合成新的apk)

    (7)将上述文件加入到CMakeLists.txt编译

    cmake_minimum_required(VERSION 3.4.1)
    
    # 查找文件系统中制定模式的路径,如:/*是匹配根目录下的所有文件
    file(GLOB bzip_source ${CMAKE_SOURCE_DIR}/src/main/cpp/bzip/*.c)
    
    # 设置本地动态库,编译生成动态库
    add_library(
            bspatcher # 模块名
    
            SHARED # 动态库、分享库
    
            src/main/cpp/native-lib.cpp
            src/main/cpp/bspatch.c
            ${bzip_source}) # 源文件
    
    # 查找系统库,日志输出库Log
    find_library(
            log-lib
    
            log)
    
    # 需要链接或者编译的库
    target_link_libraries(
            bspatcher
    
            ${log-lib})

     

    (8)java层加载jni方法,定义一个工具类,代码如下

    public class BsPatcher {
    
        // 用于在应用程序启动时,加载本地的lib库
        static {
            System.loadLibrary("bspatcher");
        }
    
        /**
         * 合成安装包
         *
         * @param oldApk 旧版本安装包,如1.1.1版本
         * @param patch  差分包,Patch文件
         * @param output 合成后新版本apk的输出路径
         */
        public static native void bsPatch(String oldApk, String patch, String output);
    
    }

    (9)模拟activity调用update()方法如下:

    public void update() {
            // 从服务器下载 patch 到用户手机, SDCard 里面
            new AsyncTask<Void, Void, File>() {
                @Override
                protected File doInBackground(Void... voids) {
                    // 获取旧版本路径(正在运行的apk路径)
                    String oldApk = getApplicationInfo().sourceDir;
                    //差分包路径,服务器下载到本地路径
                    String patch = new File(Environment.getExternalStorageDirectory(), "patch").getAbsolutePath();
                    //合成的新的apk保存路径
                    String output = createNewApk().getAbsolutePath();
                    if (!new File(patch).exists()) {
                        return null;
                    }
                    //开始合成,是一个耗时任务
                    BsPatcher.bsPatch(oldApk, patch, output);
                    //合成成功,重新安装apk
                    return new File(output);
                }
    
                @Override
                protected void onPostExecute(File file) {
                    super.onPostExecute(file);
                    // 已经合成了,调用该方法,安装新版本apk
                    if (file != null) {
                        if (!file.exists()) return;
                        Intent intent = new Intent(Intent.ACTION_VIEW);
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        //7.0及以上安装apk有差异,需要兼容
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                            Uri fileUri = FileProvider.getUriForFile(MainActivity.this, MainActivity.this.getApplicationInfo().packageName + ".fileprovider", file);
                            intent.setDataAndType(fileUri, "application/vnd.android.package-archive");
                        } else {
                            intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                        }
                        //重启apk
                        MainActivity.this.startActivity(intent);
                    } else {
                        Toast.makeText(MainActivity.this, "差分包不存在!", Toast.LENGTH_LONG).show();
                    }
                }
            }.execute();
        }
    
        /**
         * 创建合成后的新版本apk文件
         *
         * @return
         */
        private File createNewApk() {
            File newApk = new File(Environment.getExternalStorageDirectory(), "bsdiff.apk");
            if (!newApk.exists()) {
                try {
                    newApk.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return newApk;
        }

    注意:比如之前已经发不过1.0、2.0、3.0等版本。那么就需要根据用户的版本来合成不同的差分包。如果是1.0版本就需要针对1.0版本生成差分包供用户下载,依次类推。所以实际项目中,就需要在后台配置shell脚本,根据接口传递的版本号,生成差分包

    展开全文
  • android增量更新

    2018-03-23 09:53:37
    android增量更新 android增量更新 android增量更新 android增量更新 android增量更新
  • ETL中增量更新ETL中增量更新ETL中增量更新ETL中增量更新ETL中增量更新ETL中增量更新ETL中增量更新ETL中增量更新
  • 漫谈Android增量更新

    2021-02-25 23:04:37
    而google为了解决了这个问题,提出了SmartAppUpdate,即增量更新(也叫做差分升级)。尽管现在网络环境有了很大的提升,但一个不争的事实就是应用越做越大,因此,增量更新在目前的仍然是一种解决APP更新包过大的...
  • 增量更新demo

    2017-02-13 18:41:05
    增量更新,as项目
  • 增量更新生成.so

    2018-04-17 10:48:30
    增量更新.so文件增量更新.so文件增量更新.so文件增量更新.so文件增量更新.so文件增量更新.so文件增量更新.so文件增量更新.so文件增量更新.so文件增量更新.so文件增量更新.so文件增量更新.so文件增量更新.so文件增量...
  • Android增量更新

    2018-07-20 14:09:40
    Android端实现增量更新的diff和patch,只需修改代码中的apk路径即可
  • 增量更新实现

    2019-08-15 10:47:15
    本项目通过ndk开发,实现旧apk使用差分文件patch来进行增量更新的功能,项目中不提供生成差分文件的工具,如有需要请自行百度bsdiff下载差分工具,项目使用的只是bspatch进行合并操作。
  • (3)增量更新的配置三、定时增量更新(1)什么是定时增量更新?(2)定时增量更新的配置 我使用的是solr7.7.2,这篇博客的内容是我看到网上其他人的文章和自己的多次试验的总结和见解,内容都比较通俗易懂,同时也...


    我使用的是solr7.7.2,这篇博客的内容是我看到网上其他人的文章和自己的多次试验的总结和见解,内容都比较通俗易懂,同时也有太多不足之处,希望大佬看到可以指出。

    一、全量更新

    (1)什么是全量更新?

    将数据库的数据导入到solr,就是数据更新,有两种更新方式,一种是全量更新,一种是增量更新。全量更新,顾名思义,即对solr中缓存的数据全部进行更新,对索引全部进行删除,重新创建,重新分词。
    这里就不细讲了,如果你的数据可以成功导入到solr,那么这就是全量更新。

    (2)全量更新怎么用?

    在这里插入图片描述
    full-import:全量更新,意思是重新把全部数据从数据库导入,一般会先删除现有的,再进行导入,所以需要勾选Clean清除本地

    二、增量更新

    (1)什么是增量更新?

    增量更新,只更新导入solr的数据中,已经被数据库删除、修改、添加的数据,不会去动其他没有变化的数据。比如我在数据库中添加了一条数据,你在全量更新数据的时候,solr会全部替换原来的数据,而使用增量更新,solr仅仅是为一条新增的数据做了处理。

    (2)为什么需要增量更新?

    这个其实非常好理解,我们并非对数据库中数据全部增删改的时候,就没必要使用全量更新,这会使我们更新数据的效率变得非常低下

    (3)增量更新的配置

    【1】首先要弄懂几个必要的属性,以及数据库建表事项,和dataimporter.properties 、data-config.xml里面的数据

      <!--  transformer 格式转化:HTMLStripTransformer 索引中忽略HTML标签   --->
      <!--  query:查询数据库表符合记录数据   --->
      <!--  deltaQuery:增量索引查询主键ID    --->    注意这个只能返回ID字段
      <!--  deltaImportQuery:增量索引查询导入数据  --->
      <!--  deletedPkQuery:增量索引删除主键ID查询  ---> 注意这个只能返回ID字段
    

    【2】数据库配置注意事项
    1.如果只涉及添加,与修改业务,那么数据库里只需额外有一个字段update_time
    就可以了,类型为timpstamp
    2.如果还涉及删除业务,那么数据里就需额外再多添加一个字段isdelete,int类型的
    用0,1来标识,此条记录是否被删除
    3.dataimporter.properties
    这个配置文件很重要,它是用来记录当前时间与上一次修改时间的,通过它能够找出,那些,新添加的,修改的,或删除的记录标识,此条记录是否被删除的记录
    4.更新 solr-data-config.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <dataConfig> 
        <!--数据源-->
        <dataSource type="JdbcDataSource"
                    driver="com.mysql.jdbc.Driver"
                    url="xxx"
                    user="xxx"
                    password="xxx"/>
        <document> 
    
            <entity name="solrTest" 
            query="SELECT fid,ftime,fcontent,ftitle,flastupdatetime FROM solrTest where flag = '0'"
            deltaImportQuery = "SELECT fid,ftime,fcontent,ftitle,flastupdatetime FROM solrTest where fid = '${dataimporter.delta.fid}'"
            deltaQuery = "SELECT fid FROM solrTest where flastupdatetime > '${dataimporter.last_index_time}' and flag = '0'"
            deletedPkQuery = "SELECT fid FROM solrTest where flag = '1'"
            >
                <!--查询的数据和数据库索引意义对应column 是查询的字段name 是solr索引对应的字段-->
                <field column="fid" name="fid"/>
                <field column="ftitle" name="ftitle"/>
                <field column="fcontent" name="fcontent"/>
                <field column="flastupdatetime" name="flastupdatetime"/>
                <field column="ftime" name="ftime"/>
            </entity>
            
        </document> 
    </dataConfig>
    
    

    要记得在 managed-schema 中添加字段
    重启服务器后,在网页端:
    在这里插入图片描述
    Command 选 delta-Import ,增量更新

    三、定时增量更新

    (1)什么是定时增量更新?

    定时增量更新就是给solr配置一个定时任务,每隔一定时间solr会通过增量的方式导入数据。

    (2)定时增量更新的配置

    【1】准备jar包apache-solr-dataimportscheduler.jar、solr-dataimporthandler-7.7.2.jar、solr-dataimporthandler-extras-7.7.2.jar到 solr 项目的\WEB-INF\lib 目录下
    只有一个jar包需要下载,其他的在solr的dist文件夹下面,需要下载的jar我就借花献佛了:
    apache-solr-dataimportscheduler 的下载地址 链接:https://pan.baidu.com/s/1h4hDmc2KWtO4VPMnDGXSCg 提取码:qi7n
    【2】修改web.xml文件配置监听,在第一个servlet节点前增加:

    <listener>
          <listener-class>
                org.apache.solr.handler.dataimport.scheduler.ApplicationListener
          </listener-class>
    </listener>
    
    

    【3】核心下面创建一个conf文件夹和dataimport.properties文件,注意路径、文件夹名、文件名必须是这些
    在这里插入图片描述
    【4】文件内容(根据自己情况配置):

    在这里插入代码片#################################################
    #                                              #
    #      dataimport scheduler properties        #
    #                                              #
    #################################################
     
    #  tosync or not to sync
    #  1- active; anything else - inactive
    # 这里的配置不用修改
    syncEnabled=1
     
    # which cores to schedule
    #  ina multi-core environment you can decide which cores you want syncronized
    # leave empty or comment it out if using single-core deployment
    #  修改成你所使用的core,我这里是我自定义的core:simple
    syncCores=active
     
    # solr server name or IP address
    # [defaults to localhost if empty]
    这个一般都是localhost不会变
    server=localhost
     
    # solr server port
    # [defaults to 80 if empty]
    #  安装solr的tomcat端口,如果你使用的是默认的端口,就不用改了,否则改成自己的端口就好了
    port=8089
     
    # application name/context
    # [defaults to current ServletContextListener's context (app) name]
    #  这里默认不改
    webapp=solr
     
    # URL params [mandatory]
    # remainder of URL
    #  这里改成下面的形式,solr同步数据时请求的链接
    params=/dataimport?command=delta-import&clean=false&commit=true
     
    # schedule interval
    # number of minutes between two runs
    # [defaults to 30 if empty]
    #这里是设置定时任务的,单位是分钟,也就是多长时间你检测一次数据同步,根据项目需求修改
    #  开始测试的时候为了方便看到效果,时间可以设置短一点
    interval=1
     
    #  重做索引的时间间隔,单位分钟,默认7200,即5天;
    #  为空,为0,或者注释掉:表示永不重做索引
    reBuildIndexInterval=7200
     
    #  重做索引的参数
    reBuildIndexParams=/select?qt=/dataimport&command=full-import&clean=true&commit=true
     
    #  重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
    #  两种格式:2012-04-11 03:10:00 或者 03:10:00,后一种会自动补全日期部分为服务启动时的日期
    reBuildIndexBeginTime=03:10:00
    

    候重启solr就已经有了每分钟增量更新的效果了,可以自己数据库改条数据试试。还有要记得修改任何配置文件一定是重启solr才会生效,上面注意自己的SQL语句有没有问题,增量更新的SQL比全量更新的SQL多了一个id的判断,id不要忘记明确指定是哪张表的id

    展开全文
  • Android中增量更新

    2021-05-31 17:06:21
    Android中增量更新:差分包的生成与合并,内含封装好的android端项目中差分包合并使用的so库
  • android 增量更新

    2016-02-24 11:41:49
    android,增量更新项目,差分包。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 139,812
精华内容 55,924
关键字:

增量更新