迁移到Android Studio将导致为“单个主项目多个库项目”安装多个应用程序

时间:2014-11-02 07:05:52

标签: android eclipse android-studio

我有

  • 定义<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />
  • 的单个主项目
  • 多个图书馆项目,其中一些项目定义了<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />

虽然我正在使用Eclipse构建&amp;运行具有多个库项目的单个主项目,将只安装1个应用程序。

但是,如果我迁移到Android Studio来构建&amp;运行具有多个库项目的单个主项目,将安装多个应用程序

取决于有多少项目(无论主要项目或图书馆项目)定义<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />

我在想,是否有任何我在Android Studio中做错的配置,导致安装多个应用,当我构建&amp;运行项目?

目前,我唯一的解决方法是从所有图书馆项目中删除这些行(<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />)&#39; AndroidManifest.xml。这是常见的吗?正确的方法,在Android Studio中导入项目库?与在Eclipse中一样,这些行不会在我的设备中安装额外的应用程序。

这就是我的项目结构的样子

enter image description here

如您所见,第一个文件夹图标看起来与其他文件夹图标不同。我想这表明,第一个文件夹图标是主项目,其他是图书馆项目。

如果只有一个主项目,为什么要安装多个应用程序?

3 个答案:

答案 0 :(得分:7)

在Eclipse中,仅使用主应用程序项目中的AndroidManifest.xml。在Android Studio(和Gradle构建系统)中,所有清单都合并在一起。

清单中<activity>元素内的以下行表示该活动应显示在启动器菜单中。如果您不希望这样,请删除这些行。

<intent-filter>
  <action android:name="android.intent.action.MAIN" />
  <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

所有这些都是预期的行为。

答案 1 :(得分:4)

还有另一种骇人听闻的方式。

  1. 查看合并后的AndroidManifest.xml。它应该位于: <your_project>/build/intermediates/manifests/full/<debugOrRelease>/AndroidManifest.xml

  2. 搜索LAUNCHER <activity>标记。在您的情况下,您应该有超过1个LAUNCHER <activity>标签。我的情况如下:

    <activity
        android:name="com.stockhut.SplashScreenActivity"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" >
            </action>
    
            <category android:name="android.intent.category.LAUNCHER" >
            </category>
        </intent-filter>
    </activity>
    ...
    <activity
        android:name="com.todddavies.components.progressbar.main"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
    
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
  3. 就我而言,com.todddavies.components.progressbar.main是一个图书馆项目,其示例项目已被声明为LAUNCHER。正确的启动器应为com.stockhut.SplashScreenActivity

    1. 在主项目中打开AndroidManifest.xml,添加以下内容:

      <activity
          android:name="com.todddavies.components.progressbar.main"
          android:label="@string/app_name" tools:node="remove" >
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />
      
              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
      </activity>
      

      记下标记tools:node="remove"。根据{{​​3}}:

    2.   

      标记是工具命名空间中的一个特殊属性,用于表达如何解决冲突的特定决策。

      因此,带有标记<activity>的{​​{1}}代码会告诉Gradle在发生冲突时自行删除。换句话说,我们在某种程度上强迫发生冲突&#34;。它有点神圣,但它确实有效。

      您始终可以在上述路径中验证合并的AndroidManifest.xml。

答案 2 :(得分:1)

在Android工作室中,他们一次只能添加一个项目。 如果您有带项目的库,那么您必须在项目中添加整个代码或 您可以为库项目创建jar并将其添加到项目中。

Android Studio中还有另一种gradle选项。 如果我们想在项目中使用任何库,我们可以在&#34; build.gradle&#34;中添加它们的依赖项。项目文件。

我附上&#34; build.gradle&#34;文件请参考。

enter image description here

现在,就图书馆项目而言,(如果它没有为您的项目做出贡献)最佳方法是在Android清单中,您应该只将您定义的活动设置为启动器活动,因为在大多数情况下,库是AndroidManifest。 xml通常包含一些示例Activity(应该被删除),或者你需要子类化的Activity,库项目中应该有最少的定义的东西(可以忽略不计),你的Manifest中应该有大部分内容,包括所有权限。

它也是在android开发者网站上定义的

  

&#34;过滤器&#34; android.intent.action.MAIN&#34;和   &#34; android.intent.category.LAUNCHER&#34;设置将活动广告为   启动应用程序的应用程序 - 即应该是应用程序   显示在应用程序启动器中。图标和标签设置在   因此,过滤器是启动器中显示的过滤器。&#34;

您也可以参考链接... http://developer.android.com/guide/topics/manifest/manifest-intro.html