2017-03-02 1 views
0

J'ai actuellement un projet qui doit contenir deux formes différentes de codebase, hérité et une version mise à jour de l'application. J'utilise Flavours pour cela, mais je rencontre un problème où deux icônes d'applications sont en cours d'installation. La raison en est que la base de code héritée et la base de code mise à jour ont leur propre fichier manifest.xml, et à l'intérieur du manifeste, des déclarations pour identifier la classe de lancement principale et leur icône d'application relative.Plusieurs icônes d'application en cours d'installation lors de l'utilisation de Flavors et de plusieurs fichiers manifest

<!-- legacy code manifest --> 
    <activity 
     android:name="legacy.activity.RegistrationActivity" 
     android:configChanges="orientation|screenSize" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" 
     android:theme="@style/CustomAppTheme" 
     android:windowSoftInputMode="adjustResize"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 

    <!-- updated code manifest --> 
    <activity 
     android:name="updated.activity.RegistrationActivity" 
     android:configChanges="orientation|screenSize" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" 
     android:theme="@style/CustomAppTheme" 
     android:windowSoftInputMode="adjustResize"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 

Comment puis-je contourner le problème? Si je supprime le filtre d'intention de la base de code mise à jour, qui est la base de code principale, la saveur n'installera pas deux icônes. Cependant, je ne peux pas exécuter le code principal car je n'ai pas déclaré de point d'entrée dans mon manifeste. Et inversement, si je supprime le filtre d'intention du Flavour et le garde dans mon code principal, le code Flavour ne sera pas exécuté. Les deux classes RegistrationActivity sont différentes, avec le même nom. Le code hérité ne partage pas vraiment une grande partie de la base de code mise à jour. Des suggestions autres que séparer en différents projets?

Certains ont demandé ma configuration avec Flavors dans gradle, voici un instantané de celui-ci.

productFlavors { 
    standard { 
     applicationId 'updated.android.example' 
     manifestPlaceholders = [package_name: "updated.android.example", primary_lang: "en"] 
     signingConfig signingConfigs.keystore 
    } 
    legacyTest { 
     applicationId 'legacy.android.example.debug' 
     manifestPlaceholders = [package_name: "legacy.android.example.debug", 
           target  : "Test", primary_lang: "en"] 
     signingConfig signingConfigs.keystore 
    } 
    legacyProd { 
     applicationId 'legacy.android.example.prod' 
     manifestPlaceholders = [package_name: "legacy.android.example.prod", 
           target  : "Prod", primary_lang: "en"] 
     signingConfig signingConfigs.keystore 
    } 
+0

pouvez-vous partager votre fichier gradle aussi bien? – Ichthyocentaurs

Répondre

1

Cette ligne:

<category android:name="android.intent.category.LAUNCHER"/> 

dit que vous avez une activité de lancement. Définissez-les sur un paramètre d'activité par défaut (il s'agit juste d'une "autre activité", créez une troisième classe qui est la classe de lancement.) Cette classe redirigera automatiquement vers l'une des deux autres activités selon vos spécifications, telles que API. niveau ou la marque.Toutes les spécifications que vous avez quant à laquelle lancer, les définir et l'utilisateur ne saura pas qu'il ya une activité de manutention

Lorsque vous avez deux activités lanceur, ils montrent comme deux applications.C'est probablement parce que le système ne peut pas déterminer quoi rediriger vers automatiquement. donc, il y a deux selon ce lancement.

Comment puis-je contourner cela? Si je retire le filtre l'intention de la base de code mis à jour, qui est le codeb principal ase,

Ne pas l'enlever. Changes le. .: par exemple

 <intent-filter> 
      <action android:name="com.yourpackage.name.CLASSNAME" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 

+0

Oui, cela a fonctionné. Je vous remercie! – portfoliobuilder

1

Vous avez besoin <activity android:name="legacy.activity.RegistrationActivity" séparés et <activity android:name="updated.activity.RegistrationActivity" vous deux manifestes, un pour chaque saveur.

par exemple .:

src/main/AndroidManifest.xml (avec tout sauf: * .activity.RegistrationActivity) src/legacy/AndroidManifest.xml (avec legacy.activity.RegistrationActivity) src/updated/AndroidManifest.xml (avec updated.activity.RegistrationActivity)