【问题标题】:Migrating to Android Studio will cause multiple apps being installed for "single main project multiple library projects"迁移到 Android Studio 将导致为“单个主项目多个库项目”安装多个应用程序
【发布时间】:2014-11-02 07:05:52
【问题描述】:

我有

  • 定义<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 构建和运行包含多个库项目的单个主项目,但只会安装 1 个应用程序。

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

取决于有多少项目(无论是主项目还是库项目)定义了<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />

我想知道,在构建和运行项目时,我在 Android Studio 中是否有任何配置错误导致安装多个应用程序?

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

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

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

如果只有一个主项目,怎么会安装多个应用程序?

【问题讨论】:

    标签: android eclipse android-studio


    【解决方案1】:

    在 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>
    

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

    【讨论】:

    【解决方案2】:

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

    1. 查看合并的 AndroidManifest.xml。它应该位于: &lt;your_project&gt;/build/intermediates/manifests/full/&lt;debugOrRelease&gt;/AndroidManifest.xml

    2. 搜索 LAUNCHER &lt;activity&gt; 标签。在您的情况下,您应该有超过 1 个 LAUNCHER &lt;activity&gt; 标签。我的情况是这样的:

      <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>
      

    就我而言,com.todddavies.components.progressbar.main 是一个库项目,其中包含一个已声明为 LAUNCHER 的示例项目。正确的 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"。根据Android Manifest Merger Documentation

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

    因此,带有标记tools:node="remove"&lt;activity&gt; 标记将告诉Gradle 在发生冲突时将其自身删除。换句话说,我们以某种方式“强迫冲突”。这有点骇人听闻,但它确实有效。

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

    【讨论】:

      【解决方案3】:

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

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

      我附上“build.gradle”文件的截图,请参考。

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

      在安卓开发者网站上也有定义

      “带有“android.intent.action.MAIN”的过滤器和 “android.intent.category.LAUNCHER”设置将活动宣传为 一个启动应用程序的应用程序 - 也就是说,应该是 显示在应用程序启动器中。图标和标签设置在 因此,过滤器是启动器中显示的过滤器。”

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

      【讨论】:

      • 我在 Windows 中使用 Android Studio 0.8.14。我没有看到您绘制的图标所指向的库模块复选框。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多