云助理原生安卓工程选择gradle来构建项目,所以在工程结构上和之前使用ant来构建的云助理安卓cordova工程有较多的不同。
以下将详细介绍原生安卓工程的工程结构。
云助理原生安卓工程根目录下结构如下:
rainbow-android
|-android
|-libs //工程使用的jar包和so文件
|-src
|-main
|-assets //放置html、js相关资源
|-java
|-res //布局资源和图片
AndroidManifest.xml
build.gradle
proguard-project.txt //代码混淆规则
proguard-rules.pro //代码混淆规则
rainbow.keystore //打包时使用的证书
rainbowDebug.keystore //测试时使用的证书
|-gradle //指定使用的gradle版本
|-out //打包时生成的apk存储目录
|-thid_party //引用的第三方工程
|-cordova //覆盖安装cordova版本的兼容代码
|-crosswalk //内置浏览器使用的webview
build.gradle
gradlew //gradlew, gradlew.bat是支持多平台的gradle运行命令
gradlew.bat //通过gradlew,可以执行gradle构建任务
Gruntfile.js
package.json //打包时的相关配置信息
settings.gradle
以下会详细说明几个比较重要的文件和目录:
用于声明工程包含的子工程及对应路径,在云助理工程中包含android、crosswalk和cordova三个子工程。
include ':android', ':crosswalk', ':cordova'
project(':crosswalk').projectDir = new File('third_party/crosswalk')
project(':cordova').projectDir = new File('third_party/cordova')
用于声明了项目的编译环境,指定Android Gradle插件的版本
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
}
}
allprojects {
repositories {
jcenter()
mavenCentral()
}
}
用于声明子工程包名、buildToolVersion、依赖等信息,以下是需要特别注意的几个点:
3.1 如果在子工程的libs中有加入.so文件,则一定要加入如下代码以保证编译时加入.so文件。
sourceSets {
main {
//在编译时加入.so文件
jniLibs.srcDirs = ['libs']
}
}
3.2 gradle可以同时生成多个不同的渠道包,可以通过修改applicationId来实现修改包名,然后在productFlavors中增加新任务,以编译生成多个渠道包。
productFlavors {
production {
applicationId 'com.starnet.rainbow.cordova'
}
}
3.3 声明工程涉及的所有依赖,包括本地jar包、第三方工程等
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':crosswalk')
compile 'com.android.support:multidex:1.0.0'
compile 'com.android.support:support-v4:22.2.0'
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.android.support:cardview-v7:21.0.2'
compile 'com.github.navasmdc:MaterialDesign:1.5@aar'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.github.chrisbanes.photoview:library:1.2.3'
compile project(':cordova')
}
实现云助理原生客户端的业务逻辑代码,都位于rainbow-android/android/src/main/java目录下,目录结构如下:
com
|-starnet.rainbow
|-android
|-core
|-model
|-module
|-provider
|-retrofit
|-service
|-ui
|-util
Config.java
Rainbow.java
RainbowApplication.java
Text.java
core模块主要是保存云助理客户端使用的APP_SECRET,提供对APP_SECRET的加密方法,以及提供应用证书校验的方法。
model中定义了云助理客户端使用到的数据模型,以及每个类相关属性及类型。
module模块用于实现云助理功能插件,包括百度地图、图片上传、内置浏览器、mqtt客户端、分享到微信、语音播报这些插件。
provider模块用于实现Sqlite数据库操作和SharePreferences操作,目录结构如下:
provider
|-RainbowDatabase.java
|-RainbowSPHelper.java
|-RainbowSql.java
|-SecureDbHelper.java
SecureDbHelper.java 实现了创建使用sqlcipher加密的sqlite数据库以及初始化数据库中所有的表格。
RainbowSql.java 中定义了所有对数据库进行操作的SQL语句。
RainbowDatabase.java 用于提供所有对数据库的操作的方法,包括插入消息、插入频道、清空频道等操作。
RainbowSPHelper.java 用于提供对SharePreferences的增删改查操作的方法。
网络通信模块,云助理使用retrofit进行网络通信。在“网络框架”部分会详细介绍。
service模块定义的IntentService用于在后台处理耗时、异步的操作,同时可以保证用户关闭当前页面也仍然可以再后台完成对应的操作。
ui模块用于实现云助理所有界面以及在界面上相关操作。
util模块用于封装实现常用工具类,包括存储获取当前账号信息、AES加密解密类、MD5加密、Dialog等工具类,同时,像消息列表界面、收藏页面等有较多复杂操作的页面,也会把数据库操作、网络请求、数据处理等代码封装到对应的工具类中。
封装了客户端涉及的常量,如服务器地址、消息类型、服务器返回的error code等。
定义了用于保存全局变量的Rainbow类。