rainbow-android-app

工程结构

简介

云助理原生安卓工程选择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

以下会详细说明几个比较重要的文件和目录:

gradle相关配置文件

1. 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')

2. rainbow-android根目录下的build.gralde文件

用于声明了项目的编译环境,指定Android Gradle插件的版本

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
    }
}

allprojects {
    repositories {
        jcenter()
        mavenCentral()
    }
}

3. rainbow-android/android目录下的build.gradle文件

用于声明子工程包名、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

core模块主要是保存云助理客户端使用的APP_SECRET,提供对APP_SECRET的加密方法,以及提供应用证书校验的方法。

model

model中定义了云助理客户端使用到的数据模型,以及每个类相关属性及类型。

module

module模块用于实现云助理功能插件,包括百度地图、图片上传、内置浏览器、mqtt客户端、分享到微信、语音播报这些插件。

provider

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

网络通信模块,云助理使用retrofit进行网络通信。在“网络框架”部分会详细介绍。

service

service模块定义的IntentService用于在后台处理耗时、异步的操作,同时可以保证用户关闭当前页面也仍然可以再后台完成对应的操作。

ui

ui模块用于实现云助理所有界面以及在界面上相关操作。

util

util模块用于封装实现常用工具类,包括存储获取当前账号信息、AES加密解密类、MD5加密、Dialog等工具类,同时,像消息列表界面、收藏页面等有较多复杂操作的页面,也会把数据库操作、网络请求、数据处理等代码封装到对应的工具类中。

Config.java

封装了客户端涉及的常量,如服务器地址、消息类型、服务器返回的error code等。

Rainbow.java

定义了用于保存全局变量的Rainbow类。