Android开发Android开发经验谈Android 开发技术分享

ndk11_增量更新,哈夫曼算法在windows,linux服务

2017-11-10  本文已影响66人  IT魔幻师

一、增量更新原理

二、生成windows环境的差分工具

三、windows服务器jni动态生成差分包

    //将第bsdiff.cpp源文件228行main()入口函数:int main(int argc,char *argv[]) 
    //更名为int bsdiff_main(int argc,char *argv[])
    
    JNIEXPORT void JNICALL Java_hubin_diff
    (JNIEnv *env, jclass jazz,jstring oldPath_jst, jstring newPath_jst, jstring patchPath_jst)
    {
        int argc = 4;
        char *argv[4];
    
        char *oldPath = (char*)env->GetStringUTFChars(oldPath_jst, NULL);
        char *newpath = (char*)env->GetStringUTFChars(newPath_jst, NULL);
        char *patchPath = (char*)env->GetStringUTFChars(patchPath_jst, NULL);
        argv[0] = "bsdiff_Tim";
        argv[1] = oldPath;
        argv[2] = newpath;
        argv[3] = patchPath;
    
        bsdiff_main(argc,argv); //调用差分算法
    
        env->ReleaseStringUTFChars(oldPath_jst, oldPath);
        env->ReleaseStringUTFChars(newPath_jst, newpath);
        env->ReleaseStringUTFChars(patchPath_jst, patchPath);
    
    }

四、生成Linux环境的差分工具

五、android平台合并

    JNIEXPORT jint JNICALL Java_hubin_BsPatch_patch
            (JNIEnv *env, jclass jazz, jstring oldPath_jstr, jstring newPath_jstr, jstring patchPatch_jst) {
    
        int ret= -1;
        LOGD(" jni patch begin");
    
        char *oldPath = (*env) -> GetStringUTFChars(env, oldPath_jstr, JNI_FALSE);
        char *newPath = (*env) -> GetStringUTFChars(env, newPath_jstr, JNI_FALSE);
        char *patchPath = (*env) -> GetStringUTFChars(env, patchPatch_jst, JNI_FALSE);
    
        int argc = 4;
        char *argv[4];
    
        argv[0] = "hubinBsPatch"; //随便定义一个名字
        argv[1] = oldPath;   //老版本apk路径
        argv[2] = newPath;  //新版本apk路径
        argv[3] = patchPath;  //差分包所在路径
    
        //如果成功ret等于0
        ret = bspatch_main(argc,argv); //调用合并算法

        (*env) -> ReleaseStringUTFChars(env, oldPath_jstr, oldPath);
        (*env) -> ReleaseStringUTFChars(env, newPath_jstr, newPath);
        (*env) -> ReleaseStringUTFChars(env, patchPatch_jst, patchPath);
        return ret;
    
    }
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.ApplicationInfo;
    import android.content.pm.PackageInfo;
    import android.content.pm.PackageManager;
    import android.net.Uri;
    import android.text.TextUtils;
    import android.util.Log;

    public class ApkUtils {
        //获取APK版本号 根据 key uuid判断(渠道 版本)
        public static int getVersionCode (Context context, String packageName) {
            PackageManager pm = context.getPackageManager();
            try {
                PackageInfo info = pm.getPackageInfo(packageName, 0);
                Log.d("Tim","getVersionCode = "+info.versionCode);
                return info.versionCode;
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
                return 0;
            }
        }
    
        /**
         * 获取已安装Apk文件的源Apk文件
         * 如:/data/app/my.apk
         *
         * @param context
         * @param packageName
         * @return
         */
        public static String getSourceApkPath(Context context, String packageName) {
            if (TextUtils.isEmpty(packageName))
                return null;
    
            try {
                ApplicationInfo appInfo = context.getPackageManager()
                        .getApplicationInfo(packageName, 0);
                return appInfo.sourceDir;
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            return null;
        }
    
    
    
        /**
         * 安装Apk
         *
         * @param context
         * @param apkPath
         */
        public static void installApk(Context context, String apkPath) {
    
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.parse("file://" + apkPath),
                    "application/vnd.android.package-archive");
    
            context.startActivity(intent);
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读