当前位置: 首页 > news >正文

外国人做的篆字网站女教师遭网课入侵直播录屏曝

外国人做的篆字网站,女教师遭网课入侵直播录屏曝,行业网站做的好的,本地的上海网站建设一般 Android 通过 PackageInfo 这个类来获取应用安装包信息,比如应用内包含的所有 Activity 名称、应用版本号之类的。PackageInfo 通过 PackageManager 来获取,代码如下: PackageInfo packageInfo context.getPackageManager().getPackage…

一般 Android 通过 PackageInfo 这个类来获取应用安装包信息,比如应用内包含的所有 Activity 名称、应用版本号之类的。PackageInfo 通过 PackageManager 来获取,代码如下:

PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
复制代码

比如我们要获取应用版本号时:

public static int getVersionCode(Context context) {PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);return info.versionCode;
}
复制代码

Tip: 获取应用自身版本号,推荐使用BuildConfig.VERSION_CODE 方式,这里只是为了方便举例说明问题。

一般情况下,上面的方法是可以正常拿到数据的,但是在某些情况下这也可能会引发 java.lang.RuntimeException: Package manager has died 异常。

 java.lang.RuntimeException: Package manager has died 							at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:82)
复制代码

为了分析引发 Package manager has died 这个问题的具体原因,我们先来看看 getPackageInfo 这个方法: frameworks/base/core/java/android/app/ApplicationPackageManager.java:

@Override  
public PackageInfo getPackageInfo(String packageName, int flags)  throws NameNotFoundException {  try {  PackageInfo pi = mPM.getPackageInfo(packageName, flags, mContext.getUserId());  if (pi != null) {  return pi;  }  } catch (RemoteException e) {  throw new RuntimeException("Package manager has died", e);  }  throw new NameNotFoundException(packageName);  }  
复制代码

从上面可以看出,getPackageInfo 具体实现是一个 Binder 调用,造成这个的原因是因为发生了 RemoteException 。

Binder 调用为什么会造成 Exception,下面再来看看 Binder 代码 frameworks/base/core/jni/android_util_Binder.cpp:

 case FAILED_TRANSACTION:  ALOGE("!!! FAILED BINDER TRANSACTION !!!");  // TransactionTooLargeException is a checked exception, only throw from certain methods.  // FIXME: Transaction too large is the most common reason for FAILED_TRANSACTION  //        but it is not the only one.  The Binder driver can return BR_FAILED_REPLY  //        for other reasons also, such as if the transaction is malformed or  //        refers to an FD that has been closed.  We should change the driver  //        to enable us to distinguish these cases in the future.  jniThrowException(env, canThrowRemoteException  ? "android/os/TransactionTooLargeException"  : "java/lang/RuntimeException", NULL);  break;  
复制代码

可以看出造成 Binder crash 抛出 RuntimeException 是因为获取应用 PackageInfo 中数据量太大了,超出了 Binder 可传递的最大容量,进而导致 PackageManager 崩溃。

对于上面这种情况,考虑如果只获取versionNameversionCode两个信息,不需要Activity等信息,设法让PackageInfo的信息量小点,避免超出了 Binder 可传递的最大容量。

我们可以利用 getPackageInfo(String packageName, @PackageInfoFlags int flags) 它的第二个参数 flag ,使得该方法返回的对象容量减小,比如使用 PackageManager.GET_CONFIGURATIONS

此外,如果对与Binder的同时调用超出了限制就会抛出 TransactionTooLargeException这个异常,虽然这种场景比较少见,但是我们还是有比较避免多个线程同时来调用Binder就可以了。

优化后代码如下:

public static int getVersionCode(Context context) {synchronized(Hold.class){  PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_CONFIGURATIONS);return info.versionCode;}  
}复制代码

转载于:https://juejin.im/post/5a3522f551882506146efc0d

http://www.lbrq.cn/news/2714833.html

相关文章:

  • 网站建设需要哪些职位培训网页
  • 网络系统的价值跟用户数量的关系关键词优化策略有哪些
  • 如何请人创建一个网站排名
  • 网站建设包含项目南宁网络推广外包
  • wordpress多站点无法访问网络营销相关工作岗位
  • 深圳做网站公司排名最新军事新闻最新消息
  • 商城网站建设二次开发网站推广的软件
  • 加强档案网站建设网站关键词快速排名优化
  • 品牌网站建设蔻大蝌蚪哪个平台可以免费推广
  • 网页设计与网站建设在线测试搜狗网页
  • 企业网站设计html百度下载安装到桌面上
  • 印刷网站建设北京seo代理计费
  • 西安搜建站科技网站站长工具名称查网站
  • 网站建设新闻 常识百度的营销推广
  • 新疆建设兵团卫计委网站专长考核什么是网络营销平台
  • 简阳网站建设简阳重庆seo
  • 张槎九江网站建设全媒体广告策划营销
  • 怎么做网站弹幕效果seo基础知识包括什么
  • b2c购物网站开发百度竞价平台官网
  • 做网站购买域名佛山网站建设解决方案
  • 网站页面示意图怎么做网络营销与直播电商专业
  • 没有网站怎么做网推在线seo推广软件
  • 成都网站建设成都app开发百度网页版怎么切换
  • 做网站的赢点公司整站优化工具
  • 哈尔滨网站备案网站seo诊断优化方案
  • wordpress 标签模板下载短视频seo优化排名
  • 做网站被忽悠算诈骗吗广东疫情最新情况
  • 化妆品购物网站开发的意义热搜关键词查询
  • 企业做网站设计沈阳关键词快照优化
  • wordpress 主题公园河南整站关键词排名优化软件
  • 京东【自主售后】物流信息获取_影刀RPA源码解读
  • C# 中 ArrayList动态数组、List<T>列表与 Dictionary<T Key, T Value>字典的深度对比
  • OpenCV阈值处理详解
  • Jenkins一直无法启动,怎么办?
  • UE5.3 C++ 动态多播实战总结
  • Flutter UI Kits by Olayemi Garuba:免费开源的高质量UI组件库