美文网首页
AndroidStudio离线配置及使用

AndroidStudio离线配置及使用

作者: Active_Loser | 来源:发表于2019-08-23 23:46 被阅读0次

    相信看到这篇文章的伙伴已经尝试过很多博客中的方法,以下是个人踩坑部署多台电脑后总结出来的。

    一、准备

    1、 developer.android下载安装包,已安装过的可省略此步骤。

    Android Studio
    2、 developer.android下载Google Maven dependencies,可省略此步骤,本质上只是为了获取其中的一个文件,下面给出。

    3.可上网编译项目的Gradle目录,此步骤是为了解决离线环境中gradle下载的问题,我copy的自己电脑上的文件。

    4.copy已下载好的SDK目录

    二、安装及配置

    2.1 安装Android Studio

    安装过程就不详述了,最后手动配置SDK目录(可自行设置)。

    2.2 配置离线Grandle

    2.3 设置离线工作


    2.4 配置离线插件和依赖

    2.4.1 解压下载的'Google Maven dependencies'文件offline-gmaven-stable文件,打开Readme文件,可以看到教程:

    2.4.2 新建offline.gradle文件

    def reposDir = new File(System.properties['user.home'], ".android/manual-offline-m2")
    def repos = new ArrayList()
    reposDir.eachDir {repos.add(it) }
    repos.sort()
    
    allprojects {
      buildscript {
        repositories {
          for (repo in repos) {
            maven {
              name = "injected_offline_${repo.name}"
              url = repo.toURI().toURL()
            }
          }
        }
      }
      repositories {
        for (repo in repos) {
          maven {
            name = "injected_offline_${repo.name}"
            url = repo.toURI().toURL()
          }
        }
      }
    }
    
    • 重点new File(System.properties['user.home'], ".android/manual-offline-m2")可自行配置

    2.4.3 新建manual-offline-m2目录

    做到这里,我们就可以新建普通的安卓项目

    2.4.4 处理依赖和插件

    Android中添加依赖后,系统会默认缓存在下面的目录,但是离线情况下,包名格式不符合要求,因此我们需要对包名及jar、POM等文件进行处理。

    因此,我们需要先找一台机器,将我们所需要的的插件、依赖全部缓存完成后,通过下面的工具运行后,导入至内网即可。

    工具类,来源于逍遥游侠的文章

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.LinkedList;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    
    /**
     * 将Android中使用的gradle缓存目录中的jar包重新处理路径,用于内网离线构建
     * @author yhh
     *
     */
    
    public class CopyTool {
        // static String path = "D:\\Androidstudio2.3.3\\Android Studio\\gradle\\m2repository";
        // static String path = "D:\\gradle_cache\\files-2.1";
        static String path = "D:\\test\\files-2.1"; //C:\Users\Administrator\.gradle\caches\modules-2\files-2.1
        // static String stopName= "files-2.1";
        static String stopName = "files-2.1";
    
        public static void main(String[] args) {
            System.out.println("Begin to copy");
            processDotForld();
            copyToLastForld();
            System.out.println("Copy finished");
        }
    
        /**
         * 处理文件夹中带点好的。;例如:D:/test/com.ifind.android/
         */
        public static void processDotForld() {
            File file = new File(path);
            if (file.exists()) {
                LinkedList<File> list = new LinkedList<>();
                File[] files = file.listFiles();
                for (int i = 0; i < files.length; i++) {
                    File file2 = files[i];
                    if (file2.isDirectory()) {
                        //文件夹
                        File desFile = creatforld(file2);
                        copyFileToDes(file2, desFile);
                    } else {
                        //文件//目前不存在
                    }
                }
            }
        }
    
        /**
         * 文件夹拷贝
         *
         * @param source
         * @param des
         */
        public static void copyFileToDes(File source, File des) {
            try {
                copyDir(source.getPath(), des.getPath());
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    
        /**
         * 文件夹拷贝
         *
         * @param sourcePath
         * @param newPath
         * @throws IOException
         */
        public static void copyDir(String sourcePath, String newPath) throws IOException {
            File file = new File(sourcePath);
            String[] filePath = file.list();
    
            if (!(new File(newPath)).exists()) {
                (new File(newPath)).mkdir();
            }
    
            for (int i = 0; i < filePath.length; i++) {
                if ((new File(sourcePath + file.separator + filePath[i])).isDirectory()) {
                    copyDir(sourcePath + file.separator + filePath[i], newPath + file.separator + filePath[i]);
                }
    
                if (new File(sourcePath + file.separator + filePath[i]).isFile()) {
                    copyFile(sourcePath + file.separator + filePath[i], newPath + file.separator + filePath[i]);
                }
    
            }
        }
    
        public static void copyFile(String oldPath, String newPath) throws IOException {
            File oldFile = new File(oldPath);
            File file = new File(newPath);
            FileInputStream in = new FileInputStream(oldFile);
            FileOutputStream out = new FileOutputStream(file);
    
            byte[] buffer = new byte[2097152];
    
            //while((in.read(buffer)) != -1){
            //  out.write(buffer);
            //}
    
            DataInputStream dis = new DataInputStream(new BufferedInputStream(in));
            DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(out));
    
            int length;
            while ((length = dis.read(buffer)) != -1) {
                dos.write(buffer, 0, length);
            }
            dos.flush();
            dos.close();
            dis.close();
        }
    
    
        /**
         * 创建文件夹
         *
         * @param file
         */
        public static File creatforld(File file) {
            String path = file.getAbsolutePath();
            if (path != null) {
                String temp = "files-2.1";
                temp = stopName;
                String temS[] = path.split(temp);
    
                if (temS != null && temS.length == 2) {
                    String firstName = temS[0];
                    String dotName = temS[1];
                    if (dotName != null) {
                        String[] lasts = dotName.split("\\.");
                        int count = lasts.length;
                        if (count < 2) {
                            return null;
                        }
                        String pathNew = firstName + temp;
                        for (int i = 0; i < count; i++) {
                            if (i == 0) {
                                pathNew = pathNew + lasts[i];
                            } else {
                                pathNew = pathNew + "\\" + lasts[i];
                            }
                        }
                        if (pathNew != null && !pathNew.equals("")) {
                            File fileForld = new File(pathNew);
                            if (!fileForld.exists()) {
                                fileForld.mkdirs();
                            }
                            return fileForld;
                        }
                    }
                }
            }
            return null;
        }
    
        public static ArrayList<File> getFile(File file) {
            ArrayList<File> list = new ArrayList<>();
            if (file.isDirectory()) {
                File[] filesTemp = file.listFiles();
                for (int i = 0; i < filesTemp.length; i++) {
                    ArrayList<File> result = getFile(filesTemp[i]);
                    list.addAll(result);
                }
    
            } else {
                list.add(file);
            }
            return list;
        }
    
    
        // 创建目录
        public static boolean createDir(String destDirName) {
            File dir = new File(destDirName);
            if (dir.exists()) {// 判断目录是否存在
                System.out.println("创建目录失败,目标目录已存在!");
                return false;
            }
            if (!destDirName.endsWith(File.separator)) {// 结尾是否以"/"结束
                destDirName = destDirName + File.separator;
            }
            if (dir.mkdirs()) {// 创建目标目录
                System.out.println("创建目录成功!" + destDirName);
                return true;
            } else {
                System.out.println("创建目录失败!");
                return false;
            }
        }
    
    
        public static void copyToLastForld() {
            File file = new File(path);
            if (file.exists()) {
                LinkedList<File> list = new LinkedList<>();
                File[] files = file.listFiles();
                for (int i = 0; i < files.length; i++) {
                    File file2 = files[i];
                    if (file2.isDirectory()) {
                      //文件夹
                        proceessForld(file2);
                    } else {
                      //文件//目前不存在
                    }
                }
            }
        }
    
    
        private static void proceessForld(File file) {
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                File file2 = files[i];
                if (file2.isDirectory()) {
                      //文件夹
                    proceessForld(file2);
                } else {
                      //文件//目前不存在//判断是否进行拷贝
                    try {
                        proceessFile(file2);
                    } catch (FileNotFoundException e) {
                      // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    
    
        private static void proceessFile(File file) throws FileNotFoundException {
            if (file != null) {
                String path = file.getAbsolutePath();
                if (path != null) {
                    String[] lasts = splitString(path);
                    if (lasts != null && lasts.length > 0) {
                        int count = lasts.length;
                        String last = lasts[count - 1];
                        String last2 = lasts[count - 2];
    
    
                        if (last2 != null && last2.length() > 20) {
                      //拷贝到上一级目录
                            String des = null;
                            if (count < 2) {
                                return;
                            }
                            for (int i = 0; i < count - 2; i++) {
                                if (i == 0) {
                                    des = lasts[i];
                                } else {
                                    des = des + "\\\\" + lasts[i];
                                }
                            }
                            des = des + "\\\\" + last;
                            String strParentDirectory = file.getParent();
                            File parentFile = new File(strParentDirectory);
                            strParentDirectory = parentFile.getParent() + "\\" + last;
                            copy(file, path, strParentDirectory);
                        } else {
                      // System.out.println("source = "+path);
                        }
                      // System.out.println("source = "+path);
                      // System.out.println("des = "+des);
                    }
                }
            }
        }
    
    
        private static String[] splitString(String path) {
            String[] lasts = null;
            lasts = path.split("\\\\");
            int count = lasts.length;
            boolean isFirst = true;
            for (int i = 0; i < count; i++) {
                String str = lasts[i];
                if (str != null && str.contains(".")) {
                    if (isFirst) {
                        isFirst = false;
                        System.out.println("\n\n\n\n");
                        System.out.println("path=" + path + "");
                    }
                    System.out.println("str=" + str + "");
                }
            }
            return lasts;
        }
    
        /**
         * copy动作
         *
         * @param file
         * @param source
         * @param des
         * @throws FileNotFoundException
         */
        private static void copy(File file, String source, String des) throws FileNotFoundException {
            if (file != null) {
                FileInputStream fis = null;
                FileOutputStream fot = null;
                byte[] bytes = new byte[1024];
                int temp = 0;
                File desFile = new File(des);
                if (desFile.exists()) {
                    return;
                }
                try {
                    fis = new FileInputStream(file);
                    fot = new FileOutputStream(desFile);
                    while ((temp = fis.read(bytes)) != -1) {
                        fot.write(bytes, 0, temp);
                        fot.flush();
    
    
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (fis != null) {
                        try {
                            fis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (fot != null) {
                        try {
                            fot.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
    
    
            }
        }
    
    
        private static String getContent(String content) {
            String str = content;
            if (content != null && content.length() > 4) {
                str = content.substring(0, 4);
            }
            return str;
        }
    }
    
    

    最后将处理后的文件夹也拷贝至下面的目录(处理后的文件夹不包含.例如 com.google.dagger 处理后格式为com/google/dagger)
    我们和下图框线相同的文件夹copy至offline-gmaven-stable目录


    如此,大功告成,当然,如果条件合适的话,使用公司搭建的maven是更好的选择,不过对我来说,这样就可以了,后期需要增加或更新依赖版本时,仅需copy增量的部分即可。

    相关文章

      网友评论

          本文标题:AndroidStudio离线配置及使用

          本文链接:https://www.haomeiwen.com/subject/rxixectx.html