如何在AOSP中为预建应用程序(无源代码)添加额外权限

时间:2016-11-03 09:04:57

标签: bash shell android-permissions android-source android.mk

我有一个没有特定Android权限的应用程序(例如android.permission.CHANGE_CONFIGURATION)。

  1. 我没有源代码。
  2. 我正在研究AOSP。
  3. 我预先建立了这样的应用程序:

    1. 将APK放入/device/model/apps/HERE
    2. 在Android.mk中添加以下代码段:
    3. define PREBUILT_templateByMe LOCAL_MODULE := $(1) LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE := PRESIGNED LOCAL_SRC_FILES := $$(LOCAL_MODULE).apk LOCAL_REQUIRED_MODULES := $(2) include $(BUILD_PREBUILT) endef

      define PREBUILT_APP_templateByMe include $$(CLEAR_VARS) LOCAL_MODULE_TAGS := optional $(call PREBUILT_templateByMe, $(1), $(2)) endef

      prebuilt_appsByMe := \ myapp

      $(foreach app,$(prebuilt_appsByMe), \ $(eval $(call PREBUILT_APP_templateByMe, $(app),))) include $(call all-makefiles-under,$(LOCAL_PATH))

      它工作得非常好,myapp已预先构建到操作系统。

      现在我要将特定的android权限(android.permission.CHANGE_CONFIGURATION)添加到myapp。

      我阅读了thisthis和许多其他文档,但我不知道应用程序的XML文件的内容;或者甚至可能吗?!
      (这些链接是否有助于指导我关于XML文件内容的正确方向?thisthis

      我尝试了另一种方式,但没有工作(预安装应用程序并通过shell脚本添加权限:
      注意:首先,我应该说它之前有效,在另一个自定义AOSP上,但是没有在这个上工作!

      1. 将APK放入/device/model/apps/HERE
      2. 在Android.mk
      3. 中添加此代码段代码

        include $(CLEAR_VARS) LOCAL_MODULE := myapp.apk LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT)/preinstall LOCAL_SRC_FILES := myapp.apk include $(BUILD_PREBUILT)

        include $(CLEAR_VARS) LOCAL_MODULE := preinstall.sh LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT)/preinstall LOCAL_SRC_FILES := preinstall.sh include $(BUILD_PREBUILT)

        1. preinstall.sh的内容:
        2. #!/system/bin/sh
          MARK=/data/local/symbol_thirdpart_apks_installed PKGS=/system/preinstall/
          if [ ! -e $MARK ]; then echo "booting the first time, so pre-install some APKs."
          busybox find $PKGS -name "*\.apk" -exec sh /system/bin/pm install {} \;
          touch $MARK echo "OK, installation complete." fi
          busybox sh /system/bin/pm grant com.example.myapp android.permission.CHANGE_CONFIGURATION;

          1. 在init.rc文件中将此shell脚本称为启动服务,如:
            on boot start preinstallByMe
          2. service preinstallByMe /system/bin/sh /system/preinstall/preinstall.sh class main user root group root disabled oneshot

            但似乎不是电话。

            1. 即使init.rc文件中的这些代码段代码也不能正常工作:

              1. service installapk /system/preinstall/preinstall.sh class main oneshot

              2. on boot exec /system/preinstall/preinstall.sh

              3. busybox /system/preinstall/preinstall.sh
              4. pm grant com.example.myapp android.permission.CHANGE_CONFIGURATION;
            2. 注意:如果我手动调用shell预安装,则可以正常工作 P.S:如果您不允许调用脚本,可以通过在/system/core/include/private/android_filesystem_config.h中添加类似内容来添加权限:

              { 00755, AID_ROOT, AID_ROOT, 0, "system/preinstall/preinstall.sh"},

              导致第二种方式(预安装和shell添加权限),在这个自定义AOSP中,不起作用,我将从我的应用程序添加特定的Android权限,从开始,通过预建; 但是如果有人知道第二个解决方案有什么问题,我很感激。

3 个答案:

答案 0 :(得分:2)

您可以修改框架清单:

frameworks\base\core\res\Manifest.xml

将权限protectionLevel:更改为"normal",就像priv-app一样(即使不使用框架密钥构建),您应该自动授予所有正常权限,只需承担请注意,您要为该特定权限创建安全桥。

答案 1 :(得分:2)

在shell脚本文件中,您必须使用:

pm grant com.example.myapp android.permission.CHANGE_CONFIGURATION

并将shell脚本复制到/ system / bin /

在init.rc中,你在启动完成后执行shell:

on property:sys.boot_completed=1
   exec /system/bin/preinstall.sh

我已经成功了

答案 2 :(得分:0)

要获得系统权限,您应将APK放在/system/priv-app文件夹中 注意:在Kitkat之前,系统分区上的所有APK都可以使用这些权限。

将APK复制到/system/priv-app的示例代码段:

include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := apkname.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_PRIVILEGED_MODULE := true
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app
LOCAL_SRC_FILES := apkname.apk
include $(BUILD_PREBUILT)

了解更多信息:

  

某些系统应用程序比其他系统应用程序更多   “signatureOrSystem”权限不再适用于驻留在/ system分区中的所有应用程序。相反,有一个新的/ system / priv-app目录,只有那些APK在该目录中的应用程序才允许使用signatureOrSystem权限而不共享平台证书。这将减少系统捆绑应用程序可能利用的表面区域,以尝试访问受权限保护的操作。

     

ApplicationInfo.FLAG_SYSTEM标志继续表示文档中的内容:它表示应用程序APK已捆绑在/ system分区上。引入了一个新的隐藏标志FLAG_PRIVILEGED,它反映了访问这些权限的实际权利。

[来源:https://stackoverflow.com/a/20104400/421467]

<强>更新
演练:https://github.com/Drjacky/Install-Google-Play-Manually