Android马甲包的那些事儿

文章介绍了如何利用Android的productFlavors机制创建马甲包,涉及配置包名、资源、代码、签名文件以及服务器域名等,强调了资源的覆盖机制和代码管理。通过在build.gradle中设置flavorDimensions和productFlavors,可以为每个马甲包定制不同的应用ID、版本号和各种key,同时通过配置AndroidManifest.xml实现微信分享回调等活动。

制作Android马甲包最简单的方式就是使用 productFlavors 机制。

本文就是在productFlavors机制的基础上制作的马甲包,每个马甲只需要

  1. 在build.gradle文件中配置一下包名、各种key、签名文件

  1. 配置启动页、logo、app名等资源

  1. 配置服务器域名、微信分享回调Activity等代码

此外,代码、资源文件等全部都天然支持差异化功能

1. 原理

如下面代码所示,我们在build.gradle中使用productFlavors机制可以创建两个flavor——hdd以及jinyouzi,这样在Build Variant中就可以通过hddDebug、hddRelease、jinyouziDebug、jinyouziRelease来编译对应马甲的debug、release包。

注意,在此文章中hdd是基线包,jinyouzi是马甲包。

android {
    defaultConfig {
        applicationId "com.xxx.xxxxxxx.app"

        flavorDimensions "product"
    }

    productFlavors{
        hdd {
            dimension "product"
        }

        jinyouzi {
            dimension "product"
        }
    }
}

配置了flavor之后,我们在app/src下面可以创建与main目录同级的hdd、jinyouzi目录。这两个目录中的资源文件、代码在编译对应的flavor时可以加入编译。也就是说hdd = ['src/main', 'src/hdd'],jinyouzi = ['src/main', 'src/jinyouzi']。

  • 对于资源文件来说,flavor下的资源会“覆盖”main下面的资源,也就是flavor的优先级高——不知道官方怎么称呼,我借用Android系统开发中的名词,称之为overlay机制。

其实这点与apk的编译流程有关,在 Shrink, obfuscate, and optimize your app - Merge duplicate resources中有提到:
Gradle merges duplicate resources in the following cascading priority order:
Gradle 会按以下级联优先顺序合并重复资源:
Dependencies → Main → Build flavor → Build type
依赖项 → 主资源 → 构建flavor → 构建类型
For example, if a duplicate resource appears in both your main resources and a build flavor, Gradle selects the one in the build flavor.
例如,如果某个重复资源同时出现在主资源和构建flavor中,Gradle 会选择构建flavor中的重复资源。
  • 对于代码文件来说,如果flavor和main下有代码文件名称一样,编译时会报错。所以需要把各个flavor有差异的文件放到各个flavor下,而不是main下。

这就是马甲包的资源、代码管理的关键点。 这段关键点一头雾水没关系,后面具体配置的时候就会体会到。

此外,各个flavor原本就能配置不同的applicationId、版本号、友盟统计分享等key以及签名文件等,具体代码在后面会谈到。

2. 具体需求

我们先下面会从以下几个方面说明实际需求需要修改的位置:

  1. applicationId、版本号

  1. 资源文件

  1. 各种key的配置

  1. 代码文件

  1. 签名配置

2.1 applicationId、版本号

applicationId、版本号可以在flavors中直接进行配置:

build.gradle:

android {
    ...
    productFlavors{
        hdd {
            dimension "product"
            applicationId "com.xxx.xxxxxxx.app"
            versionCode 100080
            versionName "1.0.8"
        }

        jinyouzi {
            dimension "product"
            applicationId "com.xxx.flavor.app"
            versionCode 101030
            versionName "1.1.3"
        }
    }
}

applicationId在AndroidManifest.xml中也需要使用到,这

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张海龙(Jason Zhang)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值