2015-08-26 5 views
1

В проекте Android идентификаторы ресурсов полностью идентифицируются идентификатором приложения. Например, если мое приложение com.mycompany.myapp, идентификатор ресурса будет com.mycompany.myapp.R.blah.Как изменить идентификатор приложения, но сохранить тот же идентификатор ресурса?

В моем случае мне нужно создать две версии приложения - бета-версию и версию выпуска. Обе версии могут быть установлены на одном устройстве. Это может произойти, только если приложения не совпадают. Моя стратегия заключается в том, что во время ночной сборки я программно модифицирую файл манифеста и меняю приложение на com.mycompany.myappbeta. Однако, если я это сделаю, мне нужно будет коснуться нескольких исходных файлов, которые используют идентификаторы ресурсов.

Мне интересно, есть ли какой-либо токен в файле манифеста, где я могу прямо сказать, как идентифицировать идентификаторы ресурсов? С уважением.

Редактировать

Оказывается, приложение и идентификатор пакета действительно два разных понятия. Я хотел изменить идентификатор приложения, но не идентификатор пакета. Однако, похоже, это невозможно в Eclipse. Как указывали другие сообщения, Gradle build может обрабатывать изменение идентификатора приложения, но сохраняет идентификатор пакета. Сейчас я перехожу к Android Studio.

+0

идентификаторов автоматически сгенерированы и сохранены в ** R.java * *. Вы не должны беспокоиться об этом. И никогда не должен касаться этого файла. Не используйте значения id ** явно **. Просто используйте методы 'findViewById()' и 'getId()'. –

ответ

3

идентификаторы ресурсов полностью идентифицируется идентификатором приложения

Технически, они идентифицируются по имени пакета, из атрибута package в корне манифеста.

Моя стратегия во время ночной сборки я буду программно модифицировать файл манифеста и изменить приложение на com.mycompany.myappbeta. Однако, если я это сделаю, мне нужно будет коснуться нескольких исходных файлов, которые используют идентификаторы ресурсов.

Именно поэтому ваша ночная сборка должна использовать Gradle и Gradle для Android-плагина. Затем вы пропустите все, что вы описали, и вместо этого используйте типы сборки. Два типа сборки (debug и release) предварительно определены, и если вы хотите изобрести еще один (например, beta), вы можете. Затем в конфигурации типа сборки в вашем файле build.gradle вы используете applicationIdSuffix, чтобы дать не release строит отдельный суффикс. Это будет добавлено в идентификатор приложения для целей уникальных установок, но ваше имя пакета не будет затронуто, поэтому ваши ресурсы не будут затронуты.

Например:

android { 
    compileSdkVersion 19 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     versionCode 2 
     versionName "1.1" 
     minSdkVersion 14 
     targetSdkVersion 18 
    } 

    signingConfigs { 
     release { 
      storeFile file('HelloConfig.keystore') 
      keyAlias 'HelloConfig' 
      storePassword 'laser.yams.heady.testy' 
      keyPassword 'fw.stabs.steady.wool' 
     } 
    } 

    buildTypes { 
     debug { 
      applicationIdSuffix ".d" 
     } 

     release { 
      signingConfig signingConfigs.release 
     } 

     beta.initWith(buildTypes.release) 

     beta { 
      applicationIdSuffix ".beta" 
      debuggable true 
     } 
    } 
} 

Здесь я:

  • Дайте тип debug построить приложение ID суффикса .d

  • Оставьте тип release сборки наряду с точки зрения суффикс идентификатора приложения

  • Создания нового типа beta сборки, клонированный от типа release сборки, где я даю ему ID суффикс .beta приложения и пометить его как отладочная

+0

Спасибо. Я отметил это как правильный ответ. Посмотрите мой отредактированный оригинальный пост. – Peter

1

Однако, если я это сделаю, мне нужно будет коснуться нескольких исходных файлов, которые используют идентификаторы ресурсов.

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

android:name="com.mycompany.myapp.MainActivity" 

не только укоротить обозначения:

android:name=".MainActivity" 

Поскольку это приложение не работает, если идентификатор пакета не совпадает с вашими пакетами кода.

+0

Можете ли вы объяснить «не только сокращенную нотацию»? Разве это не просто автоматически принимает значение полной длины? – not2qubit

+1

, если ваше приложение packageid соответствует имени вашего имени корневого java-пакета, то обе ссылки будут равны, но если нет, тогда вы получите инфраструктуру, которая ищет вашу '.MainActivity' в пакете' .MainActivity'. И таких нет, так что вы в конечном итоге потерпите крах. –

Смежные вопросы