У меня есть приложение, которое не имеет определенного разрешения для 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 также не работают:
-
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; Но, если кто-то знает, что случилось со вторым решением, я ценю это.