Skip to content

Commit a30e874

Browse files
committed
支持自动装配autowire,通过注解@autowire标记一个需要@makeapi的类,则不需要主动条用ModuleApi.set(),在第一次调用get的时候自动创建对应的对象。
1 parent 3b93866 commit a30e874

File tree

7 files changed

+103
-30
lines changed

7 files changed

+103
-30
lines changed

README.md

+23-25
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# ModuleApi
22

33
[![license](http://img.shields.io/badge/license-Apache2.0-brightgreen.svg?style=flat)](https://github.com/AlbieLiang/ModuleApi/blob/master/LICENSE)
4-
[![Release Version](https://img.shields.io/badge/release-0.1.0-red.svg)](https://github.com/AlbieLiang/ModuelApi/releases)
5-
[![wiki](https://img.shields.io/badge/wiki-0.1.0-red.svg)](https://github.com/AlbieLiang/ModuleApi/wiki)
4+
[![Release Version](https://img.shields.io/badge/release-0.1.5-red.svg)](https://github.com/AlbieLiang/ModuelApi/releases)
5+
[![wiki](https://img.shields.io/badge/wiki-0.1.5-red.svg)](https://github.com/AlbieLiang/ModuleApi/wiki)
66
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/AlbieLiang/ModuleApi/pulls)
77

88
A across module Calling component for Android development.
@@ -14,45 +14,34 @@ ModuleApi是一个用于解决Android模块化后,跨模块调用的组件。M
1414

1515
在工程的build.gradle中添加依赖
1616

17-
```gradle
17+
```groovy
1818
buildscript {
1919
repositories {
2020
jcenter()
2121
}
2222
dependencies {
23-
// 添加对ArbitraryGen的依赖
24-
classpath 'cc.suitalk.tools:arbitrarygen-plugin:2.1.1'
2523
// 添加对ModuleApi代码生成插件的依赖
26-
classpath 'cc.suitalk.tools:module-api-ag-extension:0.1.0'
27-
...
24+
classpath 'cc.suitalk.tools:module-api-ag-extension:0.1.5'
2825
}
2926
}
3027
```
3128

3229
在使用ModuleApi的module的build.gradle中添加依赖和配置
3330

34-
```gralde
35-
apply plugin: 'module-api-ag-extension'
36-
apply plugin: 'arbitrarygen'
31+
```groovy
32+
apply plugin: 'module-api'
3733
3834
dependencies {
39-
compile 'cc.suitalk.android:module-api:0.1.0'
40-
...
35+
compile 'cc.suitalk.android:module-api:0.1.5'
4136
}
4237
43-
arbitraryGen {
44-
templateDir "${project.rootDir.getAbsolutePath()}/ag-template"
45-
srcDir "${project.projectDir.absolutePath}/ag-datasrc"
46-
destDir "$buildDir/generated/source/ag-gen"
47-
48-
ext {
49-
moduleApi {
50-
// 配置扫描api目录
51-
srcDir "${project.projectDir.absolutePath}/src/main/java"
52-
// 配置生成api的目标目录
53-
destDir "${project.rootProject.projectDir.absolutePath}/api/build/generated/source/ag-gen"
54-
}
55-
}
38+
moduleApi {
39+
// 配置扫描api目录
40+
srcDir "${project.projectDir.absolutePath}/src/main/api"
41+
// 配置生成api的目标目录
42+
destDir "${project.rootProject.projectDir.absolutePath}/api/src/main/api"
43+
44+
makeApiRules "${project.projectDir.absolutePath}/src/main/api/*.java"
5645
}
5746
```
5847
## 定义api
@@ -117,6 +106,15 @@ ModuleApi.set(ModuleBModelApi.class, new ModuleBModel());
117106
```java
118107
ModuleApi.get(ModuleBModelApi.class).showToast(ModuleBModelApi.STYLE_RED, "Test from ModuleFirst.");
119108
```
109+
## 代码混淆
110+
111+
如果你使用到自动装配功能,则需要添加proguard规则
112+
```proguard
113+
114+
# Keep ModuleApi Autowire class
115+
-keep,allowobfuscation @interface cc.suitalk.moduleapi.extension.annotation.Autowire
116+
-keep @cc.suitalk.moduleapi.extension.annotation.Autowire class *
117+
```
120118

121119
## License
122120

config.gradle

+5-5
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
ext {
2020
buildConfig = [
21-
debug : true,
21+
debug : false,
2222
minSdkVersion : 15,
2323
targetSdkVersion : 25,
2424
versionCode : 1,
@@ -28,7 +28,7 @@ ext {
2828
]
2929

3030
bintrayConfig = [
31-
version : '0.1.4',
31+
version : '0.1.5',
3232
siteUrl : 'https://github.com/AlbieLiang/ModuleApi', // 项目的主页
3333
gitUrl : 'https://github.com/AlbieLiang/ModuleApi.git', // Git仓库的url
3434
licenseName : 'The Apache Software License, Version 2.0',
@@ -39,8 +39,8 @@ ext {
3939
]
4040

4141
libsDependencies = [
42-
arbitrarygen : 'cc.suitalk.tools:arbitrarygen:2.1.2',
43-
arbitrarygenSdk : 'cc.suitalk.tools:arbitrarygen-sdk:2.1.2',
44-
agGradlePlugin : 'cc.suitalk.tools:arbitrarygen-plugin:2.1.2',
42+
arbitrarygen : 'cc.suitalk.tools:arbitrarygen:2.1.5',
43+
arbitrarygenSdk : 'cc.suitalk.tools:arbitrarygen-sdk:2.1.5',
44+
agGradlePlugin : 'cc.suitalk.tools:arbitrarygen-plugin:2.1.5',
4545
]
4646
}

module-api-ag-extension/src/main/resources/res/ag-template/ModuleApi.ag-template

+4
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ if (methodSet) {
5151
}%>
5252
package <%=fileObject._package%>;
5353

54+
import cc.suitalk.moduleapi.extension.annotation.InjectClass;
5455
import cc.suitalk.moduleapi.extension.Api;
5556
<% var importedSet = [];
5657
var shouldImportSet = [];
@@ -87,6 +88,9 @@ import <%=_import%>;
8788
*
8889
* Auto-Generate from the source class : <%=fileObject._package + "."+ _class._name%>
8990
*/
91+
<%if (_class._annotation && _class._annotation.Autowire) {%>
92+
@InjectClass("<%=fileObject._package + "."+ _class._name%>")<%
93+
}%>
9094
public interface <%=_class._name%>Api extends Api {
9195
<%for (var i = 0; i < fieldList.length; i++) {
9296
var field = fieldList[i];%>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package cc.suitalk.moduleapi.extension.annotation;
2+
3+
import java.lang.annotation.Documented;
4+
import java.lang.annotation.ElementType;
5+
import java.lang.annotation.Retention;
6+
import java.lang.annotation.RetentionPolicy;
7+
import java.lang.annotation.Target;
8+
9+
/**
10+
* Created by albieliang on 2018/6/26.
11+
*/
12+
13+
@Documented
14+
@Target(ElementType.TYPE)
15+
@Retention(RetentionPolicy.RUNTIME)
16+
public @interface Autowire {
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package cc.suitalk.moduleapi.extension.annotation;
2+
3+
import java.lang.annotation.Documented;
4+
import java.lang.annotation.ElementType;
5+
import java.lang.annotation.Retention;
6+
import java.lang.annotation.RetentionPolicy;
7+
import java.lang.annotation.Target;
8+
9+
/**
10+
* Created by albieliang on 2018/6/26.
11+
*/
12+
13+
@Documented
14+
@Target(ElementType.TYPE)
15+
@Retention(RetentionPolicy.RUNTIME)
16+
public @interface InjectClass {
17+
String value();
18+
}

module-api/src/main/java/cc/suitalk/moduleapi/ModuleApi.java

+8
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import cc.suitalk.moduleapi.extension.Api;
1212
import cc.suitalk.moduleapi.extension.annotation.DummyWhenNull;
13+
import cc.suitalk.moduleapi.extension.annotation.InjectClass;
1314

1415
/**
1516
* Created by albieliang on 2018/2/6.
@@ -24,6 +25,13 @@ public class ModuleApi {
2425
public static <T extends Api> T get(@NonNull Class<T> tClass) {
2526
Assert.assertNotNull(tClass);
2627
Object o = sMap.get(tClass);
28+
InjectClass injectClass = null;
29+
if (o == null && (injectClass = tClass.getAnnotation(InjectClass.class)) != null) {
30+
o = ReflectUtils.newInstance(injectClass.value());
31+
if (o != null) {
32+
set(tClass, o);
33+
}
34+
}
2735
if (o == null && tClass.getAnnotation(DummyWhenNull.class) != null) {
2836
return DummyObject.newInstance(tClass);
2937
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package cc.suitalk.moduleapi;
2+
3+
import android.util.Log;
4+
5+
/**
6+
* Created by albieliang on 2016/3/28.
7+
*/
8+
9+
class ReflectUtils {
10+
11+
private static final String TAG = "Api.ReflectUtils";
12+
13+
public static<T> T newInstance(String classStr) {
14+
if (classStr != null && classStr.length() > 0) {
15+
try {
16+
Class<?> c = Class.forName(classStr);
17+
return (T) c.newInstance();
18+
} catch (ClassNotFoundException e) {
19+
Log.e(TAG, "reflect error : " + e.getMessage());
20+
} catch (IllegalAccessException e) {
21+
Log.e(TAG, "reflect error : " + e.getMessage());
22+
} catch (InstantiationException e) {
23+
Log.e(TAG, "reflect error : " + e.getMessage());
24+
}
25+
}
26+
return null;
27+
}
28+
}

0 commit comments

Comments
 (0)