我需要提供一个Android软件开发环境(SDE),用于基于Android Studio(AS)和gradle的android编码培训。
我梦想着一个完全自给自足、自给自足的 SDE。
目录结构如下所示:
<Root-folder>
|- Android Studio
|- android-sdk
|- gradle-2.2.1
|- jdk1.7.0_75_64
|- jdk1.7.0_75_32
|- localM2repo
|- <git-project checkout>
|- Android project 01 (with checked-in AS metadata)
|- Android project 02 (with checked-in AS metadata)
此 SDE 会附带您需要的所有方面。它将完全离线兼容,即您可以跳上火车并编写数小时的代码,而无需连接到互联网。
我编写了一些脚本,除一件事外一切正常:
虽然我似乎可以使用所有依赖项脱机,正如我将在下面描述的那样,但我无法针对我的“脱机”本地 maven 存储库 (folder=localM2repo) 运行 Android Studio。
请记住:根本没有涉及 maven 软件,gradle 只是使用由
解决的 maven 存储库结构repositories {
maven { url 'file:///<Root-folder>localM2repo' }
}
代替
repositories {
jcenter()
mavenLocal()
maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
}
我的 Android 应用依赖项通常如下所示:
compile "com.android.support:appcompat-v7:$comAndroidSupport_supportV7Version"
compile "com.android.support:support-v4:$comAndroidSupport_supportV4Version"
compile "com.github.machinarius:preferencefragment:$comGithubMachinarius_preferenceFragmentVersion"
compile "com.google.android.gms:play-services:$comGoogleAndroidGms_playServicesVersion"
compile 'com.android.tools.build:gradle:1.0.1'
compile 'com.github.jcandksolutions.gradle:android-unit-test:2.1.1'
testCompile "junit:junit:$junitVersion"
testCompile "org.robolectric:robolectric:$orgRobolectricRobolectricVersion"
testCompile "org.mockito:mockito-core:$orgMockitoMockitoCoreVersion"
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0'
androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.0'
另外我还有一些构建脚本依赖项。
什么起作用
我可以使用所有显式依赖项“下线”。以下代码 fragment 将所有 testCompile 依赖项提取到我的本地 maven 存储库中。我可以对其他范围(androidTestCompile、编译……)做同样的事情
task makeLocalM2Repob(dependsOn: makeLocalM2Repoa, type: Copy) {
destinationDir = buildDir
into('localM2repo') {
def fileRenameMap = [:];
from configurations.testCompile.resolvedConfiguration.resolvedArtifacts.collect { dependency ->
def groupAsPath = dependency.moduleVersion.id.group.replace('.' as char, File.separatorChar)
def version = dependency.moduleVersion.id.version
def newFileName = "${groupAsPath}/${dependency.name}/${version}/${dependency.name}-${version}.${dependency.type}"
fileRenameMap[dependency.file.name] = newFileName
dependency.file
}
rename { oldName -> fileRenameMap[oldName] }
}
}
什么不起作用
尽管在我看来所有依赖项在浸出后都可用,但我在 AS 中启动项目时收到以下错误:
Gradle project sync failed. ...
Error:Unable to load class 'com.android.utils.ILogger'.
Possible causes for this unexpected error include:<ul><li>You are using JDK version 'java version "1.7.0_75"'. Some versions of JDK 1.7 (e.g. 1.7.0_10) may cause class loading errors in Gradle.
Please update to a newer version (e.g. 1.7.0_67).
...
我得到这个错误,即使我
- 删除 ~/.gradle/caches
- 删除/Android studio/gradle/*
- 点击 Android Studio 的文件/使缓存无效
- 我完全确信 Android Studio 引用了正确的 JDK、Android-SDK 和 gralde 安装路径。
这个错误让我想起了this bug here
问题
- 我还需要学习什么才能获得完全离线兼容的 maven 可以通过 gradle 处理以与 Android 一起工作的存储库 工作室?
- 我是否需要添加更多的隐式依赖项?
- 我还可以使什么无效以使 AS 按我的意愿运行?
- Android Studio 不应该以这种方式工作吗?
最佳答案
错误消息表明您的 Java 环境已过时。尝试在 Java SE Downloads 上下载一个新的.
不过据我所知current Android Studio release支持离线构建,随附本地 Gradle 分发版和构建工具的本地 Maven 存储库。
因此我很关心如何将它们集成到 IntelliJ IDEA 中,因为一些 Ultimate 功能非常有用。如果您或其他任何人找到它,请不要忘记告诉我。谢谢
关于android - 如何离线使用所有 Android gradle 依赖项(maven 文件结构),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28327694/