Tencent / tinker

Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstall apk.
Other
17.17k stars 3.34k forks source link

第二次补丁无法生效 #1094

Open xue12311 opened 5 years ago

xue12311 commented 5 years ago

异常类型:app运行时异常/编译异常

手机型号:MIX 2

手机系统版本:Android 8.0

tinker版本:1.2.13

gradle版本:gradle-5.1.1-all

是否使用热更新SDK: 使用了tinkerpatch-android-sdk:1.2.13

系统:window 10

堆栈/日志: 2019-05-11 09:46:50.873 26784-26808/? I/vndksupport: sphal namespace is not configured for this process. Loading /vendor/lib64/hw/gralloc.msm8998.so from the current namespace instead. 2019-05-11 09:46:50.898 26784-26784/? W/Tinker.UpgradePatchRetry: onPatchRetryLoad patch file: /data/user/0/com.example.tinkersampleandroid/tinker_temp/temp.apk is not exist, just return 2019-05-11 09:46:50.900 26784-26784/? E/Tinker.ReportUtil: checkTinkerApplySuccess, current patch md5:12e151417821a1dd45804fdf56108fed is not equal with tinker version fb976ff7c350efca499c6008a2005eb2 2019-05-11 09:46:50.901 26784-26784/? W/Tinker.ClientImpl: [retryAllReportFails], there is no fail report, just return 2019-05-11 09:46:50.910 26784-26784/? I/Tinker.UrlConnectionFetcher: loadData from url: http://q.tinkerpatch.com/dev/0523ff2b085041b0/1.0.0?d=127ee352-12e0-4860-a7c6-4c39fb4c9af5&v=1557539210909, method:GET, body:null 2019-05-11 09:46:50.911 26784-26784/? E/Tinker.ReportUtil: checkTinkerApplySuccess, current patch md5:12e151417821a1dd45804fdf56108fed is not equal with tinker version fb976ff7c350efca499c6008a2005eb2 2019-05-11 09:46:50.911 26784-26784/? W/Tinker.ClientImpl: [retryAllReportFails], there is no fail report, just return 2019-05-11 09:46:50.912 26784-26815/? D/NetworkSecurityConfig: No Network Security Config specified, using platform default 2019-05-11 09:46:50.919 26784-26784/? I/Tinker.ClientImpl: tinker is syncing url http://q.tinkerpatch.com/dev/0523ff2b085041b0/1.0.0?d=127ee352-12e0-4860-a7c6-4c39fb4c9af5&v=1557539210909:, just return 2019-05-11 09:46:50.923 26784-26791/? I/zygote64: Do partial code cache collection, code=60KB, data=49KB 2019-05-11 09:46:50.923 26784-26791/? I/zygote64: After code cache collection, code=60KB, data=49KB 2019-05-11 09:46:50.924 26784-26791/? I/zygote64: Increasing code cache capacity to 256KB 2019-05-11 09:46:51.166 26784-26815/? I/Tinker.UrlConnectionFetcher: response code 200 msg: OK 2019-05-11 09:46:51.166 26784-26815/? I/Tinker.ClientImpl: tinker server sync respond:{"v":10} 2019-05-11 09:46:51.167 26784-26815/? I/Tinker.VersionInfo: VersionCheck: target version 10 is not latest. current version is 10 2019-05-11 09:46:51.168 26784-26815/? D/Tinker.PatchRequestCallback: [beforePatchRequest] have pending patch to install, version: 10, patch:/data/user/0/com.example.tinkersampleandroid/tinker_server/1.0.0_10.apk 2019-05-11 09:46:51.168 26784-26815/? I/Tinker.VersionInfo: updateVersionInfo file path:/data/user/0/com.example.tinkersampleandroid/tinker_server/0523ff2b085041b0_version.info, appVersion: 1.0.0, uuid:127ee352-12e0-4860-a7c6-4c39fb4c9af5, abi:arm64-v8a, patchVersion:10, patchMd5:12e151417821a1dd45804fdf56108fed, grayValue:10, crashTimes:0, retryTimes:2, applySuccess:0, patchSuccess:0 2019-05-11 09:46:51.171 26784-26815/? I/Tinker.TinkerServerPatchListener: receive a patch file: /data/user/0/com.example.tinkersampleandroid/tinker_server/1.0.0_10.apk, file size:4289 2019-05-11 09:46:51.173 26784-26815/? I/Tinker.DefaultLoadReporter: patch loadReporter onLoadPatchListenerReceiveFail: patch receive fail: /data/user/0/com.example.tinkersampleandroid/tinker_server/1.0.0_10.apk, code: -6 2019-05-11 09:46:51.174 26784-26815/? I/Tinker.ClientImpl: Fetch result: needn't update, gray: 10

我使用Tinker进行热更新,首先生成appVersion为1.0.0版本的基准apk,在修改了appVersion版本为 1.0.1的补丁1.0.1,上传这时 补丁1.0.1的补丁版本号为 9,然后通过手机安装基准apk,可以正常升级到1.0.1; 然后这时我再次添加appVersion版本为 1.0.2的补丁(还是基于版本1.0.0的基准apk生成的),上传补丁后得到补丁号版本为10,手机apk重启,重新查询补丁,这时我看日志说补丁版本号已经是10了,可是我apk的界面还是补丁版本9的界面,感觉补丁没有生效。如果我手机卸载重装基准apk,可以正常加载补丁1.0.2

xue12311 commented 5 years ago

在加载第一次补丁1.0.1(补丁版本9)后,发布补丁1.0.2(补丁版本10),apk获得当前补丁是10(即已经是第二次补丁了)但是界面没有修改

tys282000 commented 5 years ago

额,其实那个log并不表示版本号为10的patch已经加载成功了。我在log里看到patch check返回-6,应该就是两个版本的patch apk的MD5相同导致Tinker认为第二个补丁已经加载了。看下版本号9和版本号10的两个patch apk的MD5是否相同?

xue12311 commented 5 years ago

请问补丁包apk的md5怎么查看?我如果使用bugly版的Tinker是可以的,但是单独使用Tinker的,没有注明tinkerId ,这个有影响吗

tys282000 commented 5 years ago

单独使用tinker是要在build.gradle里配置tinkerId的 linux下可以直接用md5sum计算补丁apk的md5,windows下可以装个hashtab之类的工具查看补丁apk的md5。

xue12311 commented 5 years ago

image 我尝试发布两个补丁,发现他们的md5不一样,但是界面还是没有变化。一个版本为17,一个是18

2019-05-13 18:31:55.035 13802-13802/? I/Tinker.VersionInfo: readVersionInfo file path:/data/user/0/tinker.sample.android/tinker_server/0523ff2b085041b0_version.info, appVersion: 1.0.0, uuid:d2670983-6b57-4352-9f2e-07d0af2177e1, abi:arm64-v8a, patchVersion:17, patchMd5:512e89824841f44205041d2d0f4ed412, grayValue:4, crashTimes:0, retryTimes:0, applySuccess:1, patchSuccess:1 2019-05-13 18:31:55.538 13802-13829/? I/Tinker.VersionInfo: updateVersionInfo file path:/data/user/0/tinker.sample.android/tinker_server/0523ff2b085041b0_version.info, appVersion: 1.0.0, uuid:d2670983-6b57-4352-9f2e-07d0af2177e1, abi:arm64-v8a, patchVersion:18, patchMd5:b39feeaf88bf3f44f49fda8c78f615dd, grayValue:4, crashTimes:0, retryTimes:0, applySuccess:1, patchSuccess:1 2019-05-13 18:31:55.538 13802-13829/? I/Tinker.VersionInfo: updateVersionInfo file path:/data/user/0/tinker.sample.android/tinker_server/0523ff2b085041b0_version.info, appVersion: 1.0.0, uuid:d2670983-6b57-4352-9f2e-07d0af2177e1, abi:arm64-v8a, patchVersion:18, patchMd5:b39feeaf88bf3f44f49fda8c78f615dd, grayValue:4, crashTimes:0, retryTimes:0, applySuccess:0, patchSuccess:0 2019-05-13 18:32:22.400 13886-13886/? I/Tinker.VersionInfo: readVersionInfo file path:/data/user/0/tinker.sample.android/tinker_server/0523ff2b085041b0_version.info, appVersion: 1.0.0, uuid:d2670983-6b57-4352-9f2e-07d0af2177e1, abi:arm64-v8a, patchVersion:18, patchMd5:b39feeaf88bf3f44f49fda8c78f615dd, grayValue:4, crashTimes:0, retryTimes:0, applySuccess:0, patchSuccess:0 2019-05-13 18:32:22.530 13886-13886/? E/Tinker.ReportUtil: checkTinkerApplySuccess, current patch md5:b39feeaf88bf3f44f49fda8c78f615dd is not equal with tinker version 512e89824841f44205041d2d0f4ed412 2019-05-13 18:32:22.647 13886-13912/? I/Tinker.VersionInfo: updateVersionInfo file path:/data/user/0/tinker.sample.android/tinker_server/0523ff2b085041b0_version.info, appVersion: 1.0.0, uuid:d2670983-6b57-4352-9f2e-07d0af2177e1, abi:arm64-v8a, patchVersion:18, patchMd5:b39feeaf88bf3f44f49fda8c78f615dd, grayValue:4, crashTimes:0, retryTimes:1, applySuccess:0, patchSuccess:

TracyZhangLei commented 5 years ago

问题处在DefaultPatchListener里面的patchCheck方法

屏幕快照 2019-05-14 下午4 15 05
tys282000 commented 5 years ago

@xue12311 发下那两个patch包到yinshengtang92@gmail.com吧,感觉应该是打补丁包的过程有问题。

TracyZhangLei commented 5 years ago

可以自己定义PatchListener,重写patchCheck方法,去掉DefaultPatchListener里面的上图逻辑

zh2016hz commented 5 years ago

可以自己定义PatchListener,重写patchCheck方法,去掉DefaultPatchListener里面的上图逻辑

请问下,这个要怎么去自定义啊,看了下,初始化并没有直接给API去扩展,请解答下 我的初始化代码如下: // 初始化TinkerPatch SDK, 更多配置可参照API章节中的,初始化SDK TinkerPatch.init(tinkerApplicationLike) .reflectPatchLibrary() .setPatchRollbackOnScreenOff(true) .setPatchRestartOnSrceenOff(true). setFetchPatchIntervalByHours(1) .fetchDynamicConfig(new ConfigRequestCallback() { @Override public void onSuccess(HashMap<String, String> hashMap) { Log.e("", "onSuccess: " ); }

                    @Override
                    public void onFail(Exception e) {
                        Log.e("", "onSuccess: " );
                    }
                }, true);

        // 每隔3个小时(通过setFetchPatchIntervalByHours设置)去访问后台时候有更新,通过handler实现轮训的效果
        TinkerPatch.with().fetchPatchUpdateAndPollWithInterval();
        TinkerPatch.with().fetchPatchUpdate(true);
zh2016hz commented 5 years ago

异常类型:应用程序运行时异常/编译异常

手机型号:MIX 2

手机系统版本:Android 8.0

补锅匠版本:1.2.13

gradle这个版本:gradle这个-5.1.1-ALL

是否使用热更新SDK:使用了tinkerpatch-android-sdk:1.2.13

系统:窗口10

堆栈/日志: 2019-05-11 09:46:50.873 26784-26808 /?I / vndksupport:未为此进程配置sphal命名空间。从当前命名空间加载/vendor/lib64/hw/gralloc.msm8998.so。 2019-05-11 09:46:50.898 26784-26784 /?W / Tinker.UpgradePatchRetry:onPatchRetryLoad补丁文件:/data/user/0/com.example.tinkersampleandroid/tinker_temp/temp.apk不存在,只返回 2019-05-11 09:46:50.900 26784-26784 /?E / Tinker.ReportUtil:checkTinkerApplySuccess,当前补丁md5:12e151417821a1dd45804fdf56108fed与修补版本不相同fb976ff7c350efca499c6008a2005eb2 2019-05-11 09:46:50.901 26784-26784 /?W / Tinker.ClientImpl:[retryAllReportFails],没有失败报告,只返回 2019-05-11 09:46:50.910 26784-26784 /?I / Tinker.UrlConnectionFetcher:来自url的loadData:http://q.tinkerpatch.com/dev/0523ff2b085041b0/1.0.0?d = 127ee352-12e0-4860-a7c6-4c39fb4c9af5&v = 1557539210909 ,方法:GET,body:null 2019 -05-11 09:46:50.911 26784-26784 /?E / Tinker.ReportUtil:checkTinkerApplySuccess,当前补丁md5:12e151417821a1dd45804fdf56108fed与修补版本不相同fb976ff7c350efca499c6008a2005eb2 2019-05-11 09:46:50.911 26784-26784 /?W / Tinker.ClientImpl:[retryAllReportFails],没有失败报告,只返回 2019-05-11 09:46:50.912 26784-26815 /?D / NetworkSecurityConfig:没有指定网络安全配置,使用平台默认值 2019-05-11 09:46:50.919 26784-26784 /?I / Tinker.ClientImpl:tinker正在同步urlhttp://q.tinkerpatch.com/dev/0523ff2b085041b0/1.0.0?d=127ee352-12e0-4860-a7c6-4c39fb4c9af5&v=1557539210909 :,只返回2019-05-11 09:46:50.923 26784-26791 /?I / zygote64:部分代码缓存集合,代码= 60KB,数据= 49KB 2019-05-11 09:46:50.923 26784-26791 /?I / zygote64:代码缓存收集后,代码= 60KB,数据= 49KB 2019-05-11 09:46:50.924 26784-26791 /?I / zygote64:将代码缓存容量增加到256KB 2019-05-11 09:46:51.166 26784-26815 /?I / Tinker.UrlConnectionFetcher:响应代码200 msg:OK 2019-05-11 09:46:51.166 26784-26815 /?I / Tinker.ClientImpl:修补服务器同步响应:{“v”:10} 2019-05-11 09:46:51.167 26784-26815 /?I / Tinker.VersionInfo:VersionCheck:目标版本10不是最新的。目前的版本是10 2019-05-11 09:46:51.168 26784-26815 /?D / Tinker.PatchRequestCallback:[beforePatchRequest]有待安装的补丁,版本:10,补丁:/data/user/0/com.example.tinkersampleandroid/tinker_server/1.0.0_10.apk 2019-05-11 09:46: 51.168 26784-26815 /?I / Tinker.VersionInfo:updateVersionInfo文件路径:/data/user/0/com.example.tinkersampleandroid/tinker_server/0523ff2b085041b0_version.info,appVersion:1.0.0,uuid:127ee352-12e0-4860-a7c6-4c39fb4c9af5,abi:arm64 -v8a,patchVersion:10,patchMd5:12e151417821a1dd45804fdf56108fed,grayValue:10,crashTimes:0,retryTimes:2,applySuccess:0,patchSuccess:0 2019-05-11 09:46:51.171 26784-26815 /?I / Tinker.TinkerServerPatchListener:接收补丁文件:/data/user/0/com.example.tinkersampleandroid/tinker_server/1.0.0_10.apk,文件大小:4289 2019-05-11 09:46:51.173 26784-26815 /?I / Tinker.DefaultLoadReporter:patch loadReporter onLoadPatchListenerReceiveFail:补丁接收失败:/data/user/0/com.example.tinkersampleandroid/tinker_server/1.0.0_10.apk,代码:-6 2019-05-11 09:46:51.174 26784 -26815 /?I / Tinker.ClientImpl:获取结果:无需更新,灰色:10

我使用Tinker进行热更新,首先生成appVersion为1.0.0版本的基准apk,在修改了appVersion版本为1.0.1的补丁1.0.1,上传这时补丁1.0.1的补丁版本号为9,然后通过手机安装基准apk,可以正常升级到1.0.1; 然后这时我再次添加appVersion版本为1.0.2的补丁(还是基于版本1.0.0的基准apk生成的),上传补丁后得到补丁号版本为10 ,手机APK重启,重新查询补丁,这时我看日志说补丁版本号已经是10了,可是我的apk的界面还是补丁版本9的界面,感觉补丁没有生效。如果我手机卸载重装基准APK,可以正常加载补丁1.0.2

请问解决了吗?我也遇到 首次补丁可以,在基础包上再发一次补丁,怎么都不生效,报错md5不一致问题,看到下面大神的方法,说重写check的方法,但是网上找了下,没有思路,

TracyZhangLei commented 5 years ago

可以自己定义PatchListener,重写patchCheck方法,去掉DefaultPatchListener里面的上图逻辑

请问下,这个要怎么去自定义啊,看了下,初始化并没有直接给API去扩展,请解答下 我的初始化代码如下: // 初始化TinkerPatch SDK, 更多配置可参照API章节中的,初始化SDK TinkerPatch.init(tinkerApplicationLike) .reflectPatchLibrary() .setPatchRollbackOnScreenOff(true) .setPatchRestartOnSrceenOff(true). setFetchPatchIntervalByHours(1) .fetchDynamicConfig(new ConfigRequestCallback() { @override public void onSuccess(HashMap<String, String> hashMap) { Log.e("", "onSuccess: " ); }

                    @Override
                    public void onFail(Exception e) {
                        Log.e("", "onSuccess: " );
                    }
                }, true);

        // 每隔3个小时(通过setFetchPatchIntervalByHours设置)去访问后台时候有更新,通过handler实现轮训的效果
        TinkerPatch.with().fetchPatchUpdateAndPollWithInterval();
        TinkerPatch.with().fetchPatchUpdate(true);
屏幕快照 2019-05-16 下午7 58 47

创建自己的PatchListener,代码跟DefaultPatchListener一样,只去掉我说的那段。

xh2009cn commented 5 years ago

我也遇到同样的问题,是不是进程重启的时候忘记更新isRemoveNewVersion了,我看只有调用Tinker.cleanPatch才会更新

wantyou365 commented 5 years ago

把int returnCode = super.patchCheck(path, patchMd5)改成本地的,把super中的代码copy出来

问题处在DefaultPatchListener里面的patchCheck方法

屏幕快照 2019-05-14 下午4 15 05

int returnCode = super.patchCheck(path, patchMd5);这个改成本地方法,把父类里的方法copy出来再把这段禁掉就行了。。不过这样的话patchversion就没用了。要自己提前做判断

dong30241 commented 4 years ago

差异包也有版本号,在gradle里,要把差异包的版本号也提高