通过将应用程序放置在/system/app中,获取Android系统权限?

11

尝试使用AOSP中的一些较新Android API时,我发现有些需要android.permission.BLUETOOTH_PRIVILEGED权限。根据文档,该权限“不可用于第三方应用程序”。

我在其他地方看到过,可以通过将应用程序安装在/system/app目录中来获取已root设备上的系统级权限。但是,在我的已root Nexus 5上尝试了这种方式,但我的应用程序仍未获得所需的特权。(请参见下面的代码和LogCat输出。)

另一个选择是构建自己的定制Android ROM,然后使用相同的密钥签署应用程序。我可以这样做,但如果可能的话,我强烈希望能够使用原始映像。

那么哪个方法可以使已root的手机具有系统级权限?如果可以,请问我是否做错了什么?

活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if ((this.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
        Log.d(TAG, "This is a system application");
    }
    else {
        Log.d(TAG, "This is not a system application");         
    }
    if (getApplicationContext().checkCallingOrSelfPermission("android.permission.BLUETOOTH_PRIVILEGED") == PackageManager.PERMISSION_GRANTED) {
        Log.d(TAG, "I have android.permission.BLUETOOTH_PRIVILEGED");
    }
    else {
        Log.d(TAG, "I do not have android.permission.BLUETOOTH_PRIVILEGED");            
    }       
    ...     

}

LogCat输出:

W/PackageManager(  788): Not granting permission android.permission.BLUETOOTH_PRIVILEGED to package com.radiusnetworks.testapp (protectionLevel=18 flags=0x8be47)
I/ActivityManager(  788): Start proc com.radiusnetworks.testapp for activity com.radiusnetworks.testapp/.MainActivity: pid=3124 uid=10075 gids={50075, 3002, 3001}
D/MainActivity( 3124): This is a system application
D/MainActivity( 3124): I do not have android.permission.BLUETOOTH_PRIVILEGED

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.radiusnetworks.testapp"
    android:versionCode="1"
    android:versionName="1.0" >

  <uses-sdk
    android:minSdkVersion="19"
    android:targetSdkVersion="19" />
  <uses-permission android:name="android.permission.BLUETOOTH" /> 
  <uses-permission
     android:name="android.permission.BLUETOOTH_PRIVILEGED"/>    
  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />     

  <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.radiusnetworks.testapp.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
  </application>

</manifest>
3个回答

17

从 Android 4.4 开始,特权应用程序必须放置在 /system/priv-app 目录而不是 /system/app。一旦我将我的应用程序移动到那里,它就如预期般获得了特权。

请参见:AOSP 特权应用与系统应用


我如何在已经root的设备上将我的应用程序安装到/system/app或/system/priv-app目录中?只需要在安装后从/data/app文件夹移动apk文件吗? - Jenix
1
是的,就是这么简单! - davidgyoung
我看到有人称呼adb命令为remountpush。谢谢! :) - Jenix

0

若要使位于 /priv-apps/ 目录内的应用程序使用更高的权限,则它们必须使用与操作系统签名相同的密钥进行签名。


0

https://source.android.com/devices/tech/config/perms-allowlist <--- 你可以显然地构建并推送自己配置的应用程序权限列表,然后它将自动将apk添加到手机系统中,以及它们默认的白名单apk。你甚至有选项-a,可以字面上添加手机上的每个apk,哈哈,完美!在我研究和编译之后,因为我获得了root权限,但没有su或其他东西,所以在我找到这个之前,尝试做一些事情总是很麻烦,因为我有不同的特权和不同的apk,这让人感到困惑,但现在不再了>=)看看这个页面,你会看到一个链接,进入项目,甚至有更进一步的说明.. =)


欢迎Timothy。请避免在您的帖子中使用奇怪的缩写、符号或类似的东西,并注意语法。 - gurkan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接