android studio增量更新失败,android 增量更新

android增量更新

android 4.1开始 google引入了应用程序的增量更新。增量更新的原理实际上是使用服务器最新的apk进行对比,并得到罪行的差分包,当应用程序需要更新是,下载差分包就好了,通过它和现在本机上的版本形成一个新的apk

服务端形成差分包

拆分包可以在服务端生成,用的是在网上找的一个例子

SmartAppUpdates-master

当然,我没有编译java服务端的例子,又在网上找了某个大神打包好的项目,直接在本地就直接能打包好apk的拆分

我今天做个记录吧, 省得以后用到之后又忘了,我水平不行,先会用就行了

实现

首先我下载了SmartAppUpdates项目,项目是使用eclipse编的, 直接运行这个没什么意思,最近一直再用android studio,所以现在studio 上编一下。

jni的代码不是很多,其中用到了一个库叫 bzip2,但是在编译的时候遇到了一个问题, 这里记录一下吧,等之后找一下答案。

我在android studio上搭建了一个ndk项目, 我先试着自己写一个c函数,这个是可以编译过的,也返回了正确的结果,但是例子上的代码(图中)就仅仅是调用了applypatch,在编译的时候android studio提示各种的

multiple definition of `xxxxxx'

我后来又在eclipse下重新编译了项目,是可以生成so文件的,查了一会没有结果也就放弃了,直接就用github上提供so库了, 今天找到了解决问题的方法,写在了文章的最后了

01f27a066297?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Paste_Image.png

用人家的so库包名就不能改,直接把这个文件放进去就可以了, 在android studio 使用so库有一种简单的办法,就是在项目中的java文件夹的统计目录创建一个jniLibs文件夹, 然后把so放进去就可以了

01f27a066297?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Paste_Image.png

01f27a066297?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Paste_Image.png

然后再activity中直接调用就好了

package org.chitarra.tiny.myapplication.view;

import android.content.Intent;

import android.net.Uri;

import android.os.Bundle;

import android.os.Environment;

import android.os.Handler;

import android.os.Message;

import android.support.design.widget.FloatingActionButton;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.view.View;

import android.widget.Toast;

import static com.cundong.utils.PatchUtils.patch;

import org.chitarra.tiny.myapplication.R;

import java.io.File;

public class UpdataActivity extends AppCompatActivity {

public static final String PATH = Environment.getExternalStorageDirectory() +

File.separator;

public static final String NEW_APK_PATH = PATH + "new.apk";

public static final String PATCH_PATH = PATH + "test.patch";

static {

System.loadLibrary("ApkPatchLibrary");

}

private FloatingActionButton mBut;

Handler mHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case 0:

Toast.makeText(UpdataActivity.this, "OK", Toast.LENGTH_SHORT)

.show();

installApk();

break;

case -1:

Toast.makeText(UpdataActivity.this, "error",

Toast.LENGTH_SHORT).show();

break;

default:

break;

}

super.handleMessage(msg);

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_updata);

this.mBut = (FloatingActionButton) findViewById(R.id.fab);

this.mBut.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

File patchFile = new File(PATCH_PATH);

if (!patchFile.exists()) {

Toast.makeText(UpdataActivity.this, "patch not exists",

Toast.LENGTH_SHORT).show();

} else {

new PatchThread().start();

}

}

});

}

private void installApk() {

File file = new File(NEW_APK_PATH);

if (file.exists()) {

Uri uri = Uri.fromFile(file);

Intent installIntent = new Intent(Intent.ACTION_VIEW);

installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

installIntent.setDataAndType(uri,

"application/vnd.android.package-archive");

this.startActivity(installIntent);

}

}

class PatchThread extends Thread {

@Override

public void run() {

String oldAppPatch = getApplicationContext().getApplicationInfo().sourceDir;

int patchResult = patch(oldAppPatch, NEW_APK_PATH, PATCH_PATH);

if (patchResult == 0) {

mHandler.sendEmptyMessage(0);

} else {

mHandler.sendEmptyMessage(-1);

}

}

}

}

代码不是很复杂, 就没写注释了,但是还要记录几点,省得以后忘记

NEW_APK_PATH :是与差分文件合并生成的apk,在指定目录下,就会生成一个new.apk

PATCH_PATH :拆分文件, xxxx.patch的格式的

patch: 这是一个本地方法,其中三个变量都是需要传的,第一个变量可以通过

getApplicationContext().getApplicationInfo().sourceDir;

这种方式得到

最后的最后的最后, 重要的事情说三遍,在AndroidManifest.xml中要加入权限

01f27a066297?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Paste_Image.png

好了, 基本上能记录的就这么多了, 下面试程序运行时的效果图

01f27a066297?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Paste_Image.png

01f27a066297?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Paste_Image.png

01f27a066297?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Paste_Image.png

这是项目中使用到的全部文件,csdn 上传代码太慢了,传到了百度云上

http://pan.baidu.com/s/1hru9FDU

今天我有重新拿android studio 重新编译了一下以上的代码, 发现昨天的代码中间会有基础错误,今天修正了之后就能编译出so的库了

创建一个android studio jni的项目

在项目中新建一个jni文件夹

01f27a066297?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Paste_Image.png

这个时候,android studio会自动的在这个项目中的build.gradle生成一个

sourceSets { main { jni.srcDirs = ['src/main/jni'] } }

至于是生成.h 在activity中引入native这些都没有变,紧接着我们就把bzip2的源码拖进来,因为直接在org_chitarra_tiny_jniresr_Patch.c这个文件中引入的是#include "bzlib.c" 这样就会发生很多重复定义的错误

01f27a066297?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Paste_Image.png

等我把#include "bzlib.c"改成#include "bzlib.h" 错误就不会出现了,程序也会正常的执行了,证明昨天的做法是没有问题的,只是没有改这个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值