当前位置:   article > 正文

Android Studio 搭建离线开发环境_androidstudio离线配置环境

androidstudio离线配置环境

目录

概述

一、环境

二、步骤

1、准备

2、安装

3、借助外网

4、生成本地依赖的jar

5、修改项目下的build.gradle文件

6、完结

概述

首先非常感谢博主:
https://blog.csdn.net/tiny_cao/article/details/118386544

现将搭建Android Studio 搭建离线开发环境方法步骤做个总结:

一、环境

  1. android studio 3.5.2
  2. sdk platform 
  3. jdk 1.8
  4. offline-gmaven-stable.zip

二、步骤


1、准备


a、 Android Studio 3.5.2安装包
b、Android SDK压缩包
c、.gradle 压缩包:外网环境下生成的C:/users[username]/.gradle下的文件压缩备内网使用
d、offline-gmaven-stable.zip(离线包管理工具):在AS下载页面找到"Offline components" 下载 “Google Maven dependencies”

2、安装

  • 安装 Android Studio,以下称为AS

  • 将Android SDK压缩包解压到任意方便的位置,然后配置到AS中

  • 把在线环境安装测试好 的 .gradle 压缩包,复制到离线环境,然后解压.gradle压缩包并拷贝或覆盖到 C:\users[username]\ 下,覆盖离线环境的 .gradle 

  • 在%USER_HOME%/.gradle下新建init.d/offline.gradle文件(如果没有文件则新建命名为init.d的文件夹,再在里面新建offline.gradle),offline.gradle文件里写以下代码:

  1. def reposDir = new File(System.properties['user.home'], ".android/manual-offline-m2")
  2. def repos = new ArrayList()
  3. reposDir.eachDir {repos.add(it) }
  4. repos.sort()
  5. allprojects {
  6.   buildscript {
  7.     repositories {
  8.       for (repo in repos) {
  9.         maven {
  10.           name = "injected_offline_${repo.name}"
  11.           url = repo.toURI().toURL()
  12.         }
  13.       }
  14.     }
  15.   }
  16.   repositories {
  17.     for (repo in repos) {
  18.       maven {
  19.         name = "injected_offline_${repo.name}"
  20.         url = repo.toURI().toURL()
  21.       }
  22.     }
  23.   }
  24. }
  • 将offline-gmaven-stable.zip解压到 %USER_HOME%/.android/manual-offline-m2/下,manual-offline-m2这个文件如果没有自行创建

3、借助外网


在外网环境下,搭建一个简单的demo,然后把内网项目中的所用到的依赖都加到build.gradle中,然后sync,最后运行项目(主要为了下载一些jar文件)

1、将下载下来的jar,即%USER_HOME%/.gradle/caches/modules-2/files-2.1中的文件,压缩,传递给内网使用

2、解压缩合并到内网中%USER_HOME%/.gradle/caches/modules-2/files-2.1中


到这里,将项目导入到AS中,编译发现根本找不到依赖,接下来非常重要的一步

4、生成本地依赖的jar


在sdk的extras下创建m2repository文件夹,然后将%USER_HOME%/.gradle/caches/modules-2/files-2.1,全部copy到里面,然后运行下面的Java测试代码生成可认识的依赖(缓存中的文件比如:androidx.recyclerview,需要变为androidx/recyclerview)

 

  1. public class CopyTool {
  2.     // 我的sdk的目录在e盘下,这里可根据自己的位置修改
  3.     static String path = "E:\\android\\AndroidSDK\\Sdk\\extras\\m2repository"
  4.     static String stopName = "m2repository";
  5.     public static void main(String[] args) {
  6.         System.out.println("Begin to copy");
  7.         processDotForld();
  8.         copyToLastForld();
  9.         System.out.println("Copy finished");
  10.     }
  11.     /**
  12.      * 处理文件夹中带点好的。;例如:D:/test/com.ifind.android/
  13.      */
  14.     public static void processDotForld() {
  15.         File file = new File(path);
  16.         if (file.exists()) {
  17.             LinkedList<File> list = new LinkedList<>();
  18.             File[] files = file.listFiles();
  19.             for (int i = 0; i < files.length; i++) {
  20.                 File file2 = files[i];
  21.                 if (file2.isDirectory()) {
  22.                     //文件夹
  23.                     File desFile = creatforld(file2);
  24.                     copyFileToDes(file2, desFile);
  25.                 } else {
  26.                     //文件//目前不存在
  27.                 }
  28.             }
  29.         }
  30.     }
  31.     /**
  32.      * 文件夹拷贝
  33.      *
  34.      * @param source
  35.      * @param des
  36.      */
  37.     public static void copyFileToDes(File source, File des) {
  38.         try {
  39.             copyDir(source.getPath(), des.getPath());
  40.         } catch (Exception e) {
  41.             // TODO: handle exception
  42.         }
  43.     }
  44.     /**
  45.      * 文件夹拷贝
  46.      *
  47.      * @param sourcePath
  48.      * @param newPath
  49.      * @throws IOException
  50.      */
  51.     public static void copyDir(String sourcePath, String newPath) throws IOException {
  52.         File file = new File(sourcePath);
  53.         String[] filePath = file.list();
  54.         if (!(new File(newPath)).exists()) {
  55.             (new File(newPath)).mkdir();
  56.         }
  57.         for (int i = 0; i < filePath.length; i++) {
  58.             if ((new File(sourcePath + file.separator + filePath[i])).isDirectory()) {
  59.                 copyDir(sourcePath + file.separator + filePath[i], newPath + file.separator + filePath[i]);
  60.             }
  61.             if (new File(sourcePath + file.separator + filePath[i]).isFile()) {
  62.                 copyFile(sourcePath + file.separator + filePath[i], newPath + file.separator + filePath[i]);
  63.             }
  64.         }
  65.     }
  66.     public static void copyFile(String oldPath, String newPath) throws IOException {
  67.         File oldFile = new File(oldPath);
  68.         File file = new File(newPath);
  69.         FileInputStream in = new FileInputStream(oldFile);
  70.         FileOutputStream out = new FileOutputStream(file);
  71.         byte[] buffer = new byte[2097152];
  72.         //while((in.read(buffer)) != -1){
  73.         //  out.write(buffer);
  74.         //}
  75.         DataInputStream dis = new DataInputStream(new BufferedInputStream(in));
  76.         DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(out));
  77.         int length;
  78.         while ((length = dis.read(buffer)) != -1) {
  79.             dos.write(buffer, 0, length);
  80.         }
  81.         dos.flush();
  82.         dos.close();
  83.         dis.close();
  84.     }
  85.     /**
  86.      * 创建文件夹
  87.      *
  88.      * @param file
  89.      */
  90.     public static File creatforld(File file) {
  91.         String path = file.getAbsolutePath();
  92.         if (path != null) {
  93.             String temp = "files-2.1";
  94.             temp = stopName;
  95.             String temS[] = path.split(temp);
  96.             if (temS != null && temS.length == 2) {
  97.                 String firstName = temS[0];
  98.                 String dotName = temS[1];
  99.                 if (dotName != null) {
  100.                     String[] lasts = dotName.split("\\.");
  101.                     int count = lasts.length;
  102.                     if (count < 2) {
  103.                         return null;
  104.                     }
  105.                     String pathNew = firstName + temp;
  106.                     for (int i = 0; i < count; i++) {
  107.                         if (i == 0) {
  108.                             pathNew = pathNew + lasts[i];
  109.                         } else {
  110.                             pathNew = pathNew + "\\" + lasts[i];
  111.                         }
  112.                     }
  113.                     if (pathNew != null && !pathNew.equals("")) {
  114.                         File fileForld = new File(pathNew);
  115.                         if (!fileForld.exists()) {
  116.                             fileForld.mkdirs();
  117.                         }
  118.                         return fileForld;
  119.                     }
  120.                 }
  121.             }
  122.         }
  123.         return null;
  124.     }
  125.     public static ArrayList<File> getFile(File file) {
  126.         ArrayList<File> list = new ArrayList<>();
  127.         if (file.isDirectory()) {
  128.             File[] filesTemp = file.listFiles();
  129.             for (int i = 0; i < filesTemp.length; i++) {
  130.                 ArrayList<File> result = getFile(filesTemp[i]);
  131.                 list.addAll(result);
  132.             }
  133.         } else {
  134.             list.add(file);
  135.         }
  136.         return list;
  137.     }
  138.     // 创建目录
  139.     public static boolean createDir(String destDirName) {
  140.         File dir = new File(destDirName);
  141.         if (dir.exists()) {// 判断目录是否存在
  142.             System.out.println("创建目录失败,目标目录已存在!");
  143.             return false;
  144.         }
  145.         if (!destDirName.endsWith(File.separator)) {// 结尾是否以"/"结束
  146.             destDirName = destDirName + File.separator;
  147.         }
  148.         if (dir.mkdirs()) {// 创建目标目录
  149.             System.out.println("创建目录成功!" + destDirName);
  150.             return true;
  151.         } else {
  152.             System.out.println("创建目录失败!");
  153.             return false;
  154.         }
  155.     }
  156.     public static void copyToLastForld() {
  157.         File file = new File(path);
  158.         if (file.exists()) {
  159.             LinkedList<File> list = new LinkedList<>();
  160.             File[] files = file.listFiles();
  161.             for (int i = 0; i < files.length; i++) {
  162.                 File file2 = files[i];
  163.                 if (file2.isDirectory()) {
  164.                     //文件夹
  165.                     proceessForld(file2);
  166.                 } else {
  167.                     //文件//目前不存在
  168.                 }
  169.             }
  170.         }
  171.     }
  172.     private static void proceessForld(File file) {
  173.         File[] files = file.listFiles();
  174.         for (int i = 0; i < files.length; i++) {
  175.             File file2 = files[i];
  176.             if (file2.isDirectory()) {
  177.                 //文件夹
  178.                 proceessForld(file2);
  179.             } else {
  180.                 //文件//目前不存在//判断是否进行拷贝
  181.                 try {
  182.                     proceessFile(file2);
  183.                 } catch (FileNotFoundException e) {
  184.                     // TODO Auto-generated catch block
  185.                     e.printStackTrace();
  186.                 }
  187.             }
  188.         }
  189.     }
  190.     private static void proceessFile(File file) throws FileNotFoundException {
  191.         if (file != null) {
  192.             String path = file.getAbsolutePath();
  193.             if (path != null) {
  194.                 String[] lasts = splitString(path);
  195.                 if (lasts != null && lasts.length > 0) {
  196.                     int count = lasts.length;
  197.                     String last = lasts[count - 1];
  198.                     String last2 = lasts[count - 2];
  199.                     if (last2 != null && last2.length() > 20) {
  200.                         //拷贝到上一级目录
  201.                         String des = null;
  202.                         if (count < 2) {
  203.                             return;
  204.                         }
  205.                         for (int i = 0; i < count - 2; i++) {
  206.                             if (i == 0) {
  207.                                 des = lasts[i];
  208.                             } else {
  209.                                 des = des + "\\\\" + lasts[i];
  210.                             }
  211.                         }
  212.                         des = des + "\\\\" + last;
  213.                         String strParentDirectory = file.getParent();
  214.                         File parentFile = new File(strParentDirectory);
  215.                         strParentDirectory = parentFile.getParent() + "\\" + last;
  216.                         copy(file, path, strParentDirectory);
  217.                     } else {
  218.                         // System.out.println("source = "+path);
  219.                     }
  220.                     // System.out.println("source = "+path);
  221.                     // System.out.println("des = "+des);
  222.                 }
  223.             }
  224.         }
  225.     }
  226.     private static String[] splitString(String path) {
  227.         String[] lasts = null;
  228.         lasts = path.split("\\\\");
  229.         int count = lasts.length;
  230.         boolean isFirst = true;
  231.         for (int i = 0; i < count; i++) {
  232.             String str = lasts[i];
  233.             if (str != null && str.contains(".")) {
  234.                 if (isFirst) {
  235.                     isFirst = false;
  236.                     System.out.println("\n\n\n\n");
  237.                     System.out.println("path=" + path + "");
  238.                 }
  239.                 System.out.println("str=" + str + "");
  240.             }
  241.         }
  242.         return lasts;
  243.     }
  244.     /**
  245.      * copy动作
  246.      *
  247.      * @param file
  248.      * @param source
  249.      * @param des
  250.      * @throws FileNotFoundException
  251.      */
  252.     private static void copy(File file, String source, String des) throws FileNotFoundException {
  253.         if (file != null) {
  254.             FileInputStream fis = null;
  255.             FileOutputStream fot = null;
  256.             byte[] bytes = new byte[1024];
  257.             int temp = 0;
  258.             File desFile = new File(des);
  259.             if (desFile.exists()) {
  260.                 return;
  261.             }
  262.             try {
  263.                 fis = new FileInputStream(file);
  264.                 fot = new FileOutputStream(desFile);
  265.                 while ((temp = fis.read(bytes)) != -1) {
  266.                     fot.write(bytes, 0, temp);
  267.                     fot.flush();
  268.                 }
  269.             } catch (IOException e) {
  270.                 e.printStackTrace();
  271.             } finally {
  272.                 if (fis != null) {
  273.                     try {
  274.                         fis.close();
  275.                     } catch (IOException e) {
  276.                         e.printStackTrace();
  277.                     }
  278.                 }
  279.                 if (fot != null) {
  280.                     try {
  281.                         fot.close();
  282.                     } catch (IOException e) {
  283.                         e.printStackTrace();
  284.                     }
  285.                 }
  286.             }
  287.         }
  288.     }
  289.     private static String getContent(String content) {
  290.         String str = content;
  291.         if (content != null && content.length() > 4) {
  292.             str = content.substring(0, 4);
  293.         }
  294.         return str;
  295.     }
  296. }

5、修改项目下的build.gradle文件

在buildscirp和allprojects中添加maven依赖:

  1. maven { url ‘file://E:\android\AndroidSDK\Sdk\extras\m2repository’ }
  2. buildscript {
  3.     repositories {
  4.         google()
  5.         jcenter()
  6.         // 这里写上上面代码生成的文件路径,参考我的
  7.         maven { url 'file://E:\\android\\AndroidSDK\\Sdk\\extras\\m2repository' }
  8.         maven { url 'https://jitpack.io' }
  9.     }
  10.     dependencies {
  11.         classpath 'com.android.tools.build:gradle:3.5.2'
  12.         
  13.         // NOTE: Do not place your application dependencies here; they belong
  14.         // in the individual module build.gradle files
  15.     }
  16. }
  17. allprojects {
  18.     repositories {
  19.         maven { url 'file://E:\\android\\AndroidSDK\\Sdk\\extras\\m2repository' }
  20.         maven { url 'https://jitpack.io' }
  21.     }
  22. }
  23. task clean(type: Delete) {
  24.     delete rootProject.buildDir
  25. }

6、完结

工作那么多年,第一次写博客,参考正在上传…重新上传取消飞奔的蜗牛丶,再次感谢

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/438533
推荐阅读
相关标签
  

闽ICP备14008679号