Copyroid

Android: как установить два одинаковых приложения на один телефон

Стол заказов — в конце статьи.

Для установки двух (или больше) одинаковых приложений на один телефон нужно сменить значение package в файле AndroidManifest.xml, находящемся внутри apk-билда.
Например, имеем:

<manifest
android:versioncode="20110420"
android:versionname="1.8.0"
package="ru.e_num"
xmlns:android="http://schemas.android.com/apk/res/android">

Для того, чтобы установить это приложение ещё раз, нужно сделать примерно следующее:

<manifest
android:versioncode="20110420"
android:versionname="1.8.0"
package="ru.e_num.test"
xmlns:android="http://schemas.android.com/apk/res/android">

После такого изменения заново собранный apk-файл придётся подписать сертификатом. Информацию о том, как распаковывать, запаковывать и подписывать apk-файлы, можно найти в любом поисковике по запросу SmartApkTool. Вот ссылка на приложение: v.2.2 (распакуйте содержимое архива в пустую директорию). А вот более правильный способ работы с apk-файлами: Использование apktool.

Совет. Устанавливайте одну из копий неизменённой, чтобы знать об обновлениях в Маркете.

Под катом описаны некоторые встречающиеся проблемы, а также находится Стол Заказов.

ВОЗМОЖНЫЕ ПРОБЛЕМЫ

Проблема 1

Если рядом с AndroidManifest.xml не создаётся файл apktool.yml, то в домашней директории пользователя найдите папку apktool\framework и удалите из неё файл 1.apk. (Совет с 4pda.ru, спасибо Alex Boroda.)

Проблема 2

Иногда обычная смена имени package не помогает. Чаще всего это бывает в случаях, когда в файле AndroidManifest.xml прописаны относительные пути к различным активити. Например:

<activity
android:label="E-NUM"
android:name=".SplashScreenActivity"
android:screenOrientation="portrait">

В такой ситуации нужно прописать полный путь ко всем активити, то есть:

<activity
android:label="E-NUM"
android:name="ru.e_num.SplashScreenActivity"
android:screenOrientation="portrait">

Обратите внимание, что прописывать нужно не новое имя package (то есть в нашем случае не ru.e_num.test), а реальный путь к активити в директории smali распакованного apk-файла. Естественно, в общем случае путь совпадает со старым именем package (в нашем случае это ru.e_num).

Проблема 3

Если в файле AndroidManifest.xml есть тег provider, то в его атрибуте authorities нужно также дописать символы, которые мы использовали в качестве дополнения к параметру package (в нашем случае это .test). Например, было:

<provider
android:authorities="com.someapp.android"
android:name="com.someapp.android">

Стало:

<provider
android:authorities="com.someapp.android.test"
android:name="com.someapp.android">

Как и в проблеме 2, значение атрибута name менять не надо.

Стол заказов

Я снова принимаю заказы! Если вы прочитали инструкцию, но у вас с ней возникли какие-то сложности, пишите в комментариях ссылку на приложение. Это обязательно! Искать «вайбер» или «клаш оф кланс» я не буду. Одну копию я делаю бесплатно. Результат не гарантирую — тестируйте. Если нужно больше копий, или есть какие-либо нестандартные пожелания — пишите в обратку, договоримся. Если хотите отблагодарить пинтой пива и за одну копию, то кошельки здесь.

PS. Пользователи *NIX-систем могут попробовать сделать копии приложений автоматически с помощью этого несложного bash-скрипта:
https://github.com/kodopik/Copyroid
Пулл-реквесты приветствуются!

2 009 thoughts on “Android: как установить два одинаковых приложения на один телефон”

    1. К сожалению, Маркет не даёт мне установить эту программу, т.к. у меня не Асус, а Сони. Может быть, у Вас есть ссылка на программу, выложенную где-нибудь на 4pda или ещё где-то?

  1. Здравствуйте. Сделайте пожалуйста копию этого приложения. Вы уже создавали копию этого приложения я нашел, они переработали программу добавили новый функционал. Теперь та старая версия запускается работает но конфликтует и не отображается большой объем информации заранее благодарен. Большое спасибо. https://play.google.com/store/apps/details?id=com.taxsee.driver

  2. Доброго времени суток)) попробуйте вот это приложение)) думаю и вас заинтересует )) на счет него есть некоторые мыслишки ещё. Но я думаю в умелых руках и так найдется ему применение)) Заранее благодарен https://play.google.com/store/apps/details?id=com.cakecodes.bitmaker&hl=ru

    1. Копия работает, благодарствую )) Создание для этого приложения копии не отличается от описания выше? Или были какие-то нюансы? заранее благодарен за ответ))

    2. Просто я сколько не пробовал, не получается у меня запустить((( копия создается, приложение подписывается, в bluestack устанавливается, иконка появляется копии, и имя я спокойно менять могу, а запуск не происходит. А вот Ваша копия спокойно запускается.

    3. Как создавать копию разобрался. Теперь другая проблема. у BitMaker 2 версии. Старая версия спокойно декомпилится и создается рабочая копия, а вот новая версия декомпилится с ошибками. Т.е. декомпиляция не проходит. Можете архив с инструментами для декомпиляции так же на депозит залить? Заранее благодарен и извиняюсь за беспокойство))

      Вот лог:
      C:APKTool>apktool d BitMakerCOPY.apk
      I: Using Apktool 2.0.0 on BitMakerCOPY.apk
      I: Loading resource table…
      I: Decoding AndroidManifest.xml with resources…
      I: Loading resource table from file: C:Users31apktoolframework1.apk
      I: Regular manifest package…
      I: Decoding file-resources…
      W: Could not decode attr value, using undecoded value instead: ns=android, name=touchscreenBlocksFocus, value=0xffffffff
      I: Decoding values */* XMLs…
      Exception in thread «main» brut.androlib.err.UndefinedResObject: resource spec:0x01010490
      at brut.androlib.res.data.ResPackage.getResSpec(ResPackage.java:59)
      at brut.androlib.res.data.ResTable.getResSpec(ResTable.java:65)
      at brut.androlib.res.data.ResTable.getResSpec(ResTable.java:61)
      at brut.androlib.res.data.value.ResReferenceValue.getReferent(ResReferenceValue.java:57)
      at brut.androlib.res.data.value.ResStyleValue.serializeToResValuesXml(ResStyleValue.java:54)
      at brut.androlib.res.AndrolibResources.generateValuesFile(AndrolibResources.java:496)
      at brut.androlib.res.AndrolibResources.decode(AndrolibResources.java:252)
      at brut.androlib.Androlib.decodeResourcesFull(Androlib.java:134)
      at brut.androlib.ApkDecoder.decode(ApkDecoder.java:104)
      at brut.apktool.Main.cmdDecode(Main.java:165)
      at brut.apktool.Main.main(Main.java:81)

    4. В реестре что-то напортачил по ходу. После переустановки видны получилось распаковать. После изменений AndroidManifest.xml всё собирается обратно, но запускать не хочется(( установка проходит, экран переворачивается, моргает 1 раз быстро (при чем без интерфейса приложения) и всё. Выходит на главный экран. Эту проблему пока решить не удалось. В чем может быть ошибка?

    5. В реестре что-то напортачил по ходу. После переустановки видны получилось распаковать. После изменений AndroidManifest.xml всё собирается обратно, но запускать не хочет(( установка проходит, экран переворачивается, моргает 1 раз быстро (при чем без интерфейса приложения) и всё. Выходит на главный экран. Эту проблему решить не удалось. В чем может быть ошибка?

    6. Пришли собранный тобой билд, я посмотрю, в чём проблема.

    7. Извиняюсь что так долго. Дела были)) Вот мои два билда собранные, собирал из твоего. Так что прислал 3. Твой работает, мои нет. Благодарен за помощь)) Если руки мне в нужное место поставишь на сборку, на пивас с меня ;-)

    8. Не пойму, в чём ошибка.
      На самом деле, я свою копию делал способом, несколько отличающимся от описанного в статье. Суть та же, в изменении имени package, только меняю ещё и пути. Делаю автоматически скриптом, ссылка на который размещена в конце статьи. Можно делать то же самое и вручную, но работы там много: поменять ВСЕ пути руками слишком трудоёмкая задача.
      Если в Linux что-то понимаешь, сможешь сделать сам сколько угодно копий этим скриптом. Просто в цикл загоняешь и всё.

    9. Ну будем познавать Linux значит)) Во всяком случае apktool с java поставить у меня получилось с root правами. Разбирает хорошо в ручную на убунте. Вот со сборкой на sdk ругается. sdk воткну и буду пробовать запускать скрипт)) впервые с линуксом работаю))

    10. Спасибо за скрипт)) Весь мозг себе сломал с этим линуксом… Раз 5 наверное виртуалку заного создавал, что б всё как надо сделать)) Всё запустил, копию получилось создать)) правда скриптом она не подписалась. но я так понимаю из-за того что sign нету)) С меня причитается)))

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *