android - 如何将 libs/*.jar 、依赖库和我的 java/kotlin 代码文件编译到库模块中的 dex 中?
问题描述
我想将libs/*.jar、依赖库和我的java/kt代码文件编译成库模块中的dex,然后android app可以下载这些dex文件,然后通过DexClassLoader动态加载它们。
Android Studio提供了一个Gradle任务“dexRelease”将我自己的代码文件编译成dex文件,但是无法将libs/*.jar和依赖库编译成dex文件。
gradlew testsdk:dexRelease
我希望将 libs/*.jar、依赖库和我的 java/kt 代码文件编译到库模块中的 dex 中。
解决方案
我不熟悉直接在库模块上实现您的要求的方法。
作为一种解决方法,您可以:
- 在库(即使用com.android.library插件构建)模块中编写代码。
- 添加一个应用程序模块(即,使用com.android.application插件构建,除了库模块之外没有任何源或依赖项),它将作为库的包装器。
- 构建项目,并使用其生成的 dex 文件。
我创建了一个示例项目来说明这一点。项目结构如下(我省略了不相关的文件):
├── app
│ ├── build.gradle
│ └── src
│ └── main
│ └── AndroidManifest.xml
└── testsdk
├── build.gradle
└── src
└── main
├── AndroidManifest.xml
└── java
└── info
└── osom
└── testsdk
└── TestClass.java
testsdk是一个库模块,app是一个库包装器模块。TestClass.java
是一个示例源文件,类似于您的库模块中包含的源文件。
这两个AndroidManifest.xml
文件都包含最基本的功能,即app/src/main/AndroidManifest.xml
内容是:
<manifest package="info.osom.q57441198"/>
testsdk的build.gradle
文件包含一个示例依赖项,只是为了模拟您的库的依赖项。
apply plugin: 'com.android.library'
android {
compileSdkVersion 28
}
dependencies {
implementation 'com.jakewharton.timber:timber:4.7.1'
}
Wrapper 的 ( app ) 模块build.gradle
文件添加了对库模块的依赖:
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
minSdkVersion 21
}
}
dependencies {
implementation project(':testsdk')
}
使用: 构建项目
$ ./gradlew clean assembleRelease
,然后在app/build/intermediates/dex/release/mergeDexRelease/out/classes.dex
.
您可以使用baksmali来验证您的所有库源和库的依赖项都捆绑在 dex 中:
$ baksmali classes.dex
$ tree out
out
├── info
│ └── osom
│ ├── q57441198
│ │ ├── BuildConfig.smali
│ │ └── R.smali
│ └── testsdk
│ ├── BuildConfig.smali
│ ├── R.smali
│ └── TestClass.smali
├── org
│ ├── intellij
│ │ └── lang
│ │ └── annotations
│ │ ├── Flow.smali
│ │ ├── // redacted...
│ │ └── Subst.smali
│ └── jetbrains
│ └── annotations
│ ├── Async$Execute.smali
│ ├── // redacted...
│ └── TestOnly.smali
└── timber
└── log
├── R.smali
├── Timber$1.smali
├── Timber$DebugTree.smali
├── Timber$Tree.smali
└── Timber.smali
包装器 ( app ) 模块添加到 dex 文件的唯一开销是以下两个类:info/osom/q57441198/BuildConfig.smali
和info/osom/q57441198/R.smali
. 你可以简单地忽略它们。如果您坚持删除它们,有一些工具可以帮助您。
推荐阅读
- python - 如何在 Python 中矢量化代码以解决散热问题?
- python - 如何根据python中的某个种子生成具有重复项的数字列表
- dataframe - 如何向包含均值和计数等聚合的 Spark DataFrame 添加列?
- javascript - 什么是 JavaScript 变量“空”
- android - 为什么应用栏将视图寻呼机向下推
- oauth - 如何从 Aqueduct 服务器获取刷新令牌
- git - 用ssh键远程推送但报错
- post - 如何修复 Rust Rocket 框架中 POST 请求中的解析错误
- javascript - 使用 Javascript 启动 Jenkins 作业
- ios - NSSet containsObject 错误结果