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

от автора

В связи с вопросом, заданным 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' } 

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

ссылка на оригинал статьи http://habrahabr.ru/post/167323/