Суть описываемой проблемы в том, что при сборке под Android, в манифест включаются все права которые только могут понадобиться приложению, разработанному в Marmalade. При этом, не выполняется никаких проверок, используются ли эти права приложением на самом деле. В результате, у пользователя, устанавливающего приложение, возникают законные вопросы: «Для чего приложение требует права на чтение и отправку SMS, если оно, совершенно очевидно, не работает с этим функционалом?».
Пользователь, совершенно резонно, может посчитать приложение небезопасным и отказаться от его установки. Давайте посмотрим, как с этим можно бороться.
Очевидно, что нам необходимо выполнить сборку, каким-то образом подменив файл AndroidManifest.xml. Для начала, нам нужно получить оригинальный AndroidManifest.xml, формируемый инструментальными средствами Maramalade. Хотя apk-файл, по сути представляет собой zip-архив и извлечь из него требуемый файл не составляет труда, задача несколько осложняется тем, что файл храниться не в текстовом, а в двоичном виде. Извлечь файл манифеста в текстовом представлении нам поможет apktool.
Выкачиваем apktool1.5.1.tar.bz2 и apktool-install-windows-r05-ibot.tar.bz2 (в случае, если используется Windows) к себе на компьютер, и распаковываем в какой-нибудь локальный каталог. Также потребуется установленная на компьютер Java (у меня установлена jdk1.6.0_23). Распаковать apk-файл можно следующей командой:
apktool.bat d arcanoid.apk ./arcanoid
Затем, находим в созданном каталоге AndroidManifest.xml преобразованный в текстовую форму и открываем его:
<?xml version="1.0" encoding="utf-8"?> <manifest android:versionCode="1" android:versionName="0.0.1" android:installLocation="auto" package="com.mycompany.arcanoid" xmlns:android="http://schemas.android.com/apk/res/android"> <application android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:label="@string/app_name" android:icon="@drawable/icon"> <activity android:label="@string/app_name" android:name=".Main" android:launchMode="singleTask" android:configChanges="locale|keyboardHidden|orientation"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name="com.ideaworks3d.marmalade.VFSProvider" android:exported="false" android:multiprocess="true" android:authorities="zzzz06b5522b12c49d3c5503d40887ddf6fa.VFSProvider" /> </application> <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.BATTERY_STATS" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.SET_ORIENTATION" /> <uses-permission android:name="android.permission.DEVICE_POWER" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="com.android.vending.CHECK_LICENSE" /> <uses-permission android:name="com.android.vending.BILLING" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> </manifest>
Далее, мы можем отредактировать этот файл, на свой вкус, например убрав не используемые permission-ы. Для того, чтобы при последующих сборках использовалась отредактированная версия манифеста, в mkb-файл необходимо добавить следующий раздел:
... deployments { ["Default"] android-aliasname='company' android-icon='icons/ic_launcher.png' android-icon-hdpi='icons/ic_launcher.png' android-icon-ldpi='icons/ic_launcher1.png' android-icon-mdpi='icons/ic_launcher2.png' android-manifest='Manifest/AndroidManifest.xml' caption='arcanoid' name='arcanoid' }
Вот, в принципе, и все. Единственное, что я хочу заметить, это то, что значительная часть указанных permission-ов действительно используется любым приложением, собранным под Marmalade. После описанной замены манифеста, тестирование сборки на Android-устройстве необходимо. Вполне возможно, что какая-то часть функционала перестанет работать, либо приложение просто перестанет запускаться.
ссылка на оригинал статьи http://habrahabr.ru/post/167323/
Добавить комментарий