0%

项目重构记录

总结一下在新公司一个月来学到的东西吧。公司的项目采用Native+RN进行开发,前两周简单的了解了一下项目结构,写了一些自动打包的脚本。后两周大致学习了一下RN,然后就是调整项目结构,做重构。

一些简单的记录,

需要注意的地方
  1. 主工程module下的插件是

    apply plugin: ‘com.android.application’

library中的插件是

apply plugin: ‘com.android.library’

  1. 在library module中,生成的R文件中的变量没有被final修饰,所以在switch case中需要改一下写法,比如改成if else

  2. ButterKnife中注解@bind中要求参数是final类型,所以在library中这个注解也不好用,作者给出了解决方案。

  3. library module中不能有applicationId。

    改动记录

    涉及到源代码的部分没有公开。

  4. 将原项目中所有library依赖移动到BaseApp文件夹下,统一由一个git子模块引用。,所以需要在工程根目录下的setting.gradle中修改include路径

    include ‘:base’

改为

include ‘:BaseApp:base’

library中依赖的其他library也需要做修改(路径前添加:BaseApp ),如RiskControlSdkdependencies

1
2
releaseCompile project(path: 'BaseComponents', configuration: 'release')
debugCompile project(path: ':BaseComponents', configuration: 'debug')

改为

1
2
releaseCompile project(path: ':BaseApp:BaseComponents', configuration: 'release')
debugCompile project(path: ':BaseApp:BaseComponents', configuration: 'debug')
  1. 原app module(现base)中用到butterknife,在@bind注解要求参数是final类型,但是在library项目中,生成的R文件中的id不是final。
    butterknife作者给出类解决办法:升级butterknife到8.8.1,在library中的build.gradle添加apply plugin: 'com.jakewharton.butterknife'插件,用于生成R2文件,将原来的R.id.xxx改为R2.id.xxx。同理,在switch case中用R.id的地方也要做相应修改。参考 https://github.com/JakeWharton/butterknife

  2. 将gradle依赖、某些appkey在根目录下的config.gradle中配置
    在项目根目录下新建config.gradle文件,用来存放公共配置,如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
ext {
url = "https://test.test.com"
UMENG_APPKEY = "*****"
UMENG_MESSAGE_SECRET = "*******"
WEIXIN_APP_ID = "******"
WEIXIN_APP_SECRET = "********"
android = [
compileSdkVersion: 25,
buildToolsVersion: "25.0.2",
applicationId : "xxxxx",
minSdkVersion : 16,
targetSdkVersion : 22,
versionCode : 120,
versionName : "1.2.0",
]
dependencies = [
"appcompat-v7" : "com.android.support:appcompat-v7:25.0.0",
"support-v4" : 'com.android.support:support-v4:25.0.0',
"support-v13" : 'com.android.support:support-v13:23.4.0',
"support-annotations" : 'com.android.support:support-annotations:23.4.0',
"butterknife" : "com.jakewharton:butterknife:8.8.1",
"xutils" : 'org.xutils:xutils:3.5.0',
"junit" : 'junit:junit:4.12',
"react-native" : "com.facebook.react:react-native:0.49.5",
"subsampling-scale-image-view": 'com.davemorrissey.labs:subsampling-scale-image-view:3.5.0',
"eventbus" : 'de.greenrobot:eventbus:2.4.0',
"okio" : 'com.squareup.okio:okio:1.8.0',
"universal-image-loader" : 'com.nostra13.universalimageloader:universal-image-loader:1.9.5',
"multidex" : 'com.android.support:multidex:1.0.1',
"nohttp":'com.yanzhenjie.nohttp:nohttp:1.1.4',
]
}

使用时注意事项:

  1. 现在library中的所有appkey(三方)相关的,都由工程根目录下的配置文件config.gradle提供,然后添加到该module的BuildConfig.java文件中,代码中从BuildConfig.java文件中引用

config.gradle文件中添加一个三方key值

1
2
3
ext{
UMENG_APPKEY = "************"
}

在module中的build.grale引用

1
def UMENG_APPKEY = rootProject.ext.UMENG_APPKEY

加入到该module的BuildConfig.java文件

1
2
3
defaultConfig{
buildConfigField "String", "umeng_analytics_key", "\"" + UMENG_APPKEY + "\""
}

代码中引用

1
BuildConfig.umeng_analytics_key

这里需要注意的是,import该文件的时候,是从该module的manifest.xml中的跟标签的package属性所指向的包名导入的,如

1
2
3
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.huangyuanlove.test">
</manifest>

BuildConfig.java文件的导入路径为 import com.huangyuanlove.test;
2. 所有使用gradle依赖的三方全部放在根目录的config.gradle文件夹下,其他module引用时可参考下面的配置。如

需要添加一个新的依赖,在根目录下的 config.gradle文件中

1
2
3
4
5
ext{
dependencies=[
"newDependency":"dependency",
]
}

在其他module中引用

1
2
3
4
def dependency = rootProject.ext.dependencies
dependencies {
compile dependency["newDependency"]
}