关闭

Android 多包名打包应用

标签: android渠道apk打包
1057人阅读 评论(3) 收藏 举报
分类:

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里面设置一个默认的包名与应用名就可以了。

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

工程目录下配置文件

看看你的工程根目录下得这个东西,没错就是它,这里我设置了一个字段“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 多包名打包应用 供各位参考

3
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android studio 多渠道多包名打包

在日常开发中我们经常会有多渠道分发的需求,那么如果针对每个渠道都打包一次那简直是不舒服斯基到死,作为以“懒”作为标签的程序员群体,干这种重复性的工作,那感觉简直不要太酸爽,简直让人分分钟切腹。所以我们...
  • q390345932
  • q390345932
  • 2016-08-22 13:48
  • 2404

Android中一个app包括多个package

Android中一个app包括多个package 诸如com.A.B.C,com.A.B.D, com.A.C, 那么在AndroidManifest.xml中,声明的package应该为com.A...
  • flywalker
  • flywalker
  • 2012-01-24 00:17
  • 2337

安卓开发之引入第三方库导致jar包冲突解决办法

这几天的任务是将mapbox的工程合到程序中去,但是合并过程却出现了问题合并方法: 在app的build.gradle中添加dependencies { compile ('com.mapb...
  • u013220174
  • u013220174
  • 2015-08-26 15:55
  • 13464

android studio gradle 多版本多apk打包(打包系列教程之五)

通过上一篇gradle多渠道打包的介绍后,本篇我们就来介绍一下多版本apk的打包。在项目的开发过程,有可能我们会有需要打包多种版本apk的需求,比如当测试部门在测试需要我们提供两种当前正在开发的apk...
  • javazejian
  • javazejian
  • 2016-02-27 23:40
  • 15872

如何用同一份代码生成不同包名的APK包

有时候,我们需要用同一份生成几个不同的APK包在手机上测试,如果不修改配置,安装新APK时,会覆盖之前的APK。解决方法: 1.修改AndroidManifest中的包名: package="com....
  • goodmentc
  • goodmentc
  • 2015-05-13 19:02
  • 1832

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

此Demo的原理与多渠道打包的原理相同(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)最近有一个需求,就是一套代码要根据不同的客户打包出不同包名,不同appName,图标的apk,如果一...
  • qq_27280457
  • qq_27280457
  • 2017-01-09 15:49
  • 3060

多渠道打包,生成不同包名的包

来对多渠道打包,并生成不同的包名的知识点做个总结。需要生成不同包名的原因是为了运营的ASO。 方法: 1.直接建立渠道的文件夹,修改Manifest里面的包名 2.利用占位符 当然上面两种方法各有优劣...
  • qy274770068
  • qy274770068
  • 2016-04-21 22:57
  • 9420

关于多应用(不同包名)中三方登录和支付的一点坑

最近在做项目的时候有一个需求:公司同一个应用需要发布多个app(相同功能代码),微信登录、QQ登录、微博登录和手机登录之后是同一个用户信息,且均能实现支付宝、微信支付功能。手机登录不必多说,手机号密码...
  • Android_caishengyan
  • Android_caishengyan
  • 2016-10-09 13:05
  • 2963

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

此Demo的原理与多渠道打包的原理相同(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)最近有一个需求,就是一套代码要根据不同的客户打包出不同包名,不同appName,图标的apk,如果一...
  • qq_27280457
  • qq_27280457
  • 2017-01-09 15:49
  • 3060

多渠道打包,生成不同包名的包

来对多渠道打包,并生成不同的包名的知识点做个总结。需要生成不同包名的原因是为了运营的ASO。 方法: 1.直接建立渠道的文件夹,修改Manifest里面的包名 2.利用占位符 当然上面两种方法各有优劣...
  • qy274770068
  • qy274770068
  • 2016-04-21 22:57
  • 9420
    个人资料
    • 访问:1148次
    • 积分:37
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    文章分类
    文章存档
    最新评论