做增量升级中遇到的各种问题
阅读一http://blog.csdn.net/hmg25/article/details/8100896
阅读二 http://blog.csdn.net/tibib/article/details/8538592
请先阅读以上两篇文章,本文所有使用文件都是从上面下载下来的,代码都是以第二篇的为主的
一.Jni
遇到最开始的问题就是编译so库的时候:
看了一些Jni的资料才知道Jni应该怎样使用
1.首先是新建工程,如果想尽可能少修改之前文章的代码,就按照他的路径建包,最后新建类,定义一个本地方法。
2.利用原始方法进行编译:
javac xx/xx/xx.java
javah xx/xx/xx
这样就生成了可以给c调用的.h头文件
二.Ndk
1.copy之前的代码,生成两个文件,Android.mk,com_hmg25_newstart_BSpatch.c,加上jni生成的com_hmg25_newstart_BSpatch.h文件,一起放在新建一个项目的JNI文件夹下,第一次编译
这个是因为没有引入bzlib的一些源码,到现在我也不知道具体都需要那个,就一股脑全都放在jni文件夹下了。
2.加上bzlib源码之后第二次编译
继续百度,http://blog.sina.com.cn/s/blog_5be1061c0100ykim.html这篇文章搞定,
解决问题: 在android.mk中加入 LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
3.终于编成了
三.Android
1.随便建一个android demo项目进行测试,把NDK生成的libs和obj文件夹copy到项目根目录,顺便把旧apk和patch文件push到虚拟机的sd卡中。
主方法静态读取库,然后再调用,
package com.example.testdiff; import android.os.Bundle; import android.os.Environment; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { private String sdcard = Environment.getExternalStorageDirectory().toString(); private String oldapk_filepath = sdcard + "/tmp/ha1.apk"; private String newapk_savepath = sdcard + "/tmp/ha2.apk"; private String patchpath = sdcard + "/tmp/1-2.patch"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.applyPatchToOldApk(oldapk_filepath, newapk_savepath, patchpath); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public native int applyPatchToOldApk(String oldapk_filepath, String newapk_savepath, String patchpath); static{ System.loadLibrary("Bsdiff"); } }
运行,报错
这是我比较2,不知道应该按照jni生成目录去调用native方法,其实可以直接使用刚开始编译jni的那个项目进行测试。
2.目录
3.然后再主函数中调用BsdiffBusiness类的本地方法,实现则会去调用.so库中的c方法,运行
就会循环报:
找了好久,最后发现是没赋权限,一个非常低级却容易忽视的错误,AndroidManifest.xml中加入
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
4.还有一些信息,具体不知道是做什么的
http://blog.csdn.net/luhuajcdd/article/details/7750146
第三条,JNI_OnLoad是可以消除的,就是在c文件里面加上初始化方法,返回JNI版本就行
最终结果,成功在手机端生成了ha2.apk文件,对比和windows下生成的新文件,大小是一致的,高级的可能还要做下MD5验证什么的吧,我还不会....下一步就是搞出来怎么安装了