Замена манифеста при сборке в Marmalade под Android

  • Tutorial
В связи с вопросом, заданным Nonameface, я хочу опубликовать небольшое руководство, которое, возможно, окажется для кого-то полезным. Многим, рассматриваемый вопрос может показаться элементарным. Я прошу не судить меня строго, поскольку этот материал адресован начинающим разработчикам.

Суть описываемой проблемы в том, что при сборке под 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 преобразованный в текстовую форму и открываем его:

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-файл необходимо добавить следующий раздел:

arcanoid.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'
}


Вот, в принципе, и все. После описанной замены манифеста, тестирование сборки на Android-устройстве необходимо. Вполне возможно, что какая-то часть функционала перестанет работать, либо приложение просто перестанет запускаться.

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 2

    0
    Единственное, что я хочу заметить, это то, что значительная часть указанных permission-ов действительно используется любым приложением, собранным под Marmalade.


    Без единого пермишена игра запускается нормально. Если не нужны внешние коннекшены.
      0
      У меня некоммерческая лицензия Мармелада. Без единого пермишена валится сразу (видимо лезет проверять лицензию).

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое