Android Studio 一个工程打包多个不同包名的APK

公司最近有个特别的需求,同一套代码,稍做修改(如包名不一样,图标不一样,应用名不一样等),编译出几个不同的应用。刚好用AS重构完项目,在网上查阅了一些资料,终于搞定!!在这记录一下。

AS主要是利用gradle来实现这个需求的,具体做法如下:

修改app的build.gradle文件

假设我们同一套代码编译2个app:app1和app2

android {
    ...
    productFlavors {
        // app1
        app1 {

            // 设置applicationId(这里很重要,两个相同applicationId的apk不同同时安装在同一台Android手机中)
            applicationId "com.johan.demo"

            // 自动生成@string/app_name为demo
            resValue "string","app_name","demo"

            // 定义app_icon字段,在AndroidManifest.xml文件中用到
            manifestPlaceholders = [app_icon : "@mipmap/ic_launcher"]
        }
        // app2
        app2 {
            // 解释同app1
            applicationId "com.johan.demo1"
            resValue "string","app_name","demo1"
            manifestPlaceholders = [app_icon : "@mipmap/ic_launcher1"]
        }
    }
    lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }
}

注意啦,这里有个坑,我们上面写了

resValue "string","app_name","demo"

运行之后,AS会自动生成@string/app_name,内容是这样的

<item type="string" name="app_name">demo</item>

那么问题来了,如果你在app的strings.xml文件也定义了

<string name="app_name">demo</string>

编译的时候就会出现问题,因为有2个app_name,所以我们要把app的strings.xml去掉,编译就会正常了。
再注意啦,我们只能在app的build.gradle文件配置各个版本的值,如

app1 {
    buildConfigField "int", "TYPE", "1"
}
app2 {
    buildConfigField "int", "TYPE", "2"
}

如果你在其他子模块配置的话,编译时出现乱七八糟的错误!!
如果子模块需要配置的值,可以在公共模块定义静态变量,在app模块取出配置值后,设置到公共模块定义的静态变量中,这样的话各个模块都可以取到!!

修改AndroidManifest.xml文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.johan.demo">

    <application
        android:allowBackup="true"
        // 注意啦,这里改为${app_icon}
        android:icon="${app_icon}"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".ui.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

注意啦,icon属性的值是${app_icon},虽然为红色,但是不要紧,我们在build.gradle文件中加入了这么一段代码:

android {
    ...
    lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }
}

这里的作用就是即使项目中报错也不会停止打包 。

打包并签名APK

我们打包时,就会出现2个app:

我们选择2个app,AS就会帮我们打包2个不同的APK了,就这么简单!!

填坑

今天按照以上步骤在开发项目尝试了一下,虽然可以打包不同版本的apk,但是不能同时安装到同一台设备,提示:xx有相同组件之类的。然后查看两个apk的包名是否一样,结果两个apk的包名是不同的。就这个问题查了一整天,果然皇天不负有心人,被我找到了,原因是我在AndroidManifest文件定义了一个provider:

记住,provider标签的authorities属性的值一定要是唯一的,如果两个app的authorities属性值一样,就会提示安装失败,一定要记住!!

查看包名的方法:
因为我们此时的apk不能安装的手机上,所以只有apk这个包,这时,我们使用aapt命令(aapt是sdk自带的一个工具,在sdk\builds-tools\目录下):

aapt dump badging D:\apk\xxx.apk | findstr package

便可查阅apk的包名!

参考资料

一键打包出多个不同包名,不同应用名称和图标的APK

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
在开始创建你的第一个安卓项目之前,确保你已经安装了 Android Studio 开发环境,并且已经配置好了相关的 SDK 和虚拟机。如果你还没有安装 Android Studio,你可以在官方网站上下载并安装最新版本的 Android Studio。 接下来,我们来创建自己的第一个安卓项目: 1. 打开 Android Studio,点击 “Start a new Android Studio project” 或者 File -> New -> New Project。 2. 在弹出的窗口中,你需要填写一些基本的项目信息,包括项目名称、项目位置、公司域名等等。 3. 接下来,你需要选择你的项目的最低支持的 Android 版本。选择合适的版本后,点击 Next。 4. 在下一步中,你需要选择你的项目的 Activity 类型。Activity 是安卓应用程序的基本组成部分,是用户界面的一个窗口或页面。选择 Empty Activity,然后点击 Next。 5. 在下一步中,你需要填写 Activity 的名称、布局文件的名称等等。这些信息可以在创建项目后修改,所以你不需要过于关注这些细节。点击 Finish 完成项目的创建。 6. 创建完成后,你会看到一个包含您项目的文件和资源的项目结构。在 Android Studio 中,你可以使用左侧的 Project 窗口浏览和管理项目文件。 7. 接下来,你可以通过点击 Build -> Make Project 来编译你的项目。如果你的项目编译成功,你可以通过点击 Run -> Run 'app' 来运行你的项目。 8. 当你的应用程序运行成功后,你可以通过点击 Build -> Generate Signed APK打包你的应用程序。在打包 APK 的过程中,你需要选择一个签名文件,并输入相关的信息。最终生成的 APK 文件可以在 app/build/outputs/apk 目录下找到。 这就是创建你的第一个安卓项目并且打包 APK 的基本步骤。在实际的开发过程中,你需要学习更多的安卓开发知识和技能,才能够创建出更加复杂和实用的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值