Android 多包名打包应用

简介:
公司的新需求:同一份代码打出另一个包名的apk,即包名不同、名称不同的两个apk。

我经过多方渠道发现大致有一下三种方法:

  • 通过ant打多包名应用
  • 建立多个与“main”同级的文件夹,修改清单文件及build.gradle以达到打多包名效果
  • 通过修改build.gradle文件的applicationId达到打多包名的效果,原理与第二种方法但比较简单

因为是新手,对ant并不太了解,原理也不太清楚,为了赶时间所以直接选择了第二种与第三种方法,经过测试发现第三种方法要更加简单的多,所以最后直接使用了第三种方法,以下为详解。


因为要修改的是build.gradle文件而该文件一经修改就要重新编译,用过史丢丢的童鞋应该都清楚等待编译完成是是件多么蛋疼的事情所以建议大家一次性修改完成以便节约开发时间。

上面已经说过该方法主要是通过修改build.gradle文件的applicationId达到打多包名的效果的,下面便粘出本人代码供大家参考。

  productFlavors {
        app_one {
            applicationId "com.example.app1"
            manifestPlaceholders = [
                    app_name:"测试-1"
            ]
        }
        app_two {
            applicationId "com.example.app2"
            manifestPlaceholders = [
                    app_name:"测试-2"
            ]
        }
        app_three {
            applicationId "com.example.app3"
            manifestPlaceholders = [
                    app_name:"测试-3"
            ]
        }
    }

是不是感觉这个方法很眼熟?
没错就是多渠道打包的地方,通过添加这段代码后需要用到gradle面板进行打包,得到app_one 通过查看包名发现它的包名为 com.example.app1 显示的名称也为 测试-1,app_two 与 app_three 效果等同,至此已经完成多包名打包,且通过同一份代码打出了不同包名、不同名称的三个应用,而需求也达到了。

可能有的朋友会问如果还需要其他的渠道包怎么办,如果有10的渠道而又要打包两个不同的应用那岂不是要写20个类似于app_one的东西,那不是要很麻烦?没错我正好也碰到了这种情况,经过多次研究测试发现并没有那么麻烦,只需设定一个默认的包名、应用名即可,废话不多说,直接贴代码。

 defaultConfig {
        if (PACKAGE == "one") {
            applicationId "com.example.app1"
            manifestPlaceholders = [
                    app_name:"测试-1"
            ]
        } else {
            applicationId "com.example.app2"
            manifestPlaceholders = [
                    app_name:"测试-2"
            ]
        }
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    productFlavors {
        app_one {}
        app_two {}
        app_three {}
    }

嗯,就是这样,在defaultConfig里面设置一个默认的包名与应用名就可以了。

好了,到了这一步我们就要用到另一个神奇的文件了

[图片上传失败...(image-31a325-1538373536915)]

看看你的工程根目录下得这个东西,没错就是它,这里我设置了一个字段“PACKAGE”,即告诉Studio我想要什么包,到这里相信大家也就明白我写的判断的目的了。

PACKAGE=one

只要通过修改这一字段为“one”,然后通过打包后就可以得到三个“测试-1”的app_one、app_two、app_three的apk文件了,同理将其修改为其他字段即可打出其他包名、应用名的应用了。
但是转到本人公司项目后发现这种方法竟然失灵了,即修改 properties 文件内的字段后得不到我想要的包,经过探索发现可能是与项目工程的大小有关,改完重启后就可以了。
当然还有另一个最重要的地方

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.morepackagenametest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="${app_name}"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

就是这里了,即之前定义的名字赋给应用了,在这里大家要注意一下在该项目的其他 model 内的清单文件里最好不要写 android:label 这句了,否则会报错的,至于是什么错一眼就可以看到了,当然如果报错了有两个方法:

  1. 删掉其他 model 内清单文件下applicationlabel 属性
  2. 通过在 application 下添加 tools:replace="android:label" 属性解决

好了,打完收工。期待大神的批评指导。

最后附上资源下载地址 Android 多包名打包应用 供各位参考

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,901评论 25 709
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,501评论 2 59
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,800评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,118评论 6 342
  • 有些人在我们的生命里, 不期而遇, 又在寂静的时光里, 渐行渐远。 有些人一旦入心, 便再也不会忘记。 时光易老,...
    老马说事阅读 2,675评论 0 0

友情链接更多精彩内容