多渠道打包
AndroidManifest.xml文件解析
补充知识
AndroidManifest.xml 是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities, services, 等等),他们各自的实现类,各种能被处理的数据和启动位置。 除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)
1 <meta-adata>
语法1
2
3<meta-data android:name="string"
           android:resource="resource specification"
           android:value="string"/>
被包含于
<activity><activity-alias><service><receiver>
四个元素中。
说明
这个元素用name-value对的格式给其父组件提供任意可选的数据。
一个组件元素能够包含任意多个<meta-data>子元素,所有这些元素中定义的值会被收集到一个Bundle对象中,并且提供给组件的PackageItemInfo.metaData属性字段。
通常值是通过其value属性来指定的。但是,也可以使用resource属性来代替,把一个资源ID跟值进行关联。
例如,下面的代码就是把存储在@string/kangaroo资源中的值跟”zoo”名称进行关联:1
<meta-data android:name="zoo" android:value="@string/kangaroo" />
另一个方面,使用resource属性会给zoo分配一个数字资源ID,而不是保存在资源中的值。例如:1
<meta-data android:name="zoo" android:resource="@string/kangaroo" />
要避免使用多个独立的
属性
- android:name
 针对项目的一个唯一名称。使用Java样式的命名规则,可以确保名称的唯一性,例如:- com.example.project.activity.fred。
- android:resource
 这个属性定义了一个要引用的资源。资源的ID会跟这个项目进行关联。通过Bundle.getInt()方法能够从meta-data的Bundle对象中获取这个ID。
- android:value
 这个属性会给这个项目分配一个值。下表列出了可能分配的数据的数据类型,以及获取这些数据的方法:
多渠道打包
以友盟统计为例,在AndroidManifest.xml里面会有
2
3
android:name="UMENG_CHANNEL"
android:value="Channel_ID" />
Channel_ID就是渠道标示,我们的目标就是在编译的时候这个值能够自动变化。
1 在AndroidManifest.xml里配置PlaceHolder
| 1 | <meta-data | 
${UMENG_CHANNEL_VALUE}这是个引用,具体值在gradle中配置
2 在build.gradle设置productFlavors
首先配置UMENG_CHANNEL_VALUE的默认值1
2
3
4
5defaultConfig {
 ···
	manifestPlaceholders = [UMENG_CHANNEL_VALUE: "channel_name"]
 ···
}
然后配置不同的渠道id
| 1 | android { | 
更简洁的写法,1
2
3
4
5
6
7
8
9
10
11
12
13
14// 友盟多渠道打包
    productFlavors {
        wandoujia {}
        c360 {}
        baidu {}
        xiaomi {}
        tencent {}
        taobao {}
        ...
    }
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
然后在签名配置完成后,就可以使用命令行打包了
gradle命令行打包
1 使用gradle命令配置签名
首先在app的build.gradle文件配置要签名的keystore文件
为了不暴露密码,不直接在signingConfigs中配置密码,需要在控制台输出
| 1 | def releaseTime() { | 
2 使用命令行打包
1 view->ToolWindows->Terminal打开命令行
2 在命令行输入gradlew -v ,如果第一次会执行下载gradle,记得翻墙,不然会慢到崩溃
3 执行gradlew clean,等待时间会比较长
4 执行gradle build,开始编译,成功后zlot\build\outputs\apk目录会有编译后的apk,
这时编译的apk包括debug版本,release版本,特别慢
补充
- gradlew assembleRelease:只编译并打Release的包
- gradlew assembleDebug:只编译并打包debug版本
除此之外 assemble 还能和 Product Flavor 结合创建新的任务,其实 assemble 是和 Build Variants 一起结合使用的,而Build Variants = Build Type + Product Flavor , 举个例子大家就明白了:
- gradlew assembleWandoujiaRelease只打包wandoujia渠道的release包
3 比命令行更简单的打包方式
打开androidStudiode gradle面板,会发现多了很多任务,
然后直接双击任务生成apk
错误处理
当build faile时,找不到错误的原因,可以执行gradlew check进行检测,一般会给出错误原因,
比如1
2
3
4
5
6
7
8ndroid {
    lintOptions {
        abortOnError false
    }
}
...
             
* Try:
意义是让我们关闭lint检查,因为开启的话,有任何的错误或者警告提示,都会终止构建
代码混淆
参考文献
Android 使用Android Studio + Gradle 或 命令行 进行apk签名打包
Android Studio系列教程六–Gradle多渠道打包