当前位置:   article > 正文

Android 解析软件包时出现问题 -- Error staging apk from content URI

error staging apk from content uri

Android Version : 8.1

使用场景 : 在Rk3288w Android 8.1 的测试设备上安装 "文件管理器" 应用程序 , 若打开***.apk文件,会出现  解析包错误  提示,即安装失败,影响使用.

 如下为ActivityManagerService.java 中的Log信息.

  1. 06-29 08:37:56.559 W/ActivityManager( 369): For security reasons, the system cannot issue a Uri permission grant to content://com.example.filetest.fileprovider/root_path/D007-6A31/Android_APK/weibo.apk [user 0]; use startActivityAsCaller() instead
  2. 06-29 08:37:56.561 E/ActivityManager( 369): getPackageFerformanceMode--ComponentInfo{com.android.packageinstaller/com.android.packageinstaller.InstallStart}----com.android.packageinstaller

最终 错误信息 的Log.

  1. 06-29 08:37:56.768 W/ActivityManager( 369): Permission Denial: opening provider androidx.core.content.FileProvider from ProcessRecord{91d037 1469:com.android.packageinstaller/u0a14} (pid=1469, uid=10014) that is not exported from UID 1000
  2. 06-29 08:37:56.759 E/hwc_rk ( 236): hwc_get_handle_layername:cann't get value from gralloc
  3. 06-29 08:37:56.768 W/InstallStaging( 1469): Error staging apk from content URI
  4. 06-29 08:37:56.768 W/InstallStaging( 1469): java.lang.SecurityException: Permission Denial: opening provider androidx.core.content.FileProvider from ProcessRecord{91d037 1469:com.android.packageinstaller/u0a14} (pid=1469, uid=10014) that is not exported from UID 1000
  5. 06-29 08:37:56.768 W/InstallStaging( 1469): at android.os.Parcel.readException(Parcel.java:2013)
  6. 06-29 08:37:56.768 W/InstallStaging( 1469): at android.os.Parcel.readException(Parcel.java:1959)
  7. 06-29 08:37:56.768 W/InstallStaging( 1469): at android.app.IActivityManager$Stub$Proxy.getContentProvider(IActivityManager.java:4758)
  8. 06-29 08:37:56.768 W/InstallStaging( 1469): at android.app.ActivityThread.acquireProvider(ActivityThread.java:5836)
  9. 06-29 08:37:56.768 W/InstallStaging( 1469): at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2526)
  10. 06-29 08:37:56.768 W/InstallStaging( 1469): at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1780)
  11. 06-29 08:37:56.768 W/InstallStaging( 1469): at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1394)
  12. 06-29 08:37:56.768 W/InstallStaging( 1469): at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1247)
  13. 06-29 08:37:56.768 W/InstallStaging( 1469): at android.content.ContentResolver.openInputStream(ContentResolver.java:967)
  14. 06-29 08:37:56.768 W/InstallStaging( 1469): at com.android.packageinstaller.InstallStaging$StagingAsyncTask.doInBackground(InstallStaging.java:180)
  15. 06-29 08:37:56.768 W/InstallStaging( 1469): at com.android.packageinstaller.InstallStaging$StagingAsyncTask.doInBackground(InstallStaging.java:174)
  16. 06-29 08:37:56.768 W/InstallStaging( 1469): at android.os.AsyncTask$2.call(AsyncTask.java:333)
  17. 06-29 08:37:56.768 W/InstallStaging( 1469): at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  18. 06-29 08:37:56.768 W/InstallStaging( 1469): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
  19. 06-29 08:37:56.768 W/InstallStaging( 1469): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
  20. 06-29 08:37:56.768 W/InstallStaging( 1469): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
  21. 06-29 08:37:56.768 W/InstallStaging( 1469): at java.lang.Thread.run(Thread.java:764)

根据Log中显示 ,主要是FileProvider权限不足以使用系统UID所导致.

结合ActivityManagerService中的Log,定位至:frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java

  1. int checkGrantUriPermissionLocked(int callingUid, String targetPkg, GrantUri grantUri,
  2. final int modeFlags, int lastTargetUid) {
  3. ****************************************************************
  4. // Bail early if system is trying to hand out permissions directly; it
  5. // must always grant permissions on behalf of someone explicit.
  6. final int callingAppId = UserHandle.getAppId(callingUid);
  7. if ((callingAppId == SYSTEM_UID) || (callingAppId == ROOT_UID)) {
  8. if ("com.android.settings.files".equals(grantUri.uri.getAuthority())
  9. || "com.example.filetest.fileprovider".equals(grantUri.uri.getAuthority())) {
  10. // Exempted authority for cropping user photos in Settings app
  11. } else {
  12. Slog.w(TAG, "For security reasons, the system cannot issue a Uri permission"
  13. + " grant to " + grantUri + "; use startActivityAsCaller() instead");
  14. return -1;
  15. }
  16. }
  17. ****************************************************************
  18. }

有此可以看出来,AMS打出错误信息是因为 com.example.filetest 具有  android:sharedUserId="android.uid.system"  属性;

若按照Android 8.0 以上修改,默认拥有权限的只有   com.android.settings.files   其他均不授予权限,直接跳出方法.

故而解决办法如上,在 checkGrantUriPermissionLocked() 此方法中,添加包名,即可不跳出此方法,授予安装权限.

最后单编 framework 层 Push进机器中,问题解决.

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号