You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android:将其他App作为外部库引入时的Manifest属性限制问题

解决将Android App项目作为外部库引入的Manifest属性问题

嘿,作为Android开发新手遇到这个问题太正常了,我来一步步帮你搞定!

问题根源

你把Project2当作库引入时出现Manifest报错,核心原因是Project2原本是一个独立的App项目(使用com.android.application插件),而库模块必须使用com.android.library插件。App的Manifest里有很多库模块不允许的属性(比如应用图标、启动主题、主Activity的启动器过滤器等),这就是报错的直接原因。

具体解决步骤

1. 修改Project2的Build配置

打开Project2根目录下的build.gradle文件,做以下调整:

  • 把App插件替换成库插件:
    如果是新的plugins写法:
    // 原来的
    plugins {
        id 'com.android.application'
    }
    // 改成
    plugins {
        id 'com.android.library'
    }
    
    如果是旧的apply写法:
    // 原来的
    apply plugin: 'com.android.application'
    // 改成
    apply plugin: 'com.android.library'
    
  • 删除defaultConfig中的applicationId字段(库模块不需要这个属性):
    defaultConfig {
        // 删掉这一行
        // applicationId "com.example.project2"
        minSdkVersion ...
        targetSdkVersion ...
        versionCode ...
        versionName ...
    }
    

2. 清理Project2的Manifest文件

打开Project2的src/main/AndroidManifest.xml,移除库不允许的属性和配置:

  • 移除application标签里的android:iconandroid:labelandroid:theme等属性,这些会由主项目Project1的Manifest来提供:
    <!-- 原来的 -->
    <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.Project2">
        ...
    </application>
    <!-- 改成 -->
    <application>
        ...
    </application>
    
  • 如果有主启动Activity的intent-filter(包含MAINLAUNCHER的配置),要么直接删掉这个过滤器,要么调整为适合库的配置(比如只保留Activity声明,去掉启动器过滤,让主项目按需启动这个Activity):
    <!-- 原来的主Activity配置 -->
    <activity
        android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <!-- 改成(保留Activity,去掉启动器过滤) -->
    <activity
        android:name=".MainActivity">
    </activity>
    

3. 同步Gradle并添加依赖

  • 在Android Studio中点击右上角的「Sync Project with Gradle Files」按钮,等待同步完成。
  • 打开Project1的app模块的build.gradle,添加对Project2的依赖:
    dependencies {
        // 其他依赖...
        implementation project(':MyDependency')
    }
    
  • 再次同步Gradle,之后就能正常使用Project2中的代码和资源了。

额外注意点

  • 如果Project2和Project1有资源重名(比如同名的drawable、string),可以在Project2的build.gradle中给资源添加前缀,避免冲突:
    android {
        ...
        resourcePrefix "project2_"
    }
    
  • 如果Project2中有自定义的Application类,库模块不能独立使用Application,你可以改成用ContentProvider做初始化,或者让Project1的Application类去调用库的初始化方法。

内容的提问来源于stack exchange,提问作者FPO94

火山引擎 最新活动