Как добавить дополнительное разрешение для предварительно созданного приложения (без исходного кода) в 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)
- Содержимое 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;
- Вызовите эту оболочку script как службу при загрузке в файле init.rc, например:
on boot
start preinstallByMe
service preinstallByMe /system/bin/sh /system/preinstall/preinstall.sh
class main
user root
group root
disabled
oneshot
Но похоже, что это не вызов.
-
Даже эти коды фрагментов в файле init.rc также не работают:
Примечание.. Если я вызову 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
Я преуспел в этом