Tencent / tinker

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

【请求协助】OAID-sdk和Tinker的热补丁有冲突: 加载Tinker补丁后,OAID Sdk初始化时就Crash了 #1519

Closed sailor1861 closed 3 years ago

sailor1861 commented 3 years ago

背景: OAID-Sdk:(移动安全联盟出的 移动智能终端补充设备标识体系统一调用 SDK),目前使用广泛

我在Tinker最新版本(V1.9.14.10)的Sample里,接入了OAID-Sdk;未加载补丁时,运行正常; 但是加载Tinker补丁后,就会出现OAID Sdk初始化时就Crash了; 这个问题, 应该是联系OAID的开发者,分析崩溃问题;目前也正在联系他们中,未果!

介于这两个Sdk,都是应用范围广泛,反馈到论坛,不知道大家有没有遇到呢?

异常类型:app加载补丁后,运行OAID Sdk的init()方法,就出现空对象异常

手机型号:所有机型均能复现

手机系统版本:所有系统均能复现

tinker版本:1.9.14.10

gradle版本:gradle-4.6

是否使用热更新SDK: 否

系统:如:Mac

堆栈/日志:

1). 加载补丁 01-22 16:55:44.376 4486-4486/? I/Tinker.TinkerDexLoader: classloader: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/tinker.sample.android-1/base.apk"],nativeLibraryDirectories=[/data/app/tinker.sample.android-1/lib/arm64, /data/app/tinker.sample.android-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]]

01-22 16:55:44.376 4486-4486/? I/Tinker.TinkerDexLoader: verify dex file:/data/user/0/tinker.sample.android/tinker/patch-132b9c57/dex/tinker_classN.apk md5, use time: 0 01-22 16:55:44.376 4486-4486/? I/Tinker.ClassLoaderAdder: installDexes dexOptDir: /data/user/0/tinker.sample.android/tinker/patch-132b9c57/odex, dex size:1 01-22 16:55:44.390 4486-4486/? I/Tinker.ClassLoaderAdder: after loaded classloader: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/user/0/tinker.sample.android/tinker/patch-132b9c57/dex/tinker_classN.apk", zip file "/data/app/tinker.sample.android-1/base.apk"],nativeLibraryDirectories=[/data/app/tinker.sample.android-1/lib/arm64, /data/app/tinker.sample.android-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]], dex size:1 01-22 16:55:44.390 4486-4486/? W/Tinker.ClassLoaderAdder: checkDexInstall result:true 01-22 16:55:44.391 4486-4486/? I/Tinker.IncrementCompMgr: package has no incremental component meta, skip init. 01-22 16:55:44.391 4486-4486/? I/Tinker.AppInfoChangedBlocker: tryStart: SDK_INT is less than 26, skip rest logic.

01-22 16:55:44.391 4486-4486/? I/Tinker.PatchInfo: rewritePatchInfoFile file path:/data/user/0/tinker.sample.android/tinker/patch.info , oldVer:132b9c57748d7234287223778f575979, newVer:132b9c57748d7234287223778f575979, isProtectedApp:0, isRemoveNewVersion:0, fingerprint:SMARTISAN/surabaya/surabaya:6.0.1/MXB48T/17:user/release-keys, oatDir:odex, isRemoveInterpretOATDir:0 01-22 16:55:44.393 4486-4486/? I/Tinker.TinkerLoader: tryLoadPatchFiles: load end, ok! 01-22 16:55:44.395 4486-4486/? D/Tinker.DefaultAppLike: onBaseContextAttached:

01-22 16:55:44.402 4486-4486/? W/Tinker.Tinker: tinker patch directory: /data/user/0/tinker.sample.android/tinker 01-22 16:55:44.405 4486-4486/? I/Tinker.Tinker: try to install tinker, isEnable: true, version: 1.9.14.10

2). 执行 com.bun.miitmdid.core.MdidSdkHelper.InitSdk(); 改Sdk就Crash! --------- beginning of crash 01-22 16:55:50.754 4486-4486/tinker.sample.android E/AndroidRuntime: FATAL EXCEPTION: main Process: tinker.sample.android, PID: 4486 java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference at com.bun.miitmdid.core.MdidSdkHelper.InitSdk() at tinker.sample.android.app.MainActivity.testUms(MainActivity.java:213) at tinker.sample.android.app.MainActivity.access$000(MainActivity.java:48) at tinker.sample.android.app.MainActivity$5.onClick(MainActivity.java:121) at android.view.View.performClick(View.java:5219) at android.view.View$PerformClick.run(View.java:21268) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5554) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:935) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:726)

代码情况说明: 1). OAID的官网: http://www.msa-alliance.cn/col.jsp?id=120 2). Tinker的Sample接入OAID的Demo: 我已经推送到地址(https://github.com/sailor1861/tinker/tree/tinker-1.9.14.10/),就是官方的Sample,可以直接编译; 3). 基准包apk和补丁apk: 我也已经提交到https://github.com/sailor1861/tinker/tree/tinker-1.9.14.10/tinker-sample-android/app/demo, 可以直接运行,adb push app/demo/app-debug-patch_signed_7zip.apk /mnt/sdcard/patch_signed_7zip.apk后,点击界面按钮“loadPatch”,可以复现本Case;

其他: 反编译看OAID的代码,是Jni接口返回了Null对象导致的异常; 目前没法查看OAID的C层代码,暂时无法排查Native层的代码逻辑;

由于OAID和Tinker 目前使用范围都很广, 所以反馈到论坛, 请求大家的协助,有没有遇到过?

sailor1861 commented 3 years ago

补充一下补丁情况: 就是Sample里MainActivity.onCreate()中 添加一行logcat输出;

补丁一下OAID的初始化代码:非常简单,就是调用一个Jni方法,然后返回的是空对象;导致了后续的NullPointerException

MdidSdkHelper.InitSdk(getApplication(), true, new IIdentifierListener() {
            @Override
            public void OnSupport(boolean b, IdSupplier idSupplier) {

            }
        });

public class MdidSdkHelper {
   public static int InitSdk(Context arg0, boolean arg1, IIdentifierListener arg2) {
        // 就是这个Jni方法返回的object是空的导致的; 只要加载补丁后,就会复现
        Object object = Utils.rL(new Object[]{null, arg0, arg1, arg2, 28, 1598952044250L});  
        return (Integer)object;
    }
}

public class Utils {
    public Utils() {
    }

    public static native Object rL(Object[] var0);
}
xialonghua commented 3 years ago

补充一下补丁情况: 就是Sample里MainActivity.onCreate()中 添加一行logcat输出;

补丁一下OAID的初始化代码:非常简单,就是调用一个Jni方法,然后返回的是空对象;导致了后续的NullPointerException

MdidSdkHelper.InitSdk(getApplication(), true, new IIdentifierListener() {
            @Override
            public void OnSupport(boolean b, IdSupplier idSupplier) {

            }
        });

public class MdidSdkHelper {
   public static int InitSdk(Context arg0, boolean arg1, IIdentifierListener arg2) {
        // 就是这个Jni方法返回的object是空的导致的; 只要加载补丁后,就会复现
        Object object = Utils.rL(new Object[]{null, arg0, arg1, arg2, 28, 1598952044250L});  
        return (Integer)object;
    }
}

public class Utils {
    public Utils() {
    }

    public static native Object rL(Object[] var0);
}

oaid多少版本,建议升级最新试试

sailor1861 commented 3 years ago

补充一下补丁情况: 就是Sample里MainActivity.onCreate()中 添加一行logcat输出; 补丁一下OAID的初始化代码:非常简单,就是调用一个Jni方法,然后返回的是空对象;导致了后续的NullPointerException

MdidSdkHelper.InitSdk(getApplication(), true, new IIdentifierListener() {
            @Override
            public void OnSupport(boolean b, IdSupplier idSupplier) {

            }
        });

public class MdidSdkHelper {
   public static int InitSdk(Context arg0, boolean arg1, IIdentifierListener arg2) {
        // 就是这个Jni方法返回的object是空的导致的; 只要加载补丁后,就会复现
        Object object = Utils.rL(new Object[]{null, arg0, arg1, arg2, 28, 1598952044250L});  
        return (Integer)object;
    }
}

public class Utils {
    public Utils() {
    }

    public static native Object rL(Object[] var0);
}

oaid多少版本,建议升级最新试试

次新版本:vertion 1.0.23

我试一试最新版本

sailor1861 commented 3 years ago

version 1.0.23: 所有机型,均存在这个问题; version 1.0.25:最新版本;在6.0机型上正常,7.0及以上机型-依然存在上述问题;

xixilala-2019 commented 3 years ago

老哥,这个问题有进展吗,我这边也遇到了。 不过没有用tinker,我的demo可以正常拿到OAID,但是别人集成我们的SDK后,也报了同样的错。 刚开始以为是 这个方法的 Context 传空了,但是打印日志并不是空 InitSdk(Context arg0, boolean arg1, IIdentifierListener arg2)

我自己又跑demo,Context故意传空,但是InitSdk并不会出异常,而是正常返回一个错误码。

xixilala-2019 commented 3 years ago

老哥,这个问题有进展吗,我这边也遇到了。 不过没有用tinker,我的demo可以正常拿到OAID,但是别人集成我们的SDK后,也报了同样的错。 刚开始以为是 这个方法的 Context 传空了,但是打印日志并不是空 InitSdk(Context arg0, boolean arg1, IIdentifierListener arg2)

我自己又跑demo,Context故意传空,但是InitSdk并不会出异常,而是正常返回一个错误码。

我这边找到原因了 我用的是1.0.25版本的,自己demo打包在 assets 目录下生成一个 zlsioh.dat 文件,但是有问题的包没有这个文件 把有问题的包加入这个文件重新签名,就可以正常使用了 但是不清楚这个文件是怎么打包就出来了

sailor1861 commented 3 years ago

老哥,这个问题有进展吗,我这边也遇到了。 不过没有用tinker,我的demo可以正常拿到OAID,但是别人集成我们的SDK后,也报了同样的错。 刚开始以为是 这个方法的 Context 传空了,但是打印日志并不是空 InitSdk(Context arg0, boolean arg1, IIdentifierListener arg2) 我自己又跑demo,Context故意传空,但是InitSdk并不会出异常,而是正常返回一个错误码。

我这边找到原因了 我用的是1.0.25版本的,自己demo打包在 assets 目录下生成一个 zlsioh.dat 文件,但是有问题的包没有这个文件 把有问题的包加入这个文件重新签名,就可以正常使用了 但是不清楚这个文件是怎么打包就出来了

还没有解决呢; 我再看看你说的情况 能加个联系方式吗? 我的QQ:672518915

rayzl commented 3 years ago

老哥这个问题有进展吗,我这个也遇到了。 不过没有用tinker,我的demo可以拿到OAID,但是别人集成我们的SDK后,也报了同样的 这个错误。刚开始以为是方法的Context 传空了,但是打印日志不是空 InitSdk(Context arg0, boolean arg1, IIdentifierListener arg2) 我自己又跑demo,上下文故意传空,但InitSdk并不会出异常,可能正常返回一个错误码。

我这个找到的原因了 我用的是 1.0.25 版本的,自己演示打包在资产目录下生成一个 zlsioh.dat 文件,但是有问题的包没有这个文件 把问题的包加入这个文件签名,就可以正常使用了, 但是这个文件是怎么打包就出来了

这个方法有效,这个zlsioh.dat来自于jar包中的assets目录下,用zip压缩工具打开jar包就可以看到