android 工程内网命令行构建

96
飛飛萨
2017.10.23 16:38* 字数 908
想法:

在内网环境下使用命令行构建 android studio 的工程

内网机环境:
  • windows 7
  • 可以通过特殊渠道从外网道拷贝文件进来
  • 已经安装了 android studio
  • 无法连接到 Internet
步骤1:

进入 cmd,cd 到指定 android 工程下,执行 gradlew build,因为不连外网,所以在执行 gradlew build 命令的时候会出现(假设工程使用的是 3.3 版本的 gradle):

Downloading https://services.gradle.org/distributions/gradle-3.3-all.zip

这是因为 gradle wrapper 为了保证在不同环境下构建都使用统一版本的 gradle,所以它会去下载工程 gradle-wrapper.properties 文件中 distributionUrl 键值所指定的 gradle 版本。
但现在机器处于内网环境,自然是无法下载的,下面是关于 gradle wrapper 的一些说明:

gradle wrapper 结构:

工程
    —— gradle
        —— wrapper
            —— gradle-wrapper.jar (Wrapper JAR文件)
            —— gradle-wrapper.properties (Wrapper属性文件)
    —— gradlew  (Unix Shell 脚本)
    —— gradlew.bat (Windows批处理文件)

wrapper.properties文件示例:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip

说明:
默认情况下,gradle-3.3-all.zip 文件的下载位置是 $USER_HOME/.gradle/wrapper/dists,以我的机器为例,对应目录就是:
C:\Users\Administrator.gradle\wrapper\dists\gradle-3.3-all\55gk2rcmfc6p2dg9u9ohc3hw9\

步骤2:

找一台外网机器,去 https://services.gradle.org/distributions/ 下载一个 gradle-3.3-all.zip(ps:如果本地有对应版本的 gradle 目录,也可以现压一个 zip 包,名字改成一样就行),把这个压缩文件放置到C:\Users\Administrator.gradle\wrapper\dists\gradle-3.3-all\55gk2rcmfc6p2dg9u9ohc3hw9\下,
再执行 gradlew build 命令,如果你的机器在外网则 gradlew 会自动去下载一大坨编译所需要的支持包:

……
Download https://jcenter.bintray.com/com/android/tools/build/gradle/2.3.1/gradle-2.3.1.pom
Download https://jcenter.bintray.com/com/android/tools/build/gradle-core/2.3.1/gradle-core-2.3.1.pom
Download https://jcenter.bintray.com/com/android/tools/build/builder/2.3.1/builder-2.3.1.pom
Download https://jcenter.bintray.com/com/android/tools/lint/lint/25.3.1/lint-25.3.1.pom
……
Download https://jcenter.bintray.com/com/android/tools/build/gradle/2.3.1/gradle-2.3.1.jar
Download https://jcenter.bintray.com/com/android/tools/build/gradle-core/2.3.1/gradle-core-2.3.1.jar
Download https://jcenter.bintray.com/com/android/tools/build/builder/2.3.1/builder-2.3.1.jar
Download https://jcenter.bintray.com/com/android/tools/lint/lint/25.3.1/lint-25.3.1.jar
……

但是我们现在是在内网,无法在线完成下载。
经过分析发现,这些东东都是下载到 $USER_HOME/.gradle/caches 目录下的。
再去找刚才那台外网机,找到 $USER_HOME/.gradle/caches 目录,把里面的内容整个复制到内网机的的对应目录。

请注意: 外网机的 $USER_HOME 一定要和内网机的 $USER_HOME 的路径名是一样的,否则还是会找不到已经下载的 jar 文件,出现下面这样的 error:

> Could not resolve all files for configuration ':classpath'.
   > Could not download gradle.jar (com.android.tools.build:gradle:2.3.1)
      > Could not get resource 'https://jcenter.bintray.com/com/android/tools/build/gradle/2.3.1/gradle-2.3.1.jar'.
         > Could not HEAD 'https://jcenter.bintray.com/com/android/tools/build/gradle/2.3.1/gradle-2.3.1.jar'.
            > jcenter.bintray.com
……

继续执行 gradlew build 可能会遇到这样的问题(52代表的是 jdk8) :

> java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0

此问题原因是:低版本的 jre 去运行高版本编译的 class 文件
解决方法:使用高版本的 jdk 去编译工程即可,我机器原先安装的是 jdk7 的版本,现在重新安装 jdk-8u65-windows-x64.exe,安装完毕后别忘记配置环境变量(不再赘述)

步骤3:

继续执行 gradlew build 命令,在一大坨输出之后,终于成功了!


大工程可能遇到的问题:

如果工程比较大,可能会遇到:

daemon will be stopped at the end of the build after running out of jvm memory
expiring daemon because jvm tenured space is exhausted

这个问题应该是 jvm 默认可分配的堆内存不够了,查了网上,有说在工程 gradlew.bat 脚本中修改
set DEFAULT_JVM_OPTS="-Xmx512m"
或添加
set GRADLE_OPTS="$GRADLE_OPTS -Xmx512m"
(512 是 jvm 允许分配的堆内存,可以更大,我机器设到 4096 才编过的)
但亲测下来并没有解决问题,
还有种方法就是在 gradle.properties 文件中添加:

org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=512m

gradle.property 可以是只针对项目的,其路径在工程目录下;也可以是针对全局的,其路径是在 $USER_HOME/.gradle 下(如文件不存在,可自行新建)。 这个方法测试可行!

ps:以上内容均为简单的使用,以后如遇具体问题当及时补充

Android
Web note ad 1