文档章节

Android Gradle 相同应用多包名打包,实现测试发布包分离,不同服务器地址以生成不同安装包

woquanke
 woquanke
发布于 2016/11/14 18:33
字数 1371
阅读 1.3K
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

Android Gradle 相同应用多包名打包,实现测试发布包分离,不同服务器地址以生成不同安装包

简介: 公司的新需求:同一份代码打出另一个包名的apk,即包名不同、名称不同的两个apk。因为市场是识别包名的,所有可以相同的代码可以发布多个APP,以便于测试什么样的名字被用户接受(本人不太认同这种观点,这里只谈技术),可以在同一个手机同时安装测试包和发布包(大部分测试的接口地址与发布的接口地址是不一样的,还有一些公司还有开发的接口),方便测试

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

  • 通过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" 属性解决

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

此文同事编写,此后会增加不同服务器地址以生成不同安装包的demo

原文:http://blog.csdn.net/qq_33673284/article/details/52875696

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

woquanke

woquanke

粉丝 71
博文 53
码字总数 54094
作品 3
浦东
程序员
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
记一次失败的Perl + Nginx + FastCGI 配置过程

这两天心血来潮,不知道为什么和 Perl + Nginx + FastCGI 配置 耗上了。但是失败了,记录如下: 1)安装Nginx 1.4.3 ,我的是WINDOWS 7 系统,修改配置文件如下: location ~ .(pl|cgi|perl)?...

通吃岛-低手哥
2013/10/27
1.7K
7
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.5K
6
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.1K
3
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
6K
18

没有更多内容

加载失败,请刷新页面

加载更多

将32位循环计数器替换为64位会在Intel CPU上使用_mm_popcnt_u64引起疯狂的性能偏差

问题: I was looking for the fastest way to popcount large arrays of data. 我一直在寻找最快的方法来popcount大量数据的数量。 I encountered a very weird effect: Changing the loop......

javail
25分钟前
8
0
什么是单子? - What is a monad?

问题: Having briefly looked at Haskell recently, what would be a brief, succinct, practical explanation as to what a monad essentially is? 最近对Haskell进行了简要介绍之后,关于......

富含淀粉
今天
19
0
是什么 做?

问题: What's the difference if one web page starts with 如果一个网页以...开头有什么区别 <!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=ed......

技术盛宴
今天
15
0
我怎样才能存储特定文件? [重复] - How can I git stash a specific file? [duplicate]

问题: Possible Duplicate: 可能重复: How to stash only one file out of multiple files that have changed 如何从已更改的多个文件中仅存储一个文件 How can I stash a specific file ......

法国红酒甜
今天
36
0
OSChina 周一乱弹 —— 你想用屁治疗一下谁

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《Rain in the Park》- Marika Takeuchi 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
99
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部