【发布时间】:2017-09-05 13:33:57
【问题描述】:
我有一个由两个模块组成的 Android 项目:一个“SDK”和一个“演示 Android 应用”。
目前,SDK 位于/path/to/work/dir/sdk,应用位于/path/to/work/dir/demo-app。开发人员在 Android Studio 中打开“/path/to/work/dir/demo-app”,可以同时查看和编辑两个模块的源代码。
我们还有另一个 Android 应用,但它包含作为已编译 .aar 文件的 SDK,它无法查看或编辑“实时”源,只有反编译/调试符号的源,如果这有意义吗?
TL;DR 我想将 SDK 制作成一个纯 Java 库,以便它可以在非 Android 应用程序中使用,但仍然可以在 Android Studio 中完全编辑它作为一部分演示应用程序“项目”。我该怎么做?
详情
SDK详情
SDK 的工作是控制套接字另一端的一些硬件设备。它几乎完全是纯 Java,但偶尔会用到 Android 库:
android.util.Log,在类中关联TAG常量,以及运行时检查以禁用日志消息 (BuildConfig.DEBUG)-
静态分析注解:
-
@Nullable,@AnyThread,@NonNull,@Nullable,@UiThread,@WorkerThread,@IntRange,@Size,@SuppressLint
-
-
偶然使用缺少 Java stdlib 的库:
android.text.TextUtilsandroid.support.v4.util.Pair
它的测试套件都是“测试”。有一个无用的“androidTest”,可以直接删除。
-
Gradle 构建环境仍然是为 Android 量身定制的 目录结构。即 repo 目录如下所示:
/path/to/work/dir/sdk ├───.git │ └───...etc... ├───.gradle │ └───...etc... ├───app │ ├───app.iml │ ├───Mobile-SDK-Android.iml │ ├───proguard-rules.pro │ ├───build │ │ ├───generated │ │ │ └───...etc... │ │ ├───intermediates │ │ │ └───...etc... │ │ ├───outputs │ │ │ └───aar │ │ └───tmp │ │ ├─... │ ├───docs │ ├───libs │ └───src │ ├───androidTest │ │ └───java │ │ └───com │ │ └───...etc... │ ├───main │ │ ├───java │ │ │ └───com │ │ │ └───...etc... │ │ └───res │ │ └───values │ │ └───strings.xml │ └───test │ ├───java │ │ └───com │ │ └───...etc... │ └───resources ├───build │ ├───android-profile │ ├───generated │ └───intermediates └───gradle └───wrapper和
build.gradle如下:apply plugin: 'com.android.library' android { compileSdkVersion 25 buildToolsVersion '25.0.2' defaultConfig { minSdkVersion 16 targetSdkVersion 25 versionCode 1 versionName "0.7" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { debuggable false } } packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/NOTICE' exclude 'META-INF/ASL2.0' } productFlavors { } publishNonDefault true } repositories { ... etc ... } dependencies { // For @Nullable/@NonNull compile 'com.android.support:support-annotations:25.3.1' testCompile 'junit:junit:4.12' ... etc ... } -
“发布构建”说明包含以下内容:
$ ./gradlew check $ ./gradlew assembleRelease # Then copies and packages app/build/outputs/aar/app-release.aar
应用详情
“Android 应用”模块似乎是普通的 Android 应用,例如它使用 Activity 类和 Android 库,Android Studio 可以很好地将其部署到设备上。有这些 gradle 脚本:
/path/to/work/dir/demo-app/build.gradle (Project: Demo-App)
/path/to/work/dir/demo-app/settings.gradle (Project Settings)
/path/to/work/dir/demo-app/app/build.gradle (Module: app)
settings.gradle
全部内容:
include ':app', ':Mobile-SDK-Android'
project(':Mobile-SDK-Android').projectDir = new File('/path/to/work/dir/sdk/app')
build.gradle
不包含任何我可以看到的相关内容?
app/build.gradle
包含这些相关位:
apply plugin: 'com.android.application'
android {
... etc
}
dependencies {
compile project(path: ':Mobile-SDK-Android', configuration: 'debug')
... etc
}
需要更改吗?
什么是将 SDK 转换为“正常”和惯用的 Java 库的适当步骤序列?
例如:
- 将
android.util.Log的所有用法转换为使用例如SLF4J - 将所有注释转换为???
- 重新实现或使用
TextUtils和Pair的替代方案? - 对 gradle 脚本执行一些魔法
- 所以输出是 .jar 而不是 .aar
- 并且不称为 app-release.aar
- 还有
minSdkVersion之类的东西吗? - 这个 jar 文件是否可以具有“android 风格”,以防我们将来需要将 android 特定代码放入 SDK 中?
- 所以输出是 .jar 而不是 .aar
- 可能重新构建 SDK 的目录以删除“app”目录?
- ????
n.利润
【问题讨论】:
标签: java android gradle jar android-gradle-plugin