xuexiangjys / xupdate Goto Github PK
View Code? Open in Web Editor NEW🚀A lightweight, high availability Android version update framework.(一个轻量级、高可用性的Android版本更新框架)
Home Page: https://github.com/xuexiangjys/XUpdate/wiki
License: Apache License 2.0
🚀A lightweight, high availability Android version update framework.(一个轻量级、高可用性的Android版本更新框架)
Home Page: https://github.com/xuexiangjys/XUpdate/wiki
License: Apache License 2.0
具体位置是在(UpdateManager类的findNewVersion方法中,第288行),都是执行UpdateUtils.toJson(updateEntity)方法时报错。
坚果Pro2s(系统8.1),报如下错误:
2019-03-30 00:09:20.538 W/System.err: java.lang.IllegalArgumentException: class android.content.res.ColorStateList declares multiple JSON fields named mChangingConfigurations
2019-03-30 00:09:20.539 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:172)
2019-03-30 00:09:20.539 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
2019-03-30 00:09:20.539 W/System.err: at com.google.gson.Gson.getAdapter(Gson.java:458)
2019-03-30 00:09:20.539 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
2019-03-30 00:09:20.539 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
2019-03-30 00:09:20.539 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
2019-03-30 00:09:20.539 W/System.err: at com.google.gson.Gson.getAdapter(Gson.java:458)
2019-03-30 00:09:20.539 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
2019-03-30 00:09:20.539 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
2019-03-30 00:09:20.539 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
2019-03-30 00:09:20.539 W/System.err: at com.google.gson.Gson.getAdapter(Gson.java:458)
2019-03-30 00:09:20.539 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
2019-03-30 00:09:20.539 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
2019-03-30 00:09:20.539 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
2019-03-30 00:09:20.540 W/System.err: at com.google.gson.Gson.getAdapter(Gson.java:458)
2019-03-30 00:09:20.540 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
2019-03-30 00:09:20.540 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
2019-03-30 00:09:20.540 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
2019-03-30 00:09:20.540 W/System.err: at com.google.gson.Gson.getAdapter(Gson.java:458)
2019-03-30 00:09:20.540 W/System.err: at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:56)
2019-03-30 00:09:20.540 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127)
2019-03-30 00:09:20.540 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245)
2019-03-30 00:09:20.540 W/System.err: at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
2019-03-30 00:09:20.540 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127)
2019-03-30 00:09:20.540 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245)
2019-03-30 00:09:20.540 W/System.err: at com.google.gson.Gson.toJson(Gson.java:704)
2019-03-30 00:09:20.540 W/System.err: at com.google.gson.Gson.toJson(Gson.java:683)
2019-03-30 00:09:20.540 W/System.err: at com.google.gson.Gson.toJson(Gson.java:638)
2019-03-30 00:09:20.540 W/System.err: at com.google.gson.Gson.toJson(Gson.java:618)
2019-03-30 00:09:20.540 W/System.err: at com.xuexiang.xupdate.utils.UpdateUtils.toJson(UpdateUtils.java:179)
2019-03-30 00:09:20.540 W/System.err: at com.xuexiang.xupdate.UpdateManager.findNewVersion(UpdateManager.java:288)
2019-03-30 00:09:20.540 W/System.err: at com.xuexiang.xupdate.proxy.impl.DefaultUpdateChecker.processCheckResult(DefaultUpdateChecker.java:132)
2019-03-30 00:09:20.540 W/System.err: at com.xuexiang.xupdate.proxy.impl.DefaultUpdateChecker.onCheckSuccess(DefaultUpdateChecker.java:102)
2019-03-30 00:09:20.540 W/System.err: at com.xuexiang.xupdate.proxy.impl.DefaultUpdateChecker.access$000(DefaultUpdateChecker.java:46)
2019-03-30 00:09:20.540 W/System.err: at com.xuexiang.xupdate.proxy.impl.DefaultUpdateChecker$2.onSuccess(DefaultUpdateChecker.java:77)
2019-03-30 00:09:20.540 W/System.err: at com.xxx.update.UpdateHttpService$1.onResponse(UpdateHttpService.java:46)
2019-03-30 00:09:20.540 W/System.err: at com.xxx.update.UpdateHttpService$1.onResponse(UpdateHttpService.java:43)
2019-03-30 00:09:20.540 W/System.err: at com.xxx.network.rx.RespObserver.onNext(RespObserver.java:156)
2019-03-30 00:09:20.541 W/System.err: at io.reactivex.internal.util.HalfSerializer.onNext(HalfSerializer.java:107)
2019-03-30 00:09:20.541 W/System.err: at io.reactivex.internal.operators.observable.ObservableTakeUntil$TakeUntilMainObserver.onNext(ObservableTakeUntil.java:79)
2019-03-30 00:09:20.541 W/System.err: at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:201)
2019-03-30 00:09:20.541 W/System.err: at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:255)
2019-03-30 00:09:20.541 W/System.err: at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:119)
2019-03-30 00:09:20.541 W/System.err: at android.os.Handler.handleCallback(Handler.java:790)
2019-03-30 00:09:20.541 W/System.err: at android.os.Handler.dispatchMessage(Handler.java:99)
2019-03-30 00:09:20.541 W/System.err: at android.os.Looper.loop(Looper.java:164)
2019-03-30 00:09:20.541 W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6906)
2019-03-30 00:09:20.541 W/System.err: at java.lang.reflect.Method.invoke(Native Method)
2019-03-30 00:09:20.541 W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
2019-03-30 00:09:20.541 W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:820)
华为Meta20(系统9.0),报如下错误:
2019-03-30 00:22:05.233 W/System.err: java.lang.IllegalArgumentException: class android.widget.TextView declares multiple JSON fields named mMinWidth
2019-03-30 00:22:05.233 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:172)
2019-03-30 00:22:05.234 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
2019-03-30 00:22:05.234 W/System.err: at com.google.gson.Gson.getAdapter(Gson.java:458)
2019-03-30 00:22:05.235 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
2019-03-30 00:22:05.235 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
2019-03-30 00:22:05.235 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
2019-03-30 00:22:05.236 W/System.err: at com.google.gson.Gson.getAdapter(Gson.java:458)
2019-03-30 00:22:05.236 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
2019-03-30 00:22:05.237 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
2019-03-30 00:22:05.237 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
2019-03-30 00:22:05.237 W/System.err: at com.google.gson.Gson.getAdapter(Gson.java:458)
2019-03-30 00:22:05.238 W/System.err: at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:56)
2019-03-30 00:22:05.238 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127)
2019-03-30 00:22:05.239 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245)
2019-03-30 00:22:05.239 W/System.err: at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
2019-03-30 00:22:05.239 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127)
2019-03-30 00:22:05.240 W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245)
2019-03-30 00:22:05.240 W/System.err: at com.google.gson.Gson.toJson(Gson.java:704)
2019-03-30 00:22:05.241 W/System.err: at com.google.gson.Gson.toJson(Gson.java:683)
2019-03-30 00:22:05.241 W/System.err: at com.google.gson.Gson.toJson(Gson.java:638)
2019-03-30 00:22:05.241 W/System.err: at com.google.gson.Gson.toJson(Gson.java:618)
2019-03-30 00:22:05.242 W/System.err: at com.xuexiang.xupdate.utils.UpdateUtils.toJson(UpdateUtils.java:179)
2019-03-30 00:22:05.242 W/System.err: at com.xuexiang.xupdate.UpdateManager.findNewVersion(UpdateManager.java:288)
2019-03-30 00:22:05.243 W/System.err: at com.xuexiang.xupdate.proxy.impl.DefaultUpdateChecker.processCheckResult(DefaultUpdateChecker.java:132)
2019-03-30 00:22:05.243 W/System.err: at com.xuexiang.xupdate.proxy.impl.DefaultUpdateChecker.onCheckSuccess(DefaultUpdateChecker.java:102)
2019-03-30 00:22:05.243 W/System.err: at com.xuexiang.xupdate.proxy.impl.DefaultUpdateChecker.access$000(DefaultUpdateChecker.java:46)
2019-03-30 00:22:05.244 W/System.err: at com.xuexiang.xupdate.proxy.impl.DefaultUpdateChecker$2.onSuccess(DefaultUpdateChecker.java:77)
2019-03-30 00:22:05.244 W/System.err: at com.xxx.update.UpdateHttpService$1.onResponse(UpdateHttpService.java:46)
2019-03-30 00:22:05.245 W/System.err: at com.xxx.update.UpdateHttpService$1.onResponse(UpdateHttpService.java:43)
2019-03-30 00:22:05.245 W/System.err: at com.xxx.network.rx.RespObserver.onNext(RespObserver.java:156)
2019-03-30 00:22:05.245 W/System.err: at io.reactivex.internal.util.HalfSerializer.onNext(HalfSerializer.java:107)
2019-03-30 00:22:05.246 W/System.err: at io.reactivex.internal.operators.observable.ObservableTakeUntil$TakeUntilMainObserver.onNext(ObservableTakeUntil.java:79)
2019-03-30 00:22:05.246 W/System.err: at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:201)
2019-03-30 00:22:05.247 W/System.err: at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:255)
2019-03-30 00:22:05.247 W/System.err: at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:119)
2019-03-30 00:22:05.247 W/System.err: at android.os.Handler.handleCallback(Handler.java:891)
2019-03-30 00:22:05.248 W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
2019-03-30 00:22:05.248 W/System.err: at android.os.Looper.loop(Looper.java:207)
2019-03-30 00:22:05.248 W/System.err: at android.app.ActivityThread.main(ActivityThread.java:7470)
2019-03-30 00:22:05.249 W/System.err: at java.lang.reflect.Method.invoke(Native Method)
2019-03-30 00:22:05.249 W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
2019-03-30 00:22:05.249 W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)
HasUpdate这个字段是不是直接用apk的versionCode和请求到的versionCode比较下?
private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, gson.toJson(param));
i often use okhttp3 like above setting format for transfer ,how about xupdate do it ?
android 5.0 使用默认安装弹出root请求(设置为false),给予root权限后面就没有了,没有进行安装
查看log信息会发现有如下警告
java.io.IOException: Cannot run program "su": error=13, Permission denied
但是应用安装界面能够正常弹出
首先谢谢你的作品,在实际使用中有以下问题反馈:
一、静默安装:在华为手机中直接服务被杀了,建议不开启静默安装的时候不要做root权限的检查
二、8.0以上没有申请REQUEST_INSTALL_PACKAGES权限的检查
三、建议下载地址不要二次解析,很多时候为了减轻服务器的压力,下载源都是放到oss上面去的
自定义解析器强更下载安装后,后台再次上传一个强更新版本点击检测更新一直弹的是选更的弹框,自定义实体解析 if (result != null) {
return new UpdateEntity()
.setHasUpdate(isupdate)
.setIsIgnorable(false)
.setForce(isForce)
.setVersionCode(result.getVersionCode())
.setVersionName(result.getVersionName())
.setUpdateContent(result.getUpdateIntro())
.setDownloadUrl(result.getFileName())
.setSize(1000);
}这个一直没走,安装新版本之前会走到这里,安装后有新版本就没走了
md5.equals(Md5Utils.getFileMD5(file));
用equalsIgnoreCase
1.设置了MD5,每次启动都会重新下载
2.下载完成后,点击安装按钮无任何反应,Logcat也无任何提示信息。debug已经设为true
没有新版本的时候会弹出一个吐司,这个能取消掉吗
自定义主题颜色时,如何修改“升级”文字的颜色?
现在是黑色的,如何和默认一样是白色
UncaughtException detected: java.lang.NullPointerException: [UpdateManager.Builder] : updateHttpService == null
at com.xuexiang.xupdate.utils.UpdateUtils.requireNonNull(UpdateUtils.java:74)
at com.xuexiang.xupdate.UpdateManager$Builder.build(UpdateManager.java:643)
at com.xuexiang.xupdate.UpdateManager$Builder.update(UpdateManager.java:665)
比如当前版本已忽略 下载错误这些提示有英文版的嘛
麻烦问下,如何查看安装失败具体错误码,现在只能看到自定义的5000
如果想实现由Retrofit获取版本信息,然后弹出提示框后面的动作使用库中的内容,现在暂时不能实现。
为何会这样啊? 下载完一直在申请root 权限, 我希望的是 调用系统的安装程序
private void setDialogTheme(int color, int topResId) {
mIvTop.setImageResource(topResId);
mBtnUpdate.setBackgroundDrawable(DrawableUtils.getDrawable(UpdateUtils.dip2px(4, getContext()), color));
mNumberProgressBar.setProgressTextColor(color);
mNumberProgressBar.setReachedBarColor(color);
//随背景颜色变化
mBtnUpdate.setTextColor(ColorUtils.isColorDark(color) ? Color.WHITE : Color.BLACK);
}
这一段,,我的项目是只用白色的。。
弹出更新提示框后,摁Home键回到手机主页面,报如下错误:
和是否开始下载无关,和是否强制更新无关。在华为meta20(9.0)和坚果Pro2s(8.1)上都报这个错。
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = **com.xuexiang.xupdate.entity.UpdateEntity**)
at android.os.Parcel.writeSerializable(Parcel.java:1714)
at android.os.Parcel.writeValue(Parcel.java:1662)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:875)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1583)
这个x号怎么取消掉,我用Demo配置了下自己的数据URIL环境 Demo的就没有x号,这是为什么
我想直接跳过服务器请求,直接传入更新数据调出dialog。数据请求因为里面还有其他逻辑判断,必须我先处理完了才能确定是否调用升级。感谢回复
原本项目用的是
maven{url 'http://maven.aliyun.com/nexus/content/groups/public/'}
报错
Failed to resolve: com.github.xuexiangjys:XUpdate:1.0.0
Show in File
Show in Project Structure dialog
每次启动我都会去调用升级,我看到log中每次都会下载apk。
如果用户不安装,或者其他情况,这样每次下载cdn流量开销很大。
我现在只能自己去保存上次下载文件路径,然后在下次更新检测的时候判断md5是否一样,
不一样就重新现在,一样就不下载。
看看有没有办法优化一下。
谢谢啊
4g下载,连接wifi后会提示下载失败。暂停和取消功能没找到啊
public static Intent getInstallAppIntent(Context context, File appFile) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//区别于 FLAG_GRANT_READ_URI_PERMISSION 跟 FLAG_GRANT_WRITE_URI_PERMISSION, URI权限会持久存在即使重启,直到明确的用 revokeUriPermission(Uri, int) 撤销。 这个flag只提供可能持久授权。但是接收的应用必须调用ContentResolver的takePersistableUriPermission(Uri, int)方法实现
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
Uri fileUri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".updateFileProvider", appFile);
intent.setDataAndType(fileUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(appFile), "application/vnd.android.package-archive");
}
return intent;
} catch (Exception e) {
_XUpdate.onUpdateError(INSTALL_FAILED, "获取安装的意图失败!");
}
return null;
}
上面这段代码中的 setFlags 应该改为 addFlags ,否则在 (SDK >= N && context 不是 Activity) 的情况下会导致打不开安装界面
进度条一直显示不动,点升级,但文件在下载
download path is worng, like "cache/xupdate/8.8.8.8888/1541463792148.octet-stream"
java.lang.NullPointerException: Attempt to invoke interface method 'void com.xuexiang.xupdate.proxy.e.h()' on a null object reference
at com.xuexiang.xupdate.widget.UpdateDialogFragment.onClick(UpdateDialogFragment.java)
at android.view.View.performClick(View.java:5642)
at android.view.View$PerformClick.run(View.java:22489)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6278)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:793)
建议用byte为单位
打印出来Progress为负数,total为-1,导致进度条不会动,找不到解决方法,HELP
: java.io.IOException: Cannot run program "su": error=13, Permission denied
W/System.err: at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
W/System.err: at java.lang.Runtime.exec(Runtime.java:692)
W/System.err: at java.lang.Runtime.exec(Runtime.java:525)
W/System.err: at java.lang.Runtime.exec(Runtime.java:422)
W/System.err: at freight.zengke.com.freight.widegt.appupdate.utils.ShellUtils.execCommand(ShellUtils.java:135)
W/System.err: at freight.zengke.com.freight.widegt.appupdate.utils.ShellUtils.execCommand(ShellUtils.java:93)
W/System.err: at freight.zengke.com.freight.widegt.appupdate.utils.ShellUtils.checkRootPermission(ShellUtils.java:44)
W/System.err: at freight.zengke.com.freight.widegt.appupdate.utils.ApkInstallUtils.install(ApkInstallUtils.java:65)
W/System.err: at freight.zengke.com.freight.widegt.appupdate.utils.ApkInstallUtils.install(ApkInstallUtils.java:52)
W/System.err: at freight.zengke.com.freight.widegt.appupdate.listener.impl.DefaultInstallListener.onInstallApk(DefaultInstallListener.java:31)
W/System.err: at freight.zengke.com.freight.widegt.appupdate._XUpdate.onInstallApk(_XUpdate.java:144)
W/System.err: at freight.zengke.com.freight.widegt.appupdate._XUpdate.startInstallApk(_XUpdate.java:126)
W/System.err: at freight.zengke.com.freight.widegt.appupdate.service.DownloadService$FileDownloadCallBack.onSuccess(DownloadService.java:336)
W/System.err: at freight.zengke.com.freight.widegt.appupdate.OKHttpUpdateHttpService$3.onResponse(OKHttpUpdateHttpService.java:162)
W/System.err: at freight.zengke.com.freight.widegt.appupdate.OKHttpUpdateHttpService$3.onResponse(OKHttpUpdateHttpService.java:149)
W/System.err: at com.zhy.http.okhttp.OkHttpUtils$5.run(OkHttpUtils.java:256)
W/System.err: at android.os.Handler.handleCallback(Handler.java:808)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:101)
W/System.err: at android.os.Looper.loop(Looper.java:166)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:7529)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
W/System.err: Caused by: java.io.IOException: error=13, Permission denied
W/System.err: at java.lang.UNIXProcess.forkAndExec(Native Method)
W/System.err: at java.lang.UNIXProcess.(UNIXProcess.java:133)
W/System.err: at java.lang.ProcessImpl.start(ProcessImpl.java:128)
W/System.err: at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
W/System.err: ... 22 more
首先感谢写了这么好的更新框架,在使用过程中我遇到了两个问题,想请大大提点一下。
1、开启了debug(true),但是好像日志中没有发现调试日志。
2、软件正常完成了版本更新,但是在新版APP还是跳出了升级版本的提示。(更新后APP的versionCode,versionName和远程更新服务器返回的json中的versionCode,versionName字段已经一致了)
Application文件
XUpdate.get()
.isWifiOnly(false) //默认设置只在wifi下检查版本更新
.isGet(true) //默认设置使用get请求检查版本
.isAutoMode(false) //默认设置非自动模式,可根据具体使用配置
.param("versionCode", UpdateUtils.getVersionCode(this)) //设置默认公共请求参数
.param("appKey", getPackageName())
.debug(true)
.setOnUpdateFailureListener(new OnUpdateFailureListener() { //设置版本更新出错的监听
@Override
public void onFailure(UpdateError error) {
Log.d("application",error.toString());
}
})
.setIUpdateHttpService(new OKHttpUpdateHttpService()) //这个必须设置!实现网络请求功能。
.init(this); //这个必须初始化
Activity文件
XUpdate.newBuild(this)
.updateUrl(updateurl)
.updateParser(new CustomUpdateParser())
.update();
1:后台接口给的json串,按照你的方式一点都不行。
2:文档问题,后台数据跟接口完全对不上。
当apkCacheDir设置为内部存储(比如:/data/data/package/files)时,安装时提示包解析遇到问题;设置为外部存储时(/storage/emulated/0/Download)时,安装包解析正常,可以安装成功。在网上查了下说apk文件权限不够,设置安装监听后,在安装前修改文件权限后,还是提示解析出错。
XUpdate.get().setOnInstallListener(new OnInstallListener() {
@OverRide
public boolean onInstallApk(@nonnull Context context, @nonnull File apkFile, @nonnull DownloadEntity downloadEntity) {
String command = "chmod -R 777 " + apkFile.getAbsolutePath();
ShellUtils.execCmd(command, true);
AppUtils.installApp(apkFile);
return true;
}
依赖太多了,想试验一下都没有成功。
先是:More than one file was found with OS independent path 'META-INF/rxjava.properties
后来:Couldn't load memtrack module //这个可能是那个依赖库没有加引起的。
不过最终配成功了。
XHttp2
这个依赖较多。开始没有加上 rxjava,rxandroid,总是闪退。
okhttp
这个依赖少一点。
总算成功了,谢谢。
感谢作者,我并不是原生的Android开发者,我使用的是react-native来创建我的项目,我写了一个react-native插件来封装你的update功能,但是init方法需要接受application,导致我的封装产生了一些问题。我看过你的源代码,其实传入context对象也是一样的,我不得不fork一份你的代码,以便于在我的项目中使用。可否将这个修改一下。感谢
使用过程中ModifyContent显示中文乱码,debug下CustomParcer的json就已经是乱码了,请问要怎么入手解决?谢谢。
建议添加一种模式为,自动点击更新按钮。比静默模式更为友好
用户无需点击更新按钮,且可以直观看到更新进度
我是在reactNative中使用的,在MainActivity使用
XUpdate.newBuild(MainActivity.this)
.updateUrl(mUpdateUrl)
.update();
报错: 使用默认的版本更新提示器,context必须传FragmentActivity!
不会安卓只是想在集成在我的reactNative 应用中使用,谢谢
1:忽略当前版本建议根据VersionCode,小版本更新name有时候会懒的改,code绝对不会
2:如果允许强制更新,.supportBackgroundUpdate(true)建议不可用,因为用户可以后台更新 然后不安装继续使用旧版本
com.github.xuexiangjys:XUpdate:1.0.8
java.lang.VerifyError: com/xuexiang/xupdate/utils/UpdateUtils
at com.xuexiang.xupdate.UpdateManager$Builder.build(UpdateManager.java:642)
at com.xuexiang.xupdate.UpdateManager$Builder.update(UpdateManager.java:665)
如题
业务逻辑还需要在download方法里用到UpdateEntity某个字段,希望能把实体之间传递过来
/**
* 根据下载地址获取文件名
*
* @param downloadUrl
* @return
/
@nonnull
public static String getApkNameByDownloadUrl(String downloadUrl) {
if (TextUtils.isEmpty(downloadUrl)) {
return "temp.apk";
} else {
String appName = downloadUrl.substring(downloadUrl.lastIndexOf("/") + 1, downloadUrl.length());
if (!appName.endsWith(".apk")) {
appName = "temp.apk";
}
return appName;
}
}
/*
* 过滤文件名非法字符
/
private static Pattern FilePattern = Pattern.compile("[\\/:?"<>|]");
public static String filenameFilter(String str) {
return str == null ? null : FilePattern.matcher(str).replaceAll("");
}
通知栏没看到可以自定义图标和内容API
如果服务器端判断是否更新,那也要先从客户端发本地版本号过去吧?
这部分说明不太清楚,影响使用啊。
谢谢
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.