Как добавить дополнительное разрешение для предварительно созданного приложения (без исходного кода) в AOSP

У меня есть приложение, которое не имеет определенного разрешения для Android (например, android.permission.CHANGE_CONFIGURATION).

  • У меня нет исходного кода.
  • Я работаю над AOSP.

Я предварительно создал это приложение, например:

  • Поместите APK в /device/model/apps/HERE
  • Добавьте эти коды кода в Android.mk:

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.

Я прочитал этот, этот и многие другие документы, но я не Не знаю содержание этого XML файла для приложения; Или это даже возможно?! (Полезны ли эти ссылки, чтобы направить меня в правильном направлении на содержимое XML файла? this и this)


Я пробовал по-другому, но не работал (предустановить приложение и добавить разрешение с помощью оболочки script:
Примечание.. Прежде всего, я должен сказать, что он работал раньше, на другой пользовательский AOSP, но не работал над этим!

  • Поместите APK в /device/model/apps/HERE
  • Добавьте этот код фрагмента в Android.mk

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:

#!/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. Вызовите эту оболочку script как службу при загрузке в файле init.rc, например:
    on boot start preinstallByMe

service preinstallByMe /system/bin/sh /system/preinstall/preinstall.sh class main user root group root disabled oneshot

Но похоже, что это не вызов.

  1. Даже эти коды фрагментов в файле init.rc также не работают:

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

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

    • busybox /system/preinstall/preinstall.sh
    • pm grant com.example.myapp android.permission.CHANGE_CONFIGURATION;

Примечание.. Если я вызову preinstall из оболочки вручную, это сработает.
P.S: Если вам не позволено называть ваш script, вы можете добавить к нему разрешение, добавив что-то вроде этого в /system/core/include/private/android_filesystem_config.h:

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

Причина второго способа (предварительная установка и добавление разрешения с помощью оболочки), в этом настраиваемом AOSP, не работает, я собираюсь добавить это конкретное разрешение для Android для моего приложения, с самого начала, через prebuilt; Но, если кто-то знает, что случилось со вторым решением, я ценю это.

Ответ 1

Чтобы иметь право на системные разрешения, вы должны поместить свои 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 было включено в/системный раздел. Был введен новый скрытый флаг FLAG_PRIVILEGED, который отражает фактическое право доступа к этим разрешениям.

[Источник: fooobar.com/questions/17704/...

Ответ 2

Вы можете изменить основной манифест основной в:

frameworks\base\core\res\Manifest.xml

И измените значение разрешения protectionLevel: на "normal", таким образом, как priv-app (Даже если он не построен с ключом фреймворка), вы должны автоматически предоставить все обычные разрешения, просто имейте в виду, что вы вызываете мост безопасности для этого конкретного разрешения.

Ответ 3

В файле оболочки script вы должны использовать:

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

и скопировать оболочку script в /system/bin/

а в init.rc вы запускаете оболочку после завершения загрузки:

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

Я преуспел в этом