JNI开发 怒撸一个 增量更新


这篇文章需要会以下:

增量更新大体流程

  1. 客户端发送更新请求
  2. 服务端生成差分包(生成差分包是动态生成的 而不是已经生成好的)
  3. 客户端下载差分包并且与旧的 apk 合并成最新的 apk
  4. 最后安装

那么问题来了

  • 差分包怎么生成的
  • 每次请求都生成差分包 效率呢
  • 旧的 apk 怎么与差分包合并生成新的 apk 
  • 旧版本的 apk 从哪里来(服务器下载肯定不可能 本地的要是被删了呢)

  •  差分包怎么生成的

            差分包的生成跟新 apk 的合并都是用到 bzip2 这个项目。

  • 每次请求都生成差分包效率问题
          差分包可以定期缓存在服务器 
  • 旧版本apk从哪里来

           apk 安装的时候手机系统会复制一个份 apk 到手机的系统的 data/app/包名-1/base.apk 目录下这个目录可以调用

   ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(packageName,0);

String oldFilePath = appInfo.sourceDir

  • 如果用户 root 了手机 手贱贱的删了这个apk呢

          这时候只能特殊情况特殊处理 从服务端下载最新版本

Linux 下生成差分文件

  1. diffsrc 文件复制到 Linux 系统下生成可执行文件。(cd 到文件目录 执行生成可执行文件的命令 : gcc -fPIC blocksort.c bsdiff.c bzlib.c compress.c crctable.c decompress.c huffman.c randtable.c -o testDiff 生成在 Linux 系统下的可执行文件 testDiff )
  2. 复制 新/旧版本的 apk 到相同目录下。
  3. 执行可执行文件 testDiff (执行命令 ./testDiff apkOld.apk apkNew.apk test.patch  apkOld.apk apkNew.apk是自己文件的文件名)
  4. 最后没有错的话就生成了差分包 test.patch .

在安卓项目里将差分包跟旧的 apk 合并生成最新版 apk。

  1.  在自己安卓项目目录的 src/main 下面新建一个文件夹 cpp,将上面的 diffsrc 下的文件  拷贝到 cpp目录下
  2.   配置 CMakeList.txt  (配置所有 c 文件的路径 跟库的名字 )
  3. 安卓项目里写 native 方法( 记得加载库文件 第二步配置的库: System.loadLibarary("bzip")
  4. bspatch.c 实现 native 方法并调用 bspatch 的合并方法。
  5. 合并完成后安装

至于服务端写更新接口生成差分包、服务器缓存差分文件、表示我也不会。

 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当您在Java程序中需要调用C/C++代码时,可以使用Java Native Interface(JNI)来实现。下面是一个简单的JNI示例,演示了如何将Java方法与C函数相互调用: 1. 创建一个Java类,例如"JNIDemo.java",其中包含您想要调用的本地方法: ```java public class JNIDemo { // 本地方法声明 public native void sayHello(); // 加载本地库 static { System.loadLibrary("jni_demo"); // 加载名为"jni_demo"的本地库 } // 测试 public static void main(String[] args) { JNIDemo demo = new JNIDemo(); demo.sayHello(); // 调用本地方法 } } ``` 2. 在命令行中使用`javac`编译Java类:`javac JNIDemo.java`。 3. 生成C头文件,可以使用`javah`工具:`javah JNIDemo`。这将生成名为"JNIDemo.h"的头文件。 4. 创建一个C源文件,例如"jni_demo.c",实现您在Java中声明的本地方法: ```c #include <stdio.h> #include "JNIDemo.h" JNIEXPORT void JNICALL Java_JNIDemo_sayHello(JNIEnv *env, jobject obj) { printf("Hello from C!\n"); } ``` 5. 在命令行中使用C编译器编译C源文件,并生成共享库文件(DLL或SO): - 对于Windows(使用MinGW):`gcc -shared -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" jni_demo.c -o jni_demo.dll` - 对于Linux/Mac:`gcc -shared -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" jni_demo.c -o libjni_demo.so` 注意:请将`$JAVA_HOME`替换为您Java安装的实际路径。 6. 运行Java程序:`java JNIDemo`。您将看到输出:"Hello from C!"。 这是一个简单的JNI示例,演示了如何在Java和C之间进行方法调用。您可以根据自己的需求扩展和定制此示例。希望对您有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值