实现前提
原生工程的升级
- 升级到android studio的理由
- Google推出的
毫无疑问,这个是它的最大优势,Android Stuido是Google推出,专门为Android“量身订做”的,是Google大力支持的一款基于IntelliJ IDEA改造的IDE,而且Google已经正式提出了停止对其他开发环境的支持,这应该能说明为什么它是Android的未来。
- 速度更快
Eclipse的启动速度、响应速度、内存占用一直被诟病,相信大家这点应该深有体会,而且经常遇到卡死状态。Studio不管哪一个方面都全面领先Eclipse。
- UI更漂亮
I/O上演示的那款黑色主题真是太棒了,极客范,Stuido自带的Darcula主题的炫酷黑界面实在是高大上,相比而言Eclipse下的黑色主题太low了。
- 代码提示更智能
提示补全对于开发来说意义重大, Studio则更加智能,智能保存,从此再也不用每次都 Ctrl + S了。熟悉Studio以后效率会大大提升。
- 整合了Gradle构建工具
Gradle是一个新的构建工具,自Studio亮相之处就支持Gradle,可以说Gradle集合了Ant和Maven的优点,不管是配置、编译、打包都非常棒。
- 强大的UI编辑器
Android Studio的编辑器非常的智能,除了吸收Eclipse+ADT的优点之外,还自带了多设备的实时预览,相对这对Android开发者来说简直是神器啊。
- 内置终端
Studio内置终端,这对于习惯命令行操作的人来说简直是福音啊,再也不用来回切换了,一个Studio全部搞定。
-
更完善的插件系统
Studio下支持各种插件,如Git、Markdown、Gradle等等,你想要什么插件,直接搜索下载。
- 如何升级android studio
eclipse开发的android项目,如何变成android studio的项目,有两种方式,我用的是File->Export->Generate Gradle build files然后一直下一步,选择你要导出的项目(不用管依赖项目,会自动导出的):还有另外一种方式是不用修改eclipse的工程,然后打开android studio,选中import project(eclipse ADT..),不过:注意这种方式导入进来的话,会有很多的问题,如果你引用了很多外部的jar包,会遇到很多乱七八糟的问题,我就是一开始由于解决不了,放弃转android studio,还好使用了eclipse生成gradle项目,直接用android studio打开,避免了一些问题.
- 相关介绍
1. Gradle是个构建系统,能够简化你的编译、打包、测试过程。熟悉Java的同学,可以把Gradle类比成Maven。
2. Gradle Wrapper的作用是简化Gradle本身的安装、部署。不同版本的项目可能需要不同版本的Gradle,手工部署的话比较麻烦,而且可能产生冲突,所以需要Gradle Wrapper帮你搞定这些事情。Gradle Wrapper是Gradle项目的一部分。
3. Android Plugin for Gradle是一堆适合Android开发的Gradle插件的集合,主要由Google的Android团队开发,Gradle不是Android的专属构建系统,但是有了Android Plugin for Gradle的话,你会发现使用Gradle构建Android项目尤其的简单。
调用接口统一
-
调用接口和谐化
抽离出公共部分以及差异部分
1. 第三方应用信息差异(appid,appKey,appSecret,对应组件清单文件注册)
2. 应用信息差异(包名,icon,应用名称,签名)
3. 游戏资源差异 (游戏脚本文件,游戏资源文件)
多渠道分发
- 多渠道分发主要是解决差异化打包
编译之后会在你包名下的BuildConfig文件中出现,在之后界面中使用:
然后看下刚才在gradle中设置的差异化属性的使用:
项目采取的方案
差异化部分通过文件隔离,编译时差异部分会覆盖main文件夹的同名文件
清单文件main中只保留公共属性,差异化属性放在新渠道对应的清单文件中
各渠道三方信息统一在各自渠道的ChannelInfo文件维护
三方渠道所必需文件
特殊第三方接入逻辑的兼容处理
云盾接入现状,某些项目已经将云盾升级到最新版本,这里我们统称为v3,而其他大多数版本还未升级,在使用上一版本,这里我们统称为v2,为了处理这一兼容,我们对项目加了一道处理。我们将云盾v2,v3版本单独成两个独立的module,接入的渠道可根据自己特定的情况,选择性导入特定的module。
通过这种方式,开发导入特定所需module之后,最后打出的包只会有特定module的jar与so库,不会增加额外的包体大小。同时为了接口调用和谐,将v3,v2具体的实现差异加了一层封装,开放出一致的接口,屏蔽了这一层差异。
新渠道接入流程
1. 在app module的build.gradle加入自己的渠道,在渠道里面配置自己的应用信息,例如应用的application id与版本信息
2. 将工程视图切到project,并且在app目录下创建一个与main平级的文件夹,文件夹名称为第一步配置的渠道名
3. 将渠道模版的文件拷贝到上一步创建好的文件夹中
4. 因为特殊第三方渠道的文件包名特殊,修改拷贝模版下的包名与应用的applicationid保持一致,否则,三方渠道没有正常吊起,或回调
5. ChannelInfo中配置应用的三方信息
6. 对应渠道文件夹下认领自己应用的清单信息
7. 对应渠道文件夹下修改自己应用icon,以及包名
8. 配置app module下的build.gradle下要引入的云盾版本
9. 重新bulid,没有报错,就代表接入完成,之后打开gradle一栏,可以看到ide已经为我们创建好的多种task,通过不同task我们可以实现独立渠道包编译与apk输出,以及所有渠道的共同输出apk
项目展望
这并不是一份令人满意的解决方案,对于现在的业务来说,这是一份临时的过渡方案,它能够完成现有的业务需求。但对于日渐变化的运营需求来说,维护起来越来越吃力。在搭建这份解决方案的同时,自己也感受到它的缺陷,所以搭建的过程自己也有了这份解决方案的v2.0版本。这里也给大家分享一下,也希望大家也能够参与进来,将这份方案更加系统与科学。
在这份方案中,大家也能够看到微信,支付宝,等渠道都没有进行更好的拆开??悸堑绞奔湮侍庖约跋钅康耐瓿啥?,在这份方案中为了实现渠道之间的更好抽离,特意在云盾这里做了埋点,就是项目的组件化。后期我们会将各渠道类似于云盾一样单独封装成module。只要项目需要就将特定的渠道??橐胂钅俊O钅康拇罱ň褪亲榧淖楹?。在这份方案中,对于接入的开放者来说,自由度不过高。为了解决这个问题,后续会将所涉及的内容按功能分配成组件,例如所有第三sdk都是组件,cocos相关的东西也单独抽象成一个组件,各个组件就是一个个module,同时建立一个远程仓库,将各个组件放入远程的仓库,各个项目只要保留一个主module,这个主module一般来说不放入过多的业务逻辑代码,只是作为一个应用启动器,同时引入自己所需要远程仓库中的组件。这个主module各自项目自己维护,如果业务需求,可以自己在主module中扩展接口,供自己游戏调用。