每次中午吃饭总会和技术同窗聊天。当作 iOS 开发的作安卓开发的人员在一块儿的时候,他们中间又多了一个话题:iOS 开发难仍是安卓开发难。html
这个时候作安卓开发的同窗最激动说安卓开发要本身画界面、机型复杂、操做系统多 rom 又被各家改的四不像....开发一个安卓 APP 的时间将近是开发 iOS 所需时间的 2 倍。iOS 开发的同窗可能就会反驳说 iOS 开发入门难度比安卓高,开发中第三方库不像安卓那么多,开发设备又必须是 MAC,而安卓随便一台 PC 便可...笔者认为,这个问题因人而异,不想再引发一场争论。其实,今天想说的是,安卓开发中还有一件事情比较痛苦那就是打包。java
作过 APP 开发的人都知道安卓的渠道林立,笔者记得曾经工做的一家公司每次发包都要运行脚本去打包,每次打几百个 APK,花费几个小时,电脑都累的风扇呼呼叫。而 iOS 因为其封闭性,渠道除了 AppStore 以外几乎不多了。因此,安卓 APP 开发以后要把 APP 分发出去要作的事情要比 iOS 多这个是必定的。这篇文章我们就和作安卓开发的同窗聊一下安卓 APP 多渠道打包的事情。android
要多渠道打包,咱们就来讲一下渠道如何标识。通常来讲渠道标识有两个地方能够作: 一、在代码中写,例如 TalkingData 就提供了这种方式shell
//启动代码 init(final Context context, final String appId, final String partnerId); //这种方式不须要在 AndroidManifext.xml 里的 meta-data 申明了 TD_APP_ID 和 TD_CHANNEL_ID
二、在 AndroidManifext.xml 中填写,还拿 TalkingData 举例子性能优化
//启动代码 init(final Context context); //这种方式可使用多渠道打包工具,方便一次打包多个发布渠道 //AndroidManifext.xml中这样写 <meta-data android:name="TD_CHANNEL_ID" android:value="Your_channel_id" />
若是是单独打一个 APP 包加上上面的配置直接 IDE 中导出 APK 就好了,若是打不少个 APK 用 IDE 就很费力。 要想多渠道打包,就须要对 Android 的总体的打包编译过程有所了解。下面认识下 Android 的 java 代码、XML 格式的资源文件、图片文件等资源是如何转换成为一个 APK 的。 网络
你们从图中能够看出,大致分为如下 7 个大步: 一、打包资源文件,生成 R.java 文件 二、处理 aidl 文件,生成相应 java 文件 三、编译工程源代码,生成相应 class 文件 四、转换全部 class 文件,生成 classes.dex 文件 五、打包生成 apk 六、对 apk 文件进行签名 七、对签名的 apk 进行 zipalign 对其操做app
说明:这里只是大体代表大体的打包编译过程,其实若是细分每一部分还有不少细节。工具
结合原理和渠道的 一、2 两种设置方法咱们分别来讲.性能
一、若是渠道信息是经过 Java 的硬编码方式来作的,咱们能够在打包以前预处理 Java 源文件,找到渠道设置关键字,从渠道列表中找到一个渠道设置进去便可。因为脚本这块儿,不一样的语言的实现方式不一样,这里不作过多的说明。若是有须要的我能够把本身以前 shell 写的一段代码分享了。gradle
二、若是使用写在 AndroidManifext.xml 中,这个就能够经过读取 XML 文件的方式定位到 meta-data 而且 android:name 的值为 TD_CHANNEL_ID 的元节点。把这个元节点的值设置成某一个渠道便可。这里推荐你们看一下友盟开源的一个多渠道打包工具中有相关的实现细 1。这个过程发生在上图中的 aapt 阶段,这个阶段作的事情还比较多没有分来来讲。
大体原理就是这样,其实也很简单~,就是在正常的 Android 打包编译过程当中进行干涉,加入一些逻辑来替换相关的渠道信息,保证打包以后的 APK 中的渠道信息各不相同。 其实这个过程是这样的: 说明:图片来源网络
而后编写脚本或者工具来循环的这个过程....
Android Studio 发布已经好长时间了,Google 也一直在维护在更新,Android 开发的小伙伴大家用起来了吗?据说身边作开发的不少都转向了这个神器。这里,咱们就重点说一下如何在 Android Studio 中实现多渠道打包,后续给出一个 Demo来作演示,笔者以为这样更实用。 第一步在 AndroidManifext.xml 中配置渠道
<meta-data android:name="TD_CHANNEL_ID" android:value="${ONEAPM_TEST_CHANNEL}" />
第二步,在 APP 下的 build.gradle 中添加
productFlavors { wandoujia{} "1234Test"{} "1test111"{} } productFlavors.all { flavor -> flavor.manifestPlaceholders = [ONEAPM_TEST_CHANNEL: name] }
解释:productFlavors 相似于一个产品的不一样特性的配置[2]. productFlavors.all 是一个遍历,每个 productFlavors 中的值,其中productFlavors 的每个值都有一个 name ,就是相似 wandoujia 这样的字符,每次循环的时候会替换掉 AndroidManifext.xml 中的${ONEAPM_TEST_CHANNEL}。 第三步,执行打包命令 打开命令行定位到 project 目录,执行
gradlew assembleRelease
不出意外的话 bulid->outputs->apk 下面会有各个渠道的包,以下图
注意事项: 一、productFlavors 定义的时候里面的相似 wandoujia,不能是数字开头,不能是关键字 test 等,由于你要意识到你在写 gradle 脚本,要符合 groovy 语法。以下面的就不合法 二、flavor.manifestPlaceholders = [ONEAPM_TEST_CHANNEL: name]中的ONEAPM_TEST_CHANNEL 必定要和 AndroidManifext.xml 定义的一致。
开发者花费了很大的心血作出一款 APP 为的就是但愿这款 APP 产生它应有的价值。因此咱们会集成一些统计例如友盟、talking data,有了它每日活跃、新增、留存就有地方看了,这个估计每一个开发者都会作。单更重要的是,咱们作出的 APP 要保证在每台手机都能正常的打开和使用,特别是在 APP 同质化愈来愈严重的今天,你要保证 APP 可以脱颖而出就要保证 APP 稳定,因此咱们能够顺手添加如下 OneAPM[3] 就能监控到应用程序运行缓慢、ANR、Crash、WebView、Activity、网络请求等方面的性能,能让开发者第一时间掌握 APP 监控情况。更让人喜欢的是,这款产品只需开发者填入一行代码便可,真可谓是「神器」。
OneAPM Mobile Insight 以真实用户体验为度量标准进行 Crash 分析,监控网络请求及网络错误,提高用户留存。访问 OneAPM 官方网站感觉更多应用性能优化体验,想阅读更多技术文章,请访问 OneAPM 官方技术博客。
本文转自 OneAPM官方技术博客