从 /system/app 以编程方式安装具有 INSTALL_PACKAGES 权限的应用程序时出现问题

Posted

技术标签:

【中文标题】从 /system/app 以编程方式安装具有 INSTALL_PACKAGES 权限的应用程序时出现问题【英文标题】:Troubles installing programmatically an app with INSTALL_PACKAGES permission from /system/app 【发布时间】:2011-12-29 03:54:21 【问题描述】:

我正在尝试在没有用户交互的情况下以编程方式安装应用程序,但出现此错误

 SecurityException: Neither user 10057 nor current process has android.permission.INSTALL_PACKAGES

我的安装程序位于root手机上的/system/app,“安装非市场应用程序”被选中,安装程序有权限

<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>

这是我的调用函数

 private void puk(Context context) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException

    String fileName = PAKAGE_FILE_NAME ;
    String dir_type = Environment.DIRECTORY_DOWNLOADS;

    File dir= Environment.getExternalStoragePublicDirectory(dir_type);
    java.io.File file = new java.io.File(dir ,fileName);
    Uri packageUri = Uri.fromFile(file);

    PackageManager pm = context.getPackageManager();

    Class<? extends PackageManager> o = pm.getClass();
    Method[] allMethods=o.getMethods();

    for (Method m : allMethods) 
        if (m.getName().equals("installPackage"))  
            Log.e(TAG, "installing the app.." );
            m.invoke(pm,new Object[]  packageUri, null, 1, "com.mic.zapp");
            break;
        
    

  

我收到了这个错误

 11-15 02:46:23.320: W/System.err(10848): java.lang.reflect.InvocationTargetException
 11-15 02:46:23.330: W/System.err(10848):   at java.lang.reflect.Method.invokeNative(Native Method)
 11-15 02:46:23.330: W/System.err(10848):   at java.lang.reflect.Method.invoke(Method.java:507)
 11-15 02:46:23.330: W/System.err(10848):   at com.mic.pvtapi.PvtApiReflectActivity.puk(PvtApiReflectActivity.java:56)
 11-15 02:46:23.330: W/System.err(10848):   at com.mic.pvtapi.PvtApiReflectActivity.onCreate(PvtApiReflectActivity.java:28)
 11-15 02:46:23.330: W/System.err(10848):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
 11-15 02:46:23.330: W/System.err(10848):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
 11-15 02:46:23.330: W/System.err(10848):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
 11-15 02:46:23.330: W/System.err(10848):   at android.app.ActivityThread.access$1500(ActivityThread.java:123)
 11-15 02:46:23.330: W/System.err(10848):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
 11-15 02:46:23.330: W/System.err(10848):   at android.os.Handler.dispatchMessage(Handler.java:99)
 11-15 02:46:23.330: W/System.err(10848):   at android.os.Looper.loop(Looper.java:130)
 11-15 02:46:23.330: W/System.err(10848):   at android.app.ActivityThread.main(ActivityThread.java:3835)
 11-15 02:46:23.330: W/System.err(10848):   at java.lang.reflect.Method.invokeNative(Native Method)
 11-15 02:46:23.330: W/System.err(10848):   at java.lang.reflect.Method.invoke(Method.java:507)
 11-15 02:46:23.330: W/System.err(10848):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
 11-15 02:46:23.330: W/System.err(10848):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
 11-15 02:46:23.330: W/System.err(10848):   at dalvik.system.NativeStart.main(Native Method)
 11-15 02:46:23.330: W/System.err(10848): Caused by: java.lang.SecurityException: Neither user 10057 nor current process has android.permission.INSTALL_PACKAGES.
 11-15 02:46:23.340: W/System.err(10848):   at android.os.Parcel.readException(Parcel.java:1322)
 11-15 02:46:23.340: W/System.err(10848):   at android.os.Parcel.readException(Parcel.java:1276)
 11-15 02:46:23.340: W/System.err(10848):   at android.content.pm.IPackageManager$Stub$Proxy.installPackage(IPackageManager.java:2037)
 11-15 02:46:23.340: W/System.err(10848):   at android.app.ContextImpl$ApplicationPackageManager.installPackage(ContextImpl.java:2613)

我已阅读到,ti 可以通过两种方式获得 INSTALL_PAKAGES 权限:使用固件密钥签署应用程序或将应用程序放入固件中。我的应用程序是从 /system/app 运行的,因此它必须获得特权。

有人知道出了什么问题并给我一些提示吗?谢谢

编辑:

前进一步,后退两步

我们为应用添加了新权限

 <permission 
        android:name="com.mic.pvtapi.permission.INS_AP"
    android:label="etichetta_perm"
    android:protectionLevel="signatureOrSystem" />

<uses-permission android:name="com.mic.pvtapi.permission.INS_AP"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

没有更多错误

Neither user 10057 nor current process has android.permission.INSTALL_PACKAGES

但是新的

     11-15 19:43:58.895: I/ActivityManager(1838): Displayed com.mic.pvtapi/.PvtApiReflectActivity: +421ms
 11-15 19:43:58.955: D/dalvikvm(4008): GC_EXPLICIT freed 3K, 51% free 2681K/5379K, external 0K/0K, paused 132ms
 11-15 19:43:58.955: W/ActivityManager(1838): No content provider found for: 
 11-15 19:43:58.955: E/PackageManager(1838): Couldn't create temp file for downloaded package file.
 11-15 19:43:58.955: W/dalvikvm(1838): threadid=13: thread exiting with uncaught exception (group=0x40018560)
 11-15 19:43:58.965: E/AndroidRuntime(1838): *** FATAL EXCEPTION IN SYSTEM PROCESS: PackageManager
 11-15 19:43:58.965: E/AndroidRuntime(1838): java.lang.NullPointerException
 11-15 19:43:58.965: E/AndroidRuntime(1838):    at com.android.server.PackageManagerService$FileInstallArgs.createCopyFile(PackageManagerService.java:5247)
 11-15 19:43:58.965: E/AndroidRuntime(1838):    at com.android.server.PackageManagerService$FileInstallArgs.copyApk(PackageManagerService.java:5255)
 11-15 19:43:58.965: E/AndroidRuntime(1838):    at com.android.server.PackageManagerService$InstallParams.handleStartCopy(PackageManagerService.java:5051)
 11-15 19:43:58.965: E/AndroidRuntime(1838):    at com.android.server.PackageManagerService$HandlerParams.startCopy(PackageManagerService.java:4902)
 11-15 19:43:58.965: E/AndroidRuntime(1838):    at com.android.server.PackageManagerService$PackageHandler.doHandleMessage(PackageManagerService.java:516)
 11-15 19:43:58.965: E/AndroidRuntime(1838):    at com.android.server.PackageManagerService$PackageHandler.handleMessage(PackageManagerService.java:461)
 11-15 19:43:58.965: E/AndroidRuntime(1838):    at android.os.Handler.dispatchMessage(Handler.java:99)
 11-15 19:43:58.965: E/AndroidRuntime(1838):    at android.os.Looper.loop(Looper.java:130)
 11-15 19:43:58.965: E/AndroidRuntime(1838):    at android.os.HandlerThread.run(HandlerThread.java:60)
 11-15 19:43:58.975: I/Process(1838): Sending signal. PID: 1838 SIG: 9
 11-15 19:43:59.005: I/ServiceManager(1637): service 'SurfaceFlinger' died   

让我的手机崩溃、冻结并重新启动

【问题讨论】:

是否有必要让我们的设备为此植根?? 【参考方案1】:

参考signatureOrSystem permissions on custom ROM

基本上,

    添加所需的&lt;uses-permission&gt; 将 apk 推送到 /system/priv-app

完成(好吧,至少对我有用)。

您不需要添加 android:protectionLevel="signatureOrSystem" 或 android:sharedUserId="android.uid.system"。您可以签署任何证书。

【讨论】:

谢谢!更多数据在这里groups.google.com/forum/m/#!topic/android-platform/Vsa4IsJcOPE fire tv 设备上似乎没有 /system/priv-app 文件夹:/ 把它放在 /system/app 或 /system/priv-app 有什么区别? @AbdelhafidMadoui Zorb 的评论和参考已经说过了。 /priv-app 可以具有系统级权限,而 /app 不能。请注意,此线程是关于 Android K。它可能与以后的主要版本(L 或 M 或 N)无关。【参考方案2】:

我假设把它放在 /system/app 文件夹中并不等同于它被加载到固件中。

【讨论】:

把它放在 /system/app 或 /system/priv-app 有什么区别?【参考方案3】:

关于错误:

SecurityException: Neither user 10057 nor current process has android.permission.INSTALL_PACKAGES

要获得 INSTALL_PACKAGES 权限:

    将您的应用放入 /system/app 使用系统密钥为应用签名

    在 manifest.xml 文件中,将此属性放在标签清单中:

    <manifest android:sharedUserId="android.uid.system" ...
    

【讨论】:

如您所知,不使用系统密钥对应用程序进行签名是不可能的吗? 我可以说做以上所有工作。参考developer.android.com/guide/topics/manifest/…,INSTALL_PACKAGES 是一个signatureOrSystem 权限。他们说“系统仅授予 Android 系统映像中的应用程序或使用与系统映像中的证书相同的证书签名的应用程序的权限。”所以我认为把它放在系统/应用程序中就足够了。 如果不是android的只读分区,那么“Android系统映像”是什么意思?所有系统的东西在哪里? (这个问题对你来说不是直接的,但很笼统:没有人能回答我这是什么意思)你的答案很有用(但我可以将其签名为正确,因为目前它不能解决问题,抱歉) 你有没有想过这个问题?【参考方案4】:

运行这两行修复了 PackageManager 权限错误的问题:“无法为下载的包文件创建临时文件。”

adb shell chown system.shell /data/app
adb shell chown system.shell /data/local

【讨论】:

以上是关于从 /system/app 以编程方式安装具有 INSTALL_PACKAGES 权限的应用程序时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将锁屏设置为“无”?

如何在android中以编程方式授予系统级权限?

在具有多个故事板的应用程序中以编程方式从 Storyboard 加载 ViewController

以编程方式从风暴螺栓中杀死拓扑时编译错误:对象和包具有相同的名称

以编程方式创建具有新属性值的 WooCommerce 产品变体

以编程方式添加具有约束的多个子视图会引发异常