Squeak.ru - шаблоны программирования

Не удается установить приложение Android в качестве системного приложения на эмуляторе, чтобы обойти SecurityException для WRITE_APN_SETTINGS

У меня есть приложение для Android, которое я хочу использовать для настройки параметров APN. Для этого требуется разрешение android.permission.WRITE_APN_SETTINGS, которое предоставляется только системным приложениям или приложениям, подписанным тем же закрытым ключом, что и сама ОС. Я собираюсь использовать это только на эмуляторе (или, может быть, на корневом устройстве), поэтому возможность фактического развертывания его на устройствах, находящихся вне моего контроля, не является проблемой. Я строю и продвигаю API 19.

Несмотря на то, что мой APK был перемещен в каталог /system/app/ и установлен chmod 0644, я все равно получаю java.lang.SecurityException: No permission to write APN settings: Neither user 10052 nor current process has android.permission.WRITE_APN_SETTINGS. в adb logcat, когда пытаюсь запустить приложение.

Я также безуспешно пытался запустить приложение с помощью db shell "su -c am start -n com.example.proxysetter/.MainActivity".

Любые предложения, кроме компиляции и подписания моего собственного образа Android из исходного кода? (Не идеально.) Я почти уверен, что мне не нужно предоставлять файл .odex, даже если он есть во всем остальном в /system/app/.

Вот шаги, которые я выполнял до сих пор при отправке APK в эмулятор:

ant debug
adb remount
adb push bin/MainActivity-debug.apk /system/app/
adb shell chmod 0644 /system/app/MainActivity-debug.apk

Я не перезагружаю эмулятор с помощью adb reboot, потому что он не работает для эмуляторов, и если я вручную выключу эмулятор и перезапущу его, приложение не появится в моем списке приложений.

И мой манифест:

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

    <uses-sdk
        android:minSdkVersion="18"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".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>

И трассировка стека:

I/ActivityManager(  384): Start proc com.example.proxysetter for activity com.example.proxysetter/.MainActivity: pid=1082 uid=10052 gids={50052}
D/dalvikvm( 1082): Not late-enabling CheckJNI (already on)
D/dalvikvm(  384): GC_FOR_ALLOC freed 340K, 15% free 6420K/7468K, paused 91ms, total 93ms
D/dalvikvm( 1082): GC_FOR_ALLOC freed 70K, 10% free 3571K/3968K, paused 30ms, total 32ms
E/DatabaseUtils(  535): Writing exception to parcel
E/DatabaseUtils(  535): java.lang.SecurityException: No permission to write APN settings: Neither user 10052 nor current process has android.permission.WRITE_APN_SETTINGS.
E/DatabaseUtils(  535):     at android.app.ContextImpl.enforce(ContextImpl.java:1685)
E/DatabaseUtils(  535):     at android.app.ContextImpl.enforceCallingOrSelfPermission(ContextImpl.java:1714)
E/DatabaseUtils(  535):     at com.android.providers.telephony.TelephonyProvider.checkPermission(TelephonyProvider.java:735)
E/DatabaseUtils(  535):     at com.android.providers.telephony.TelephonyProvider.query(TelephonyProvider.java:462)
E/DatabaseUtils(  535):     at android.content.ContentProvider.query(ContentProvider.java:857)
E/DatabaseUtils(  535):     at android.content.ContentProvider$Transport.query(ContentProvider.java:200)
E/DatabaseUtils(  535):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
E/DatabaseUtils(  535):     at android.os.Binder.execTransact(Binder.java:404)
E/DatabaseUtils(  535):     at dalvik.system.NativeStart.run(Native Method)
D/AndroidRuntime( 1082): Shutting down VM
W/dalvikvm( 1082): threadid=1: thread exiting with uncaught exception (group=0xb1a41ba8)
E/AndroidRuntime( 1082): FATAL EXCEPTION: main
E/AndroidRuntime( 1082): Process: com.example.proxysetter, PID: 1082
E/AndroidRuntime( 1082): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.proxysetter/com.example.proxysetter.MainActivity}: java.lang.SecurityException: No permission to write APN settings: Neither user 10052 nor current process has android.permission.WRITE_APN_SETTINGS.
E/AndroidRuntime( 1082):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
E/AndroidRuntime( 1082):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
E/AndroidRuntime( 1082):    at android.app.ActivityThread.access$800(ActivityThread.java:135)
E/AndroidRuntime( 1082):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
E/AndroidRuntime( 1082):    at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 1082):    at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime( 1082):    at android.app.ActivityThread.main(ActivityThread.java:5017)
E/AndroidRuntime( 1082):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1082):    at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime( 1082):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
E/AndroidRuntime( 1082):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
E/AndroidRuntime( 1082):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 1082): Caused by: java.lang.SecurityException: No permission to write APN settings: Neither user 10052 nor current process has android.permission.WRITE_APN_SETTINGS.
E/AndroidRuntime( 1082):    at android.os.Parcel.readException(Parcel.java:1465)
E/AndroidRuntime( 1082):    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
E/AndroidRuntime( 1082):    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
E/AndroidRuntime( 1082):    at android.content.ContentProviderProxy.query(ContentProviderNative.java:413)
E/AndroidRuntime( 1082):    at android.content.ContentResolver.query(ContentResolver.java:461)
E/AndroidRuntime( 1082):    at android.content.ContentResolver.query(ContentResolver.java:404)
E/AndroidRuntime( 1082):    at com.example.proxysetter.MainActivity.setAPN(MainActivity.java:28)
E/AndroidRuntime( 1082):    at com.example.proxysetter.MainActivity.onCreate(MainActivity.java:19)
E/AndroidRuntime( 1082):    at android.app.Activity.performCreate(Activity.java:5231)
E/AndroidRuntime( 1082):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
E/AndroidRuntime( 1082):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
E/AndroidRuntime( 1082):    ... 11 more
W/ActivityManager(  384):   Force finishing activity com.example.proxysetter/.MainActivity

Ответы:


1

Для интересующихся:

а) я сделал опечатку; для API 19+ вы хотите отправить в /system/priv-app.

б) Мне удалось установить приложение, смонтировав system.img как ext4 и установив приложение на образ системы. Я скопировал каталог системного образа в новое место, изменил system.img, а затем отредактировал foo.avd/config.ini, чтобы он указывал на мой измененный каталог системного образа.

05.09.2014
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...