V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
seathink
V2EX  ›  Android

分享 Android gradle 打渠包的一种方式

  •  
  •   seathink · 2014-11-04 01:07:14 +08:00 · 16130 次点击
    这是一个创建于 3676 天前的主题,其中的信息可能已经有所发展或是发生改变。

    http://devyang.me/blog/2014/11/03/android-gradle-duo-qu-dao-da-bao-pei-zhi/

    需求

    国内Android app发布一般会有多个渠道,为了跟踪发展情况,通常会为每一个渠道定制一个特别的apk。

    一般友盟之类第三方统计的渠道ID定义如下,以wandoujia为例

    <meta-data android:name="UMENG_CHANNEL" android:value="wandoujia" />
    

    如果不使用第三方统计,自己也可以在AndroidManifest.xml中定义类似meta-data

    如果每个渠道都手工修改,打包,10几个渠道下来😂

    还是自动化来得方便

    解决方案

    Gradle Android Plugin 0.10 新增了Manifest Merger

    For custom placeholders replacements, use the following DSL to configure the placeholders values :

    android {
    
        defaultConfig { 
    
            manifestPlaceholders = [ activityLabel:"defaultName"] 
    
        } 
    
        productFlavors {
    
            free { 
            } 
    
            pro { manifestPlaceholders = [ activityLabel:"proName" ] 
    
            } 
        }
    }
    

    Manifest Merger 可以替换Manifest中对应key的值

    所以,可以利用Product flavor + manifestPlaceholder 来替换对应渠道的key

    假如我们有wandoujia, Google Play, 两个渠道,可以这么写

    AndroidManifest.xml

    <meta-data android:name="UMENG_CHANNEL" android:value="$[CHANNEL_KET]" />
    

    build.gradle

    productFlavors {
                wandoujia{
                    manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name]
                }
                google_play{
                    manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name]
                }
            }
    

    几行代码自动生成对应渠道的apk。 其实是将Manifest中的
    UMENG_CHANNEL_VALUE替换成了flavorbuild的name

    可以看到每个flavor里面的代码一样,比较啰嗦,还能在简化下,

    productFlavors {
                wandoujia{
                }
                google_play{
                }
            }
    
            productFlavors.all { flavor ->
                flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]
            }
    

    一个循环搞定~

    6 条回复    2014-11-07 09:02:52 +08:00
    xcv58
        1
    xcv58  
       2014-11-04 01:36:52 +08:00
    挺好的。
    ufo22940268
        2
    ufo22940268  
       2014-11-04 05:55:38 +08:00 via Android
    速度快吗,打包几十个渠道要多少时间
    seathink
        3
    seathink  
    OP
       2014-11-04 09:24:49 +08:00 via Android
    @ufo22940268 速度不错。比手工打速度快多了。你可以在现有工程上试下,添几行代码就可以了
    holmesabc
        4
    holmesabc  
       2014-11-04 11:42:58 +08:00
    自己用python写了个自动打包的, 以兼容公司的多种渠道需求.
    原理用python改manifest,gradle打包。
    seathink
        5
    seathink  
    OP
       2014-11-04 12:57:12 +08:00
    @holmesabc 嗯,方法很多。简单方便实现需求就好😄
    up76733
        6
    up76733  
       2014-11-07 09:02:52 +08:00 via Android
    挺好用的,谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4425 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 05:32 · PVG 13:32 · LAX 21:32 · JFK 00:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.