U8SDK——部分渠道启动NoClassFoundException(null)
在SDKTools.java中的getMetaData方法中,将原来的
1 2 3 4 5 6 7 8 9 10 11 |
public static String getMetaData(Activity activity, String key){ try{ ApplicationInfo appInfo = activity.getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA); return "" + appInfo.metaData.get(key); }catch(Exception e){ e.printStackTrace(); } return null; } |
改为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public static String getMetaData(Activity activity, String key){ try{ ApplicationInfo appInfo = activity.getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA); if(appInfo.metaData.containsKey(key)){ return "" + appInfo.metaData.get(key); } }catch(Exception e){ e.printStackTrace(); } return null; } |
如果你里面还有一个application对应的方法,也一并改一下:
1 2 3 4 5 6 7 8 9 10 11 |
public static String getMetaData(Application app, String key){ try{ ApplicationInfo appInfo = app.getPackageManager().getApplicationInfo(app.getPackageName(), PackageManager.GET_META_DATA); return "" + appInfo.metaData.get(key); }catch(Exception e){ e.printStackTrace(); } return null; } |
改为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public static String getMetaData(Application app, String key){ try{ ApplicationInfo appInfo = app.getPackageManager().getApplicationInfo(app.getPackageName(), PackageManager.GET_META_DATA); if(appInfo.metaData.containsKey(key)){ return "" + appInfo.metaData.get(key); } }catch(Exception e){ e.printStackTrace(); } return null; } |
为啥要加这个判断呢?因为原来不加的话,如果这个key不存在,那么直接返回的是一个null字符串。而不是null。
这样就会有一个问题,就如如果某个渠道SDK没有要求Application中处理一些事情,采用之前u8sdk的方案,也就是没有在sdk_manifest.xml中的applicationConfig节点中配置proxyApplication属性。
那么,程序运行的时候,在U8Application去根据U8_PROXY_APPLICATION这个key去meta-data中获取的时候,是不存在的。而用之前的getMetaData方法,如果不存在的话,返回的是一个null字符串,而不是null。会导致attachBaseContext中去获取proxyApplication的时候,proxyAppName实际上的值是”null”从而,if判断是无效的~最后启动的时候会抛出 NoClassFoundException(null)异常信息。
虽然这个异常不会有啥问题,但是部分机型上,可能会导致闪退。
1 2 3 4 5 6 7 8 9 10 |
String proxyAppName = SDKTools.getMetaData(application, metaName); if(proxyAppName == null || SDKTools.isNullOrEmpty(proxyAppName)){ return null; } if(proxyAppName.startsWith(".")){ proxyAppName = DEFAULT_PKG_NAME + proxyAppName; } |
感谢@long.同学发现这个BUG
本文出自 U8SDK技术博客,转载时请注明出处及相应链接。
本文永久链接: http://www.uustory.com/?p=1795