├── README.md ├── ReforceApk ├── .gitignore ├── .idea │ ├── gradle.xml │ ├── misc.xml │ └── runConfigurations.xml ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── reforce │ │ │ └── shell │ │ │ ├── ApplicationProxy.java │ │ │ ├── Constant.java │ │ │ ├── DexFile.java │ │ │ ├── LogUtils.java │ │ │ ├── MainActivity.java │ │ │ ├── RefInvoke.java │ │ │ └── SecurityUtils.java │ │ └── res │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── demo ├── .gitignore ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ ├── test │ │ │ ├── Test1.java │ │ │ ├── Test10.java │ │ │ ├── Test100.java │ │ │ ├── Test101.java │ │ │ ├── Test102.java │ │ │ ├── Test103.java │ │ │ ├── Test104.java │ │ │ ├── Test105.java │ │ │ ├── Test106.java │ │ │ ├── Test107.java │ │ │ ├── Test108.java │ │ │ ├── Test109.java │ │ │ ├── Test11.java │ │ │ ├── Test110.java │ │ │ ├── Test111.java │ │ │ ├── Test112.java │ │ │ ├── Test113.java │ │ │ ├── Test114.java │ │ │ ├── Test115.java │ │ │ ├── Test116.java │ │ │ ├── Test117.java │ │ │ ├── Test118.java │ │ │ ├── Test119.java │ │ │ ├── Test12.java │ │ │ ├── Test120.java │ │ │ ├── Test121.java │ │ │ ├── Test122.java │ │ │ ├── Test123.java │ │ │ ├── Test124.java │ │ │ ├── Test125.java │ │ │ ├── Test126.java │ │ │ ├── Test127.java │ │ │ ├── Test128.java │ │ │ ├── Test129.java │ │ │ ├── Test13.java │ │ │ ├── Test130.java │ │ │ ├── Test131.java │ │ │ ├── Test132.java │ │ │ ├── Test133.java │ │ │ ├── Test134.java │ │ │ ├── Test135.java │ │ │ ├── Test136.java │ │ │ ├── Test137.java │ │ │ ├── Test138.java │ │ │ ├── Test139.java │ │ │ ├── Test14.java │ │ │ ├── Test140.java │ │ │ ├── Test141.java │ │ │ ├── Test142.java │ │ │ ├── Test143.java │ │ │ ├── Test144.java │ │ │ ├── Test145.java │ │ │ ├── Test146.java │ │ │ ├── Test147.java │ │ │ ├── Test148.java │ │ │ ├── Test149.java │ │ │ ├── Test15.java │ │ │ ├── Test150.java │ │ │ ├── Test151.java │ │ │ ├── Test152.java │ │ │ ├── Test153.java │ │ │ ├── Test154.java │ │ │ ├── Test155.java │ │ │ ├── Test156.java │ │ │ ├── Test157.java │ │ │ ├── Test158.java │ │ │ ├── Test159.java │ │ │ ├── Test16.java │ │ │ ├── Test160.java │ │ │ ├── Test161.java │ │ │ ├── Test162.java │ │ │ ├── Test163.java │ │ │ ├── Test164.java │ │ │ ├── Test165.java │ │ │ ├── Test166.java │ │ │ ├── Test167.java │ │ │ ├── Test168.java │ │ │ ├── Test169.java │ │ │ ├── Test17.java │ │ │ ├── Test170.java │ │ │ ├── Test171.java │ │ │ ├── Test172.java │ │ │ ├── Test173.java │ │ │ ├── Test174.java │ │ │ ├── Test175.java │ │ │ ├── Test176.java │ │ │ ├── Test177.java │ │ │ ├── Test178.java │ │ │ ├── Test179.java │ │ │ ├── Test18.java │ │ │ ├── Test180.java │ │ │ ├── Test181.java │ │ │ ├── Test182.java │ │ │ ├── Test183.java │ │ │ ├── Test184.java │ │ │ ├── Test185.java │ │ │ ├── Test186.java │ │ │ ├── Test187.java │ │ │ ├── Test188.java │ │ │ ├── Test189.java │ │ │ ├── Test19.java │ │ │ ├── Test190.java │ │ │ ├── Test191.java │ │ │ ├── Test192.java │ │ │ ├── Test193.java │ │ │ ├── Test194.java │ │ │ ├── Test195.java │ │ │ ├── Test196.java │ │ │ ├── Test197.java │ │ │ ├── Test198.java │ │ │ ├── Test199.java │ │ │ ├── Test2.java │ │ │ ├── Test20.java │ │ │ ├── Test200.java │ │ │ ├── Test201.java │ │ │ ├── Test202.java │ │ │ ├── Test203.java │ │ │ ├── Test204.java │ │ │ ├── Test205.java │ │ │ ├── Test206.java │ │ │ ├── Test207.java │ │ │ ├── Test208.java │ │ │ ├── Test209.java │ │ │ ├── Test21.java │ │ │ ├── Test210.java │ │ │ ├── Test211.java │ │ │ ├── Test212.java │ │ │ ├── Test213.java │ │ │ ├── Test214.java │ │ │ ├── Test215.java │ │ │ ├── Test216.java │ │ │ ├── Test217.java │ │ │ ├── Test218.java │ │ │ ├── Test219.java │ │ │ ├── Test22.java │ │ │ ├── Test220.java │ │ │ ├── Test221.java │ │ │ ├── Test222.java │ │ │ ├── Test223.java │ │ │ ├── Test224.java │ │ │ ├── Test225.java │ │ │ ├── Test226.java │ │ │ ├── Test227.java │ │ │ ├── Test228.java │ │ │ ├── Test229.java │ │ │ ├── Test23.java │ │ │ ├── Test230.java │ │ │ ├── Test231.java │ │ │ ├── Test232.java │ │ │ ├── Test233.java │ │ │ ├── Test234.java │ │ │ ├── Test235.java │ │ │ ├── Test236.java │ │ │ ├── Test237.java │ │ │ ├── Test238.java │ │ │ ├── Test239.java │ │ │ ├── Test24.java │ │ │ ├── Test240.java │ │ │ ├── Test241.java │ │ │ ├── Test242.java │ │ │ ├── Test243.java │ │ │ ├── Test244.java │ │ │ ├── Test245.java │ │ │ ├── Test246.java │ │ │ ├── Test247.java │ │ │ ├── Test248.java │ │ │ ├── Test249.java │ │ │ ├── Test25.java │ │ │ ├── Test250.java │ │ │ ├── Test251.java │ │ │ ├── Test252.java │ │ │ ├── Test253.java │ │ │ ├── Test254.java │ │ │ ├── Test255.java │ │ │ ├── Test256.java │ │ │ ├── Test257.java │ │ │ ├── Test258.java │ │ │ ├── Test259.java │ │ │ ├── Test26.java │ │ │ ├── Test260.java │ │ │ ├── Test261.java │ │ │ ├── Test262.java │ │ │ ├── Test263.java │ │ │ ├── Test264.java │ │ │ ├── Test265.java │ │ │ ├── Test266.java │ │ │ ├── Test267.java │ │ │ ├── Test268.java │ │ │ ├── Test269.java │ │ │ ├── Test27.java │ │ │ ├── Test270.java │ │ │ ├── Test271.java │ │ │ ├── Test272.java │ │ │ ├── Test273.java │ │ │ ├── Test274.java │ │ │ ├── Test275.java │ │ │ ├── Test276.java │ │ │ ├── Test277.java │ │ │ ├── Test278.java │ │ │ ├── Test279.java │ │ │ ├── Test28.java │ │ │ ├── Test280.java │ │ │ ├── Test281.java │ │ │ ├── Test282.java │ │ │ ├── Test283.java │ │ │ ├── Test284.java │ │ │ ├── Test285.java │ │ │ ├── Test286.java │ │ │ ├── Test287.java │ │ │ ├── Test288.java │ │ │ ├── Test289.java │ │ │ ├── Test29.java │ │ │ ├── Test290.java │ │ │ ├── Test291.java │ │ │ ├── Test292.java │ │ │ ├── Test293.java │ │ │ ├── Test294.java │ │ │ ├── Test295.java │ │ │ ├── Test296.java │ │ │ ├── Test297.java │ │ │ ├── Test298.java │ │ │ ├── Test299.java │ │ │ ├── Test3.java │ │ │ ├── Test30.java │ │ │ ├── Test31.java │ │ │ ├── Test32.java │ │ │ ├── Test33.java │ │ │ ├── Test34.java │ │ │ ├── Test35.java │ │ │ ├── Test36.java │ │ │ ├── Test37.java │ │ │ ├── Test38.java │ │ │ ├── Test39.java │ │ │ ├── Test4.java │ │ │ ├── Test40.java │ │ │ ├── Test41.java │ │ │ ├── Test42.java │ │ │ ├── Test43.java │ │ │ ├── Test44.java │ │ │ ├── Test45.java │ │ │ ├── Test46.java │ │ │ ├── Test47.java │ │ │ ├── Test48.java │ │ │ ├── Test49.java │ │ │ ├── Test5.java │ │ │ ├── Test50.java │ │ │ ├── Test51.java │ │ │ ├── Test52.java │ │ │ ├── Test53.java │ │ │ ├── Test54.java │ │ │ ├── Test55.java │ │ │ ├── Test56.java │ │ │ ├── Test57.java │ │ │ ├── Test58.java │ │ │ ├── Test59.java │ │ │ ├── Test6.java │ │ │ ├── Test60.java │ │ │ ├── Test61.java │ │ │ ├── Test62.java │ │ │ ├── Test63.java │ │ │ ├── Test64.java │ │ │ ├── Test65.java │ │ │ ├── Test66.java │ │ │ ├── Test67.java │ │ │ ├── Test68.java │ │ │ ├── Test69.java │ │ │ ├── Test7.java │ │ │ ├── Test70.java │ │ │ ├── Test71.java │ │ │ ├── Test72.java │ │ │ ├── Test73.java │ │ │ ├── Test74.java │ │ │ ├── Test75.java │ │ │ ├── Test76.java │ │ │ ├── Test77.java │ │ │ ├── Test78.java │ │ │ ├── Test79.java │ │ │ ├── Test8.java │ │ │ ├── Test80.java │ │ │ ├── Test81.java │ │ │ ├── Test82.java │ │ │ ├── Test83.java │ │ │ ├── Test84.java │ │ │ ├── Test85.java │ │ │ ├── Test86.java │ │ │ ├── Test87.java │ │ │ ├── Test88.java │ │ │ ├── Test89.java │ │ │ ├── Test9.java │ │ │ ├── Test90.java │ │ │ ├── Test91.java │ │ │ ├── Test92.java │ │ │ ├── Test93.java │ │ │ ├── Test94.java │ │ │ ├── Test95.java │ │ │ ├── Test96.java │ │ │ ├── Test97.java │ │ │ ├── Test98.java │ │ │ └── Test99.java │ │ │ └── xiyou │ │ │ └── demo │ │ │ ├── MainActivity.java │ │ │ └── MyApplication.java │ │ └── res │ │ ├── drawable │ │ ├── a.jpg │ │ ├── app_icon.png │ │ ├── b.jpg │ │ ├── c.jpg │ │ ├── e.jpg │ │ ├── f.jpg │ │ ├── g.jpg │ │ ├── h.jpg │ │ └── i.jpg │ │ └── layout │ │ └── activity_main.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── img ├── dex_structure.png └── effect.jpg ├── shell_util ├── .idea │ ├── compiler.xml │ ├── description.html │ ├── encodings.xml │ ├── libraries │ │ └── fastjson_1_2_29.xml │ ├── misc.xml │ ├── modules.xml │ ├── vcs.xml │ └── workspace.xml ├── libs │ └── fastjson-1.2.29.jar ├── out │ └── production │ │ └── shell_util │ │ └── com │ │ ├── test │ │ └── Main.class │ │ └── utils │ │ ├── AndroidXmlUtils.class │ │ ├── ApkShellUtils.class │ │ ├── ApkToolUtils.class │ │ ├── CmdExecutor$StreamGobbler.class │ │ ├── CmdExecutor.class │ │ ├── Constant.class │ │ ├── DexFile.class │ │ ├── FileUtils.class │ │ ├── SecurityUtils.class │ │ ├── SignUtils$Keystore.class │ │ └── SignUtils.class ├── shell_util.iml ├── src │ └── com │ │ ├── test │ │ └── Main.java │ │ └── utils │ │ ├── AndroidXmlUtils.java │ │ ├── ApkShellUtils.java │ │ ├── ApkToolUtils.java │ │ ├── CmdExecutor.java │ │ ├── Constant.java │ │ ├── DexFile.java │ │ ├── FileUtils.java │ │ ├── SecurityUtils.java │ │ └── SignUtils.java └── tools │ ├── apktool │ └── apktool.jar │ └── keystore │ └── test.keystore └── 项目介绍.txt /README.md: -------------------------------------------------------------------------------- 1 | # Android apk加固(加壳)整理 # 2 | 3 | **一、Dex加壳由来** 4 | 5 | 最近在学习apk加密,在网上看了一篇《[Android中的Apk的加固(加壳)原理解析和实现](https://blog.csdn.net/jiangwei0910410003/article/details/48415225)》,我发现原文把整个apk都写入到dex文件中,如果apk小还好,当原APK大于200M,客户端解壳很费劲,打开后应用就卡住了,如果只是把原apk的dex加壳不就很容易解开了嘛。我不是原创,只是按照我自己的思路将大神的加固稍作调整,并且将整个项目整理如下。 6 | 7 | **二、Dex结构** 8 | ![](img/dex_structure.png) 9 | 如图所示,新的dex由解壳dex、dex集合、dex集合描述和描述长度组成 10 | 11 | **三、核心代码** 12 | 13 | 14 | - 加壳 15 |

 16 |      /**
 17 |      * 给apk加壳
 18 |      * @param primaryApkPath 原apk
 19 |      * @param unShellApkPath 解壳apk
 20 |      * @param outApkPath 加壳后新APK
 21 |      * @throws Exception
 22 |      */
 23 |     public static void apkShell(String primaryApkPath,String unShellApkPath,String outApkPath) throws Exception{
 24 |         if(!FileUtils.isExit(primaryApkPath, unShellApkPath)){
 25 |             throw new RuntimeException("check params");
 26 |         }
 27 |         //解压原apk
 28 |         String unPrimaryApkDstPath = primaryApkPath.replace(".apk", "");
 29 |         ApkToolUtils.decompile(primaryApkPath, unPrimaryApkDstPath);
 30 |         String primaryManifestPath = unPrimaryApkDstPath + File.separator + "AndroidManifest.xml";
 31 | 
 32 |         //解压解壳apk
 33 |         String unShellApkDstPath = unShellApkPath.replace(".apk", "");
 34 |         ApkToolUtils.decompile(unShellApkPath, unShellApkDstPath);
 35 |         String unShellManifestPath = unShellApkDstPath + File.separator + "AndroidManifest.xml";
 36 |         String unShellDexPath = unShellApkDstPath + File.separator + "classes.dex";
 37 |         File unShellFile = new File(unShellDexPath);
 38 | 
 39 | 
 40 |         File unApkDir = new File(unPrimaryApkDstPath);
 41 |         ArrayList<File> dexArray = new ArrayList<File>();
 42 |         for(File file : unApkDir.listFiles()){//读取解壳后的dex
 43 |             if(file.getName().endsWith(".dex")){
 44 |                 dexArray.add(file);
 45 |             }
 46 |         }
 47 |         String shellDexPath = unPrimaryApkDstPath + File.separator + "classes.dex";
 48 |         shellDex(dexArray, unShellFile, shellDexPath);//生产新的dex(加壳)
 49 | 
 50 |         String mateInfPath = unPrimaryApkDstPath + File.separator +"META-INF";//删除meta-inf,重新签名后会生成
 51 |         FileUtils.delete(mateInfPath);
 52 | 
 53 |         for(File file : dexArray){//清理多余dex文件
 54 |             if(file.getName().equals("classes.dex")){
 55 |                 continue;
 56 |             }
 57 |             FileUtils.delete(file.getAbsolutePath());
 58 |         }
 59 | 
 60 |         String unShellApplicationName = AndroidXmlUtils.readApplicationName(unShellManifestPath);//解壳ApplicationName
 61 |         String primaryApplicationName = AndroidXmlUtils.readApplicationName(primaryManifestPath);//原applicationName
 62 |         AndroidXmlUtils.changeApplicationName(primaryManifestPath, unShellApplicationName);//改变原Applicationname为解壳ApplicationName
 63 |         if(primaryApplicationName != null){//将原ApplicationName写入mateData中,解壳application中会读取并替换应用Application
 64 |             AndroidXmlUtils.addMateData(primaryManifestPath, "APPLICATION_CLASS_NAME", primaryApplicationName);
 65 |         }
 66 |         //回编,回编系统最好是linux
 67 |         ApkToolUtils.compile(unPrimaryApkDstPath,outApkPath);
 68 |         //v1签名
 69 |         SignUtils.V1(outApkPath, SignUtils.getDefaultKeystore());
 70 |         //清理目录
 71 |         FileUtils.delete(unPrimaryApkDstPath);
 72 |         FileUtils.delete(unShellApkDstPath);
 73 |     }
 74 | 
 75 |     /**
 76 |      * 给dex加壳
 77 |      * @param primaryDexs 原dex集合
 78 |      * @param unShellDex 解壳dex
 79 |      * @param shellDexPath 生成新的dex路径
 80 |      * @throws IOException
 81 |      * @throws NoSuchAlgorithmException
 82 |      * @throws InvalidKeyException
 83 |      * @throws BadPaddingException
 84 |      * @throws NoSuchPaddingException
 85 |      * @throws IllegalBlockSizeException
 86 |      */
 87 |     private static void shellDex(ArrayList<File> primaryDexs, File unShellDex, String shellDexPath) throws IOException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, NoSuchPaddingException, IllegalBlockSizeException {
 88 |         int primaryDexLen = 0;
 89 |         ArrayList<DexFile> dexFileInfos = new ArrayList<>(primaryDexs.size());
 90 |         for(File file : primaryDexs){//计算所有primary的长度
 91 |             DexFile dexFile = new DexFile(file.getName(),encryptionAES(readFileBytes(file)));
 92 |             dexFileInfos.add(dexFile);
 93 |             primaryDexLen += dexFile.getDexLength();
 94 |         }
 95 |         byte[] unShellDexFileByte = readFileBytes(unShellDex);
 96 |         int unShellDexLen = unShellDexFileByte.length;//解壳dex长度
 97 | 
 98 |         String dexFileComment = JSON.toJSONString(dexFileInfos);//原dexs描述
 99 |         int dexFileCommentLen = dexFileComment.getBytes().length;//dexs描述长度
100 | 
101 |         int totalLen = primaryDexLen+dexFileCommentLen + unShellDexLen+4;//新dex总长度
102 |         byte[] shellDex = new byte[totalLen];
103 | 
104 |         System.arraycopy(unShellDexFileByte,0,shellDex,0,unShellDexLen);//先拷贝解壳dex
105 | 
106 |         int currentCopyIndex = unShellDexLen;
107 |         for(DexFile dexFile : dexFileInfos){//拷贝原dexs
108 |             System.arraycopy(dexFile.getData(),0,shellDex,currentCopyIndex,dexFile.getDexLength());
109 |             currentCopyIndex += dexFile.getDexLength();
110 |         }
111 | 
112 |         System.arraycopy(dexFileComment.getBytes(),0,shellDex,currentCopyIndex,dexFileCommentLen);//加入dexs描述
113 | 
114 |         System.arraycopy(intToByte(dexFileCommentLen),0,shellDex,totalLen-4,4);//描述长度
115 |         fixFileSizeHeader(shellDex);//修改dex头 file_size值
116 |         fixSHA1Header(shellDex);//修改dex头 sha1值
117 |         fixCheckSumHeader(shellDex);//修改dex头,CheckSum 校验码
118 | 
119 |         // 把内容写到 newDexFile
120 |         File file = new File(shellDexPath);
121 |         if (!file.exists()) {
122 |             file.createNewFile();
123 |         }
124 | 
125 |         FileOutputStream localFileOutputStream = new FileOutputStream(shellDexPath);
126 |         localFileOutputStream.write(shellDex);
127 |         localFileOutputStream.flush();
128 |         localFileOutputStream.close();
129 |     }
130 | 
131 | 加壳工程是一个java工程,解压apk使用了apktool,apktool这个工具最好是在linux下使用,xml操作使用了W3C java自带的,不咋个好用,为了项目简单没用其他的jar包。加壳项目中对byte数组的加密使用了aes,也可以用其他方法去实现。 132 | 133 | 134 | 135 | - 解壳 136 | 137 |
 
138 |  /**
139 |      * 从壳的dex文件中分离出原来的dex文件
140 |      * @param data
141 |      * @param primaryDexDir
142 |      * @throws IOException
143 |      */
144 |     public void splitPrimaryDexFromShellDex(byte[] data, String primaryDexDir) throws IOException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException {
145 |         int shellDexLen = data.length;
146 |         byte[] dexFileCommentLenByte = new byte[4];//dex信息长度
147 |         System.arraycopy(data, shellDexLen-4, dexFileCommentLenByte, 0, 4);
148 |         ByteArrayInputStream bais = new ByteArrayInputStream(dexFileCommentLenByte);
149 |         DataInputStream in = new DataInputStream(bais);
150 |         int dexFileCommentLen = in.readInt();
151 | 
152 |         byte[] dexFileCommentByte = new byte[dexFileCommentLen];//dex信息正文
153 |         System.arraycopy(data,shellDexLen-4-dexFileCommentLen,dexFileCommentByte,0,dexFileCommentLen);
154 |         String dexFileComment = new String(dexFileCommentByte);
155 |         LogUtils.d("dex comment:"+dexFileComment);
156 |         ArrayList<DexFile> dexFileArrayList = (ArrayList<DexFile>) JSON.parseArray(dexFileComment,DexFile.class);
157 |         int currentReadEndIndex = shellDexLen - 4 - dexFileCommentLen;//当前已经读取到的内容的下标
158 |         for(int i = dexFileArrayList.size()-1; i>=0; i--){//取出所有的dex,并写入到payload_dex目录下
159 |             DexFile dexFile = dexFileArrayList.get(i);
160 |             byte[] primaryDexData = new byte[dexFile.getDexLength()];
161 |             System.arraycopy(data,currentReadEndIndex-dexFile.getDexLength(),primaryDexData,0,dexFile.getDexLength());
162 |             primaryDexData = decryAES(primaryDexData);//界面
163 |             File primaryDexFile = new File(primaryDexDir,dexFile.getDexName());
164 |             if(!primaryDexFile.exists()) primaryDexFile.createNewFile();
165 |             FileOutputStream localFileOutputStream = new FileOutputStream(primaryDexFile);
166 |             localFileOutputStream.write(primaryDexData);
167 |             localFileOutputStream.close();
168 | 
169 |             currentReadEndIndex -= dexFile.getDexLength();
170 |         }
171 |     }
172 | 
173 | //代码片段,DexClassLoder加载多个dex
174 |   //找到dex并通过DexClassLoader去加载
175 |     StringBuffer dexPaths = new StringBuffer();
176 |     for(File file:dex.listFiles()){
177 |         dexPaths.append(file.getAbsolutePath());
178 |         dexPaths.append(File.pathSeparator);
179 |     }
180 |     dexPaths.delete(dexPaths.length()-1,dexPaths.length());
181 |     LogUtils.d(dexPaths.toString());
182 |     DexClassLoader classLoader = new DexClassLoader(dexPaths.toString(), odex.getAbsolutePath(),getApplicationInfo().nativeLibraryDir,(ClassLoader) RefInvoke.getFieldOjbect(
183 |             "android.app.LoadedApk", wr.get(), "mClassLoader"));//android4.4后ART会对dex做优化,第一次加载时间较长,后面就很快了
184 | 
185 | 将原项目dex从壳dex中获取出来,然后在onCreate中将dex拼接后使用DexClassLoder加载,nativeLibrary咋们只对dex做了加壳所以可以直接使用Application的nativeLibraryDir。 186 | 其它核心代码,application替换这类的,可以在原文中查看。 187 | 188 | **四、效果** 189 | ![](img/effect.jpg) 190 | 从左往右分别为原demo工程的apk,为了实现多dex加了很多费代码,加壳后的apk,解壳apk。可以看出加壳后项目demo工程的dex被隐藏,显示的是解壳工程的代码 191 | 192 | **五、待优化** 193 | 194 | 1. 将客户端的解密放入native层; 195 | 2. 将解密后的dex文件隐藏; 196 | 197 | 198 | 解密后的文件依旧存于应用的私有存储空间中,ROOT了的手机和模拟器很容易就可以拿到解密后的dex,所以这种加壳方法只是将代码从apk中隐藏。 199 | 如果有好的解决方法,或者好的加壳方法望告知! 200 | 201 | -------------------------------------------------------------------------------- /ReforceApk/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | -------------------------------------------------------------------------------- /ReforceApk/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /ReforceApk/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /ReforceApk/.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /ReforceApk/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /ReforceApk/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 21 5 | buildToolsVersion '25.0.2' 6 | defaultConfig { 7 | applicationId "com.reforce.shell" 8 | minSdkVersion 11 9 | targetSdkVersion 21 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | implementation fileTree(dir: 'libs', include: ['*.jar']) 24 | compile 'com.alibaba:fastjson:1.2.10' 25 | } 26 | -------------------------------------------------------------------------------- /ReforceApk/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /ReforceApk/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /ReforceApk/app/src/main/java/com/reforce/shell/ApplicationProxy.java: -------------------------------------------------------------------------------- 1 | package com.reforce.shell; 2 | 3 | import android.app.Application; 4 | import android.app.Instrumentation; 5 | import android.content.Context; 6 | import android.content.pm.ApplicationInfo; 7 | import android.content.pm.PackageManager; 8 | import android.os.Build; 9 | import android.os.Bundle; 10 | import android.util.ArrayMap; 11 | 12 | import com.alibaba.fastjson.JSON; 13 | 14 | import java.io.BufferedInputStream; 15 | import java.io.ByteArrayInputStream; 16 | import java.io.ByteArrayOutputStream; 17 | import java.io.DataInputStream; 18 | import java.io.File; 19 | import java.io.FileInputStream; 20 | import java.io.FileOutputStream; 21 | import java.io.IOException; 22 | import java.lang.ref.WeakReference; 23 | import java.security.InvalidKeyException; 24 | import java.security.NoSuchAlgorithmException; 25 | import java.util.ArrayList; 26 | import java.util.HashMap; 27 | import java.util.Iterator; 28 | import java.util.zip.ZipEntry; 29 | import java.util.zip.ZipInputStream; 30 | 31 | import javax.crypto.BadPaddingException; 32 | import javax.crypto.IllegalBlockSizeException; 33 | import javax.crypto.NoSuchPaddingException; 34 | 35 | import dalvik.system.DexClassLoader; 36 | 37 | /** 38 | * @author zl 39 | * @time 2019/2/22 0022. 40 | */ 41 | public class ApplicationProxy extends Application { 42 | @Override 43 | protected void attachBaseContext(Context base) { 44 | super.attachBaseContext(base); 45 | try { 46 | File odex = getDir("payload_odex",MODE_PRIVATE);//android art虚拟机会对dex做优化 47 | File dex = getDir("payload_dex",MODE_PRIVATE); 48 | if(dex.listFiles().length == 0){ 49 | byte[] dexData = readDexFromApk(); 50 | splitPrimaryDexFromShellDex(dexData,dex.getAbsolutePath()); 51 | } 52 | Object currentActivityThread = RefInvoke.invokeStaticMethod("android.app.ActivityThread", "currentActivityThread", new Class[] {}, new Object[] {}); 53 | String packageName = getPackageName(); 54 | WeakReference wr; 55 | if(Build.VERSION.SDK_INT < 19){ 56 | HashMap mPackages = (HashMap) RefInvoke.getFieldOjbect( 57 | "android.app.ActivityThread", currentActivityThread, 58 | "mPackages"); 59 | wr = (WeakReference) mPackages.get(packageName); 60 | } else { 61 | ArrayMap mPackages = (ArrayMap) RefInvoke.getFieldOjbect( 62 | "android.app.ActivityThread", currentActivityThread, 63 | "mPackages"); 64 | wr = (WeakReference) mPackages.get(packageName); 65 | } 66 | //找到dex并通过DexClassLoader去加载 67 | StringBuffer dexPaths = new StringBuffer(); 68 | for(File file:dex.listFiles()){ 69 | dexPaths.append(file.getAbsolutePath()); 70 | dexPaths.append(File.pathSeparator); 71 | } 72 | dexPaths.delete(dexPaths.length()-1,dexPaths.length()); 73 | LogUtils.d(dexPaths.toString()); 74 | DexClassLoader classLoader = new DexClassLoader(dexPaths.toString(), odex.getAbsolutePath(),getApplicationInfo().nativeLibraryDir,(ClassLoader) RefInvoke.getFieldOjbect( 75 | "android.app.LoadedApk", wr.get(), "mClassLoader")); 76 | RefInvoke.setFieldOjbect("android.app.LoadedApk", "mClassLoader", 77 | wr.get(), classLoader); 78 | } catch (Exception e) { 79 | e.printStackTrace(); 80 | } 81 | 82 | } 83 | 84 | /** 85 | * 从apk中读取dex文件 86 | * @return 87 | * @throws IOException 88 | */ 89 | public byte[] readDexFromApk() throws IOException { 90 | ByteArrayOutputStream dexByteArrayOutputSteam = new ByteArrayOutputStream(); 91 | System.out.println(getApplicationInfo().sourceDir); 92 | ZipInputStream localZipInputStream = new ZipInputStream(new BufferedInputStream(new FileInputStream(getApplicationInfo().sourceDir))); 93 | while(true){ 94 | ZipEntry localZipEntry = localZipInputStream.getNextEntry(); 95 | if(localZipEntry == null){ 96 | localZipInputStream.close(); 97 | break; 98 | } 99 | if(localZipEntry.getName().equals("classes.dex")){ 100 | byte[] arrayOfByte = new byte[1024]; 101 | while (true){ 102 | int i = localZipInputStream.read(arrayOfByte); 103 | if(i == -1) break; 104 | dexByteArrayOutputSteam.write(arrayOfByte,0,i); 105 | } 106 | } 107 | } 108 | localZipInputStream.close(); 109 | return dexByteArrayOutputSteam.toByteArray(); 110 | } 111 | 112 | /** 113 | * 从壳的dex文件中分离出原来的dex文件 114 | * @param data 115 | * @param primaryDexDir 116 | * @throws IOException 117 | */ 118 | public void splitPrimaryDexFromShellDex(byte[] data, String primaryDexDir) throws IOException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException { 119 | int shellDexLen = data.length; 120 | byte[] dexFileCommentLenByte = new byte[4];//dex信息长度 121 | System.arraycopy(data, shellDexLen-4, dexFileCommentLenByte, 0, 4); 122 | ByteArrayInputStream bais = new ByteArrayInputStream(dexFileCommentLenByte); 123 | DataInputStream in = new DataInputStream(bais); 124 | int dexFileCommentLen = in.readInt(); 125 | 126 | byte[] dexFileCommentByte = new byte[dexFileCommentLen];//dex信息正文 127 | System.arraycopy(data,shellDexLen-4-dexFileCommentLen,dexFileCommentByte,0,dexFileCommentLen); 128 | String dexFileComment = new String(dexFileCommentByte); 129 | LogUtils.d("dex comment:"+dexFileComment); 130 | ArrayList dexFileArrayList = (ArrayList) JSON.parseArray(dexFileComment,DexFile.class); 131 | int currentReadEndIndex = shellDexLen - 4 - dexFileCommentLen;//当前已经读取到的内容的下标 132 | for(int i = dexFileArrayList.size()-1; i>=0; i--){//取出所有的dex,并写入到payload_dex目录下 133 | DexFile dexFile = dexFileArrayList.get(i); 134 | byte[] primaryDexData = new byte[dexFile.getDexLength()]; 135 | System.arraycopy(data,currentReadEndIndex-dexFile.getDexLength(),primaryDexData,0,dexFile.getDexLength()); 136 | primaryDexData = decryAES(primaryDexData);//界面 137 | File primaryDexFile = new File(primaryDexDir,dexFile.getDexName()); 138 | if(!primaryDexFile.exists()) primaryDexFile.createNewFile(); 139 | FileOutputStream localFileOutputStream = new FileOutputStream(primaryDexFile); 140 | localFileOutputStream.write(primaryDexData); 141 | localFileOutputStream.close(); 142 | 143 | currentReadEndIndex -= dexFile.getDexLength(); 144 | } 145 | } 146 | 147 | public byte[] decryAES(byte[] data) throws IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException { 148 | return SecurityUtils.AESDecrypt(Constant.AES_PRIVATE_KEY,Constant.AES_IV,Constant.AES_TYPE,data); 149 | } 150 | 151 | @SuppressWarnings({ "unchecked", "rawtypes" }) 152 | @Override 153 | public void onCreate() { 154 | String appClassName = null; 155 | try { 156 | ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); 157 | Bundle bundle = ai.metaData; 158 | if(bundle != null && bundle.containsKey("APPLICATION_CLASS_NAME")){ 159 | appClassName = bundle.getString("APPLICATION_CLASS_NAME"); 160 | }else{ 161 | super.onCreate(); 162 | return; 163 | } 164 | LogUtils.d("appClassName:"+appClassName); 165 | // 有值的话调用该Applicaiton 166 | Object currentActivityThread = RefInvoke.invokeStaticMethod( 167 | "android.app.ActivityThread", "currentActivityThread", 168 | new Class[] {}, new Object[] {}); 169 | Object mBoundApplication = RefInvoke.getFieldOjbect( 170 | "android.app.ActivityThread", currentActivityThread, 171 | "mBoundApplication"); 172 | Object loadedApkInfo = RefInvoke.getFieldOjbect( 173 | "android.app.ActivityThread$AppBindData", 174 | mBoundApplication, "info"); 175 | // 把当前进程的mApplication 设置成了null 176 | RefInvoke.setFieldOjbect("android.app.LoadedApk", "mApplication", 177 | loadedApkInfo, null); 178 | Object oldApplication = RefInvoke.getFieldOjbect( 179 | "android.app.ActivityThread", currentActivityThread, 180 | "mInitialApplication"); 181 | // http://www.codeceo.com/article/android-context.html 182 | ArrayList mAllApplications = (ArrayList) RefInvoke 183 | .getFieldOjbect("android.app.ActivityThread", 184 | currentActivityThread, "mAllApplications"); 185 | mAllApplications.remove(oldApplication);// 删除oldApplication 186 | 187 | ApplicationInfo appinfo_In_LoadedApk = (ApplicationInfo) RefInvoke 188 | .getFieldOjbect("android.app.LoadedApk", loadedApkInfo, 189 | "mApplicationInfo"); 190 | ApplicationInfo appinfo_In_AppBindData = (ApplicationInfo) RefInvoke 191 | .getFieldOjbect("android.app.ActivityThread$AppBindData", 192 | mBoundApplication, "appInfo"); 193 | appinfo_In_LoadedApk.className = appClassName; 194 | appinfo_In_AppBindData.className = appClassName; 195 | Application app = (Application) RefInvoke.invokeMethod( 196 | "android.app.LoadedApk", "makeApplication", loadedApkInfo, 197 | new Class[] { boolean.class, Instrumentation.class }, 198 | new Object[] { false, null });// 执行 199 | // makeApplication(false,null) 200 | RefInvoke.setFieldOjbect("android.app.ActivityThread", 201 | "mInitialApplication", currentActivityThread, app); 202 | 203 | Iterator it; 204 | if(Build.VERSION.SDK_INT < 19){ 205 | // 解决了类型强转错误的问题,原因: 206 | // 4.4以下系统 mProviderMap 的类型是 HashMap 207 | // 4.4以上系统 mProviderMap 的类型是 ArrayMap 208 | HashMap mProviderMap = (HashMap) RefInvoke.getFieldOjbect( 209 | "android.app.ActivityThread", currentActivityThread, 210 | "mProviderMap"); 211 | it = mProviderMap.values().iterator(); 212 | }else{ 213 | ArrayMap mProviderMap = (ArrayMap) RefInvoke.getFieldOjbect( 214 | "android.app.ActivityThread", currentActivityThread, 215 | "mProviderMap"); 216 | it = mProviderMap.values().iterator(); 217 | } 218 | while (it.hasNext()) { 219 | Object providerClientRecord = it.next(); 220 | Object localProvider = RefInvoke.getFieldOjbect( 221 | "android.app.ActivityThread$ProviderClientRecord", 222 | providerClientRecord, "mLocalProvider"); 223 | RefInvoke.setFieldOjbect("android.content.ContentProvider", 224 | "mContext", localProvider, app); 225 | } 226 | app.onCreate(); 227 | } catch (PackageManager.NameNotFoundException e) { 228 | e.printStackTrace(); 229 | super.onCreate(); 230 | } 231 | } 232 | } 233 | -------------------------------------------------------------------------------- /ReforceApk/app/src/main/java/com/reforce/shell/Constant.java: -------------------------------------------------------------------------------- 1 | package com.reforce.shell; 2 | 3 | /** 4 | * Created by zoulong on 2019/2/26 0026. 5 | */ 6 | public class Constant { 7 | public static final String AES_IV = "1234567898765432";//16位 8 | public static final String AES_TYPE = "AES/ECB/PKCS5Padding";//填充类型 9 | //私钥 10 | public static final String AES_PRIVATE_KEY="1111222233334444";//AES固定格式为128/192/256 bits.即:16/24/32bytes。DES固定格式为128bits,即8bytes。 11 | } 12 | -------------------------------------------------------------------------------- /ReforceApk/app/src/main/java/com/reforce/shell/DexFile.java: -------------------------------------------------------------------------------- 1 | package com.reforce.shell; 2 | 3 | /** 4 | * Created by zoulong on 2019/2/25 0025. 5 | */ 6 | public class DexFile { 7 | private String dexName; 8 | private int dexLength; 9 | 10 | public DexFile() { 11 | } 12 | 13 | public DexFile(String dexName, int dexLength) { 14 | this.dexName = dexName; 15 | this.dexLength = dexLength; 16 | } 17 | 18 | public String getDexName() { 19 | return dexName; 20 | } 21 | 22 | public void setDexName(String dexName) { 23 | this.dexName = dexName; 24 | } 25 | 26 | public int getDexLength() { 27 | return dexLength; 28 | } 29 | 30 | public void setDexLength(int dexLength) { 31 | this.dexLength = dexLength; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /ReforceApk/app/src/main/java/com/reforce/shell/LogUtils.java: -------------------------------------------------------------------------------- 1 | package com.reforce.shell; 2 | 3 | import android.util.Log; 4 | 5 | import java.util.Iterator; 6 | import java.util.LinkedHashMap; 7 | import java.util.Map; 8 | 9 | /** 10 | * @author zl 11 | * @time 2019/1/7 0007. 12 | */ 13 | 14 | public class LogUtils { 15 | private final static String Tag = "PreviewProject"; 16 | private final static Map bufferLogs = new LinkedHashMap<>(); 17 | public static void d(Object msg){ 18 | Log.d(Tag,msg.toString()); 19 | } 20 | 21 | private static StringBuffer getBufferLog(int tag){ 22 | if(bufferLogs.get(tag) != null) return bufferLogs.get(tag); 23 | StringBuffer sb = new StringBuffer(); 24 | bufferLogs.put(tag,sb); 25 | return sb; 26 | } 27 | 28 | public static void clearBufferD(int tag){ 29 | StringBuffer sb = getBufferLog(tag); 30 | d(sb.toString()); 31 | bufferLogs.remove(tag); 32 | } 33 | 34 | public static void clearBufferD(){ 35 | Iterator> it = bufferLogs.entrySet().iterator(); 36 | while (it.hasNext()){ 37 | Map.Entry entry = it.next(); 38 | d("tag:"+entry.getKey()+" value:"+entry.getValue()); 39 | } 40 | } 41 | 42 | public static void bufferD(int tag, Object msg){ 43 | StringBuffer sb = getBufferLog(tag); 44 | if(sb.length() != 0) 45 | sb.append(" , "+msg); 46 | else 47 | sb.append(msg); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /ReforceApk/app/src/main/java/com/reforce/shell/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.reforce.shell; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | 6 | public class MainActivity extends Activity { 7 | 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | setContentView(R.layout.activity_main); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ReforceApk/app/src/main/java/com/reforce/shell/RefInvoke.java: -------------------------------------------------------------------------------- 1 | package com.reforce.shell; 2 | 3 | import java.lang.reflect.InvocationTargetException; 4 | import java.lang.reflect.Method; 5 | import java.lang.reflect.Field; 6 | 7 | public class RefInvoke { 8 | /** 9 | * 反射执行类的静态函数(public) 10 | * 11 | * @param class_name 12 | * 类名 13 | * @param method_name 14 | * 函数名 15 | * @param pareTyple 16 | * 函数的参数类型 17 | * @param pareVaules 18 | * 调用函数时传入的参数 19 | * @return 20 | */ 21 | @SuppressWarnings({ "unchecked", "rawtypes" }) 22 | public static Object invokeStaticMethod(String class_name, 23 | String method_name, Class[] pareTyple, Object[] pareVaules) { 24 | 25 | try { 26 | Class obj_class = Class.forName(class_name); 27 | Method method = obj_class.getMethod(method_name, pareTyple); 28 | return method.invoke(null, pareVaules); 29 | } catch (SecurityException e) { 30 | e.printStackTrace(); 31 | } catch (IllegalArgumentException e) { 32 | e.printStackTrace(); 33 | } catch (IllegalAccessException e) { 34 | e.printStackTrace(); 35 | } catch (NoSuchMethodException e) { 36 | e.printStackTrace(); 37 | } catch (InvocationTargetException e) { 38 | e.printStackTrace(); 39 | } catch (ClassNotFoundException e) { 40 | e.printStackTrace(); 41 | } 42 | return null; 43 | 44 | } 45 | 46 | /** 47 | * 反射执行类的函数(public) 48 | * 49 | * @param class_name 50 | * @param method_name 51 | * @param obj 52 | * @param pareTyple 53 | * @param pareVaules 54 | * @return 55 | */ 56 | @SuppressWarnings({ "rawtypes", "unchecked" }) 57 | public static Object invokeMethod(String class_name, String method_name, 58 | Object obj, Class[] pareTyple, Object[] pareVaules) { 59 | 60 | try { 61 | Class obj_class = Class.forName(class_name); 62 | Method method = obj_class.getMethod(method_name, pareTyple); 63 | return method.invoke(obj, pareVaules); 64 | } catch (SecurityException e) { 65 | e.printStackTrace(); 66 | } catch (IllegalArgumentException e) { 67 | e.printStackTrace(); 68 | } catch (IllegalAccessException e) { 69 | e.printStackTrace(); 70 | } catch (NoSuchMethodException e) { 71 | e.printStackTrace(); 72 | } catch (InvocationTargetException e) { 73 | e.printStackTrace(); 74 | } catch (ClassNotFoundException e) { 75 | e.printStackTrace(); 76 | } 77 | return null; 78 | 79 | } 80 | 81 | /** 82 | * 反射得到类的属性(包括私有和保护) 83 | * 84 | * @param class_name 85 | * @param obj 86 | * @param filedName 87 | * @return 88 | */ 89 | @SuppressWarnings("rawtypes") 90 | public static Object getFieldOjbect(String class_name, Object obj, 91 | String filedName) { 92 | try { 93 | Class obj_class = Class.forName(class_name); 94 | Field field = obj_class.getDeclaredField(filedName); 95 | field.setAccessible(true); 96 | return field.get(obj); 97 | } catch (SecurityException e) { 98 | e.printStackTrace(); 99 | } catch (NoSuchFieldException e) { 100 | e.printStackTrace(); 101 | } catch (IllegalArgumentException e) { 102 | e.printStackTrace(); 103 | } catch (IllegalAccessException e) { 104 | e.printStackTrace(); 105 | } catch (ClassNotFoundException e) { 106 | e.printStackTrace(); 107 | } 108 | return null; 109 | 110 | } 111 | 112 | /** 113 | * 反射得到类的静态属性(包括私有和保护) 114 | * 115 | * @param class_name 116 | * @param filedName 117 | * @return 118 | */ 119 | @SuppressWarnings("rawtypes") 120 | public static Object getStaticFieldOjbect(String class_name, 121 | String filedName) { 122 | 123 | try { 124 | Class obj_class = Class.forName(class_name); 125 | Field field = obj_class.getDeclaredField(filedName); 126 | field.setAccessible(true); 127 | return field.get(null); 128 | } catch (SecurityException e) { 129 | e.printStackTrace(); 130 | } catch (NoSuchFieldException e) { 131 | e.printStackTrace(); 132 | } catch (IllegalArgumentException e) { 133 | e.printStackTrace(); 134 | } catch (IllegalAccessException e) { 135 | e.printStackTrace(); 136 | } catch (ClassNotFoundException e) { 137 | e.printStackTrace(); 138 | } 139 | return null; 140 | 141 | } 142 | 143 | /** 144 | * 设置类的属性(包括私有和保护) 145 | * 146 | * @param classname 147 | * @param filedName 148 | * @param obj 149 | * @param filedVaule 150 | */ 151 | @SuppressWarnings("rawtypes") 152 | public static void setFieldOjbect(String classname, String filedName, 153 | Object obj, Object filedVaule) { 154 | try { 155 | Class obj_class = Class.forName(classname); 156 | Field field = obj_class.getDeclaredField(filedName); 157 | field.setAccessible(true); 158 | field.set(obj, filedVaule); 159 | } catch (SecurityException e) { 160 | e.printStackTrace(); 161 | } catch (NoSuchFieldException e) { 162 | e.printStackTrace(); 163 | } catch (IllegalArgumentException e) { 164 | e.printStackTrace(); 165 | } catch (IllegalAccessException e) { 166 | e.printStackTrace(); 167 | } catch (ClassNotFoundException e) { 168 | e.printStackTrace(); 169 | } 170 | } 171 | 172 | /** 173 | * 设置类的静态属性(包括私有和保护) 174 | * 175 | * @param class_name 176 | * @param filedName 177 | * @param filedVaule 178 | */ 179 | @SuppressWarnings("rawtypes") 180 | public static void setStaticOjbect(String class_name, String filedName, 181 | Object filedVaule) { 182 | try { 183 | Class obj_class = Class.forName(class_name); 184 | Field field = obj_class.getDeclaredField(filedName); 185 | field.setAccessible(true); 186 | field.set(null, filedVaule); 187 | } catch (SecurityException e) { 188 | e.printStackTrace(); 189 | } catch (NoSuchFieldException e) { 190 | e.printStackTrace(); 191 | } catch (IllegalArgumentException e) { 192 | e.printStackTrace(); 193 | } catch (IllegalAccessException e) { 194 | e.printStackTrace(); 195 | } catch (ClassNotFoundException e) { 196 | e.printStackTrace(); 197 | } 198 | } 199 | 200 | } 201 | -------------------------------------------------------------------------------- /ReforceApk/app/src/main/java/com/reforce/shell/SecurityUtils.java: -------------------------------------------------------------------------------- 1 | package com.reforce.shell; 2 | 3 | import java.security.InvalidKeyException; 4 | import java.security.NoSuchAlgorithmException; 5 | import java.security.SecureRandom; 6 | 7 | import javax.crypto.BadPaddingException; 8 | import javax.crypto.Cipher; 9 | import javax.crypto.IllegalBlockSizeException; 10 | import javax.crypto.KeyGenerator; 11 | import javax.crypto.NoSuchPaddingException; 12 | import javax.crypto.SecretKey; 13 | import javax.crypto.spec.IvParameterSpec; 14 | import javax.crypto.spec.SecretKeySpec; 15 | 16 | /** 17 | * @author zl 18 | * @time 2019/2/26 0026. 19 | */ 20 | public class SecurityUtils { 21 | /* 22 | * 加密 23 | * 1.构造密钥生成器 24 | * 2.根据ecnodeRules规则初始化密钥生成器 25 | * 3.产生密钥 26 | * 4.创建和初始化密码器 27 | * 5.内容加密 28 | * 6.返回字符串 29 | */ 30 | public static byte[] AESEncryption(String privateKey,String iv,String AES_TYPE,byte[] data) throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException { 31 | IvParameterSpec zeroIv = new IvParameterSpec(iv.getBytes()); 32 | //两个参数,第一个为私钥字节数组, 第二个为加密方式 AES或者DES 33 | SecretKeySpec key = new SecretKeySpec(privateKey.getBytes(), "AES"); 34 | //实例化加密类,参数为加密方式,要写全 35 | Cipher cipher = Cipher.getInstance(AES_TYPE); //PKCS5Padding比PKCS7Padding效率高,PKCS7Padding可支持IOS加解密 36 | //初始化,此方法可以采用三种方式,按加密算法要求来添加。(1)无第三个参数(2)第三个参数为SecureRandom random = new SecureRandom();中random对象,随机数。(AES不可采用这种方法)(3)采用此代码中的IVParameterSpec 37 | //加密时使用:ENCRYPT_MODE; 解密时使用:DECRYPT_MODE; 38 | cipher.init(Cipher.ENCRYPT_MODE, key); //CBC类型的可以在第三个参数传递偏移量zeroIv,ECB没有偏移量 39 | //加密操作,返回加密后的字节数组,然后需要编码。主要编解码方式有Base64, HEX, UUE,7bit等等。此处看服务器需要什么编码方式 40 | byte[] encryptedData = cipher.doFinal(data); 41 | return encryptedData; 42 | } 43 | /* 44 | * 解密 45 | * 解密过程: 46 | * 1.同加密1-4步 47 | * 2.将加密后的字符串反纺成byte[]数组 48 | * 3.将加密内容解密 49 | */ 50 | public static byte[] AESDecrypt(String privateKey,String iv,String AES_TYPE,byte[] data) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException { 51 | IvParameterSpec zeroIv = new IvParameterSpec(iv.getBytes()); 52 | SecretKeySpec key = new SecretKeySpec(privateKey.getBytes(), "AES"); 53 | Cipher cipher = Cipher.getInstance(AES_TYPE); 54 | //与加密时不同MODE:Cipher.DECRYPT_MODE 55 | cipher.init(Cipher.DECRYPT_MODE, key); //CBC类型的可以在第三个参数传递偏移量zeroIv,ECB没有偏移量 56 | byte[] decryptedData = cipher.doFinal(data); 57 | return decryptedData; 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /ReforceApk/app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /ReforceApk/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /ReforceApk/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #008577 4 | #00574B 5 | #D81B60 6 | 7 | -------------------------------------------------------------------------------- /ReforceApk/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | ReforceApk 3 | 4 | -------------------------------------------------------------------------------- /ReforceApk/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /ReforceApk/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | google() 6 | jcenter() 7 | 8 | } 9 | dependencies { 10 | classpath 'com.android.tools.build:gradle:3.3.1' 11 | 12 | // NOTE: Do not place your application dependencies here; they belong 13 | // in the individual module build.gradle files 14 | } 15 | } 16 | 17 | allprojects { 18 | repositories { 19 | google() 20 | jcenter() 21 | 22 | } 23 | } 24 | 25 | task clean(type: Delete) { 26 | delete rootProject.buildDir 27 | } 28 | -------------------------------------------------------------------------------- /ReforceApk/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx1536m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | 15 | 16 | -------------------------------------------------------------------------------- /ReforceApk/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/ReforceApk/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /ReforceApk/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Feb 21 16:34:53 GMT+08:00 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip 7 | -------------------------------------------------------------------------------- /ReforceApk/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /ReforceApk/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /ReforceApk/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /demo/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /demo/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 26 5 | buildToolsVersion "26.0.2" 6 | defaultConfig { 7 | applicationId "com.mokylin.sxqlb.huawei" 8 | minSdkVersion 14 9 | targetSdkVersion 26 10 | versionCode 1 11 | versionName "0.0.1" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | multiDexEnabled true 14 | } 15 | signingConfigs { 16 | xiyou { 17 | keyAlias 'xiyou.keystore' 18 | keyPassword 'www.52xiyou.com' 19 | storeFile file('F:/keystore/xiyou/xiyou.keystore') 20 | storePassword 'www.52xiyou.com' 21 | v2SigningEnabled false 22 | } 23 | key1 { 24 | keyAlias 'key1' 25 | keyPassword 'passworld123258' 26 | storeFile file('F:/keystore/xiyoukey1/key1.keystore') 27 | storePassword 'passworld123258' 28 | v2SigningEnabled false 29 | } 30 | mssj { 31 | keyAlias 'mssj' 32 | keyPassword 'ywmssj' 33 | storeFile file('F:/keystore/mssj/mssj.keystore') 34 | storePassword 'ywmssj' 35 | v2SigningEnabled false 36 | } 37 | zzzw { 38 | keyAlias 'zzzw' 39 | keyPassword 'gdtzzzw' 40 | storeFile file('F:/keystore/zzzw/zzzw.keystore') 41 | storePassword 'gdtzzzw' 42 | v2SigningEnabled false 43 | } 44 | } 45 | buildTypes { 46 | release { 47 | minifyEnabled false 48 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 49 | signingConfig signingConfigs.xiyou 50 | } 51 | debug { 52 | signingConfig signingConfigs.xiyou 53 | } 54 | } 55 | productFlavors { 56 | } 57 | } 58 | 59 | dependencies { 60 | compile fileTree(include: ['*.jar'], dir: 'libs') 61 | } 62 | -------------------------------------------------------------------------------- /demo/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\workeSoft\androidStudio\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /demo/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 19 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /demo/app/src/main/java/com/test/Test1.java: -------------------------------------------------------------------------------- 1 | package com.test; 2 | 3 | /** 4 | * @author zl 5 | * @time 2019/2/25 0025. 6 | */ 7 | public class Test1 { 8 | public void test0(){} 9 | public void test1(){} 10 | public void test2(){} 11 | public void test3(){} 12 | public void test4(){} 13 | public void test5(){} 14 | public void test6(){} 15 | public void test7(){} 16 | public void test8(){} 17 | public void test9(){} 18 | public void test10(){} 19 | public void test11(){} 20 | public void test12(){} 21 | public void test13(){} 22 | public void test14(){} 23 | public void test15(){} 24 | public void test16(){} 25 | public void test17(){} 26 | public void test18(){} 27 | public void test19(){} 28 | public void test20(){} 29 | public void test21(){} 30 | public void test22(){} 31 | public void test23(){} 32 | public void test24(){} 33 | public void test25(){} 34 | public void test26(){} 35 | public void test27(){} 36 | public void test28(){} 37 | public void test29(){} 38 | public void test30(){} 39 | public void test31(){} 40 | public void test32(){} 41 | public void test33(){} 42 | public void test34(){} 43 | public void test35(){} 44 | public void test36(){} 45 | public void test37(){} 46 | public void test38(){} 47 | public void test39(){} 48 | public void test40(){} 49 | public void test41(){} 50 | public void test42(){} 51 | public void test43(){} 52 | public void test44(){} 53 | public void test45(){} 54 | public void test46(){} 55 | public void test47(){} 56 | public void test48(){} 57 | public void test49(){} 58 | public void test50(){} 59 | public void test51(){} 60 | public void test52(){} 61 | public void test53(){} 62 | public void test54(){} 63 | public void test55(){} 64 | public void test56(){} 65 | public void test57(){} 66 | public void test58(){} 67 | public void test59(){} 68 | public void test60(){} 69 | public void test61(){} 70 | public void test62(){} 71 | public void test63(){} 72 | public void test64(){} 73 | public void test65(){} 74 | public void test66(){} 75 | public void test67(){} 76 | public void test68(){} 77 | public void test69(){} 78 | public void test70(){} 79 | public void test71(){} 80 | public void test72(){} 81 | public void test73(){} 82 | public void test74(){} 83 | public void test75(){} 84 | public void test76(){} 85 | public void test77(){} 86 | public void test78(){} 87 | public void test79(){} 88 | public void test80(){} 89 | public void test81(){} 90 | public void test82(){} 91 | public void test83(){} 92 | public void test84(){} 93 | public void test85(){} 94 | public void test86(){} 95 | public void test87(){} 96 | public void test88(){} 97 | public void test89(){} 98 | public void test90(){} 99 | public void test91(){} 100 | public void test92(){} 101 | public void test93(){} 102 | public void test94(){} 103 | public void test95(){} 104 | public void test96(){} 105 | public void test97(){} 106 | public void test98(){} 107 | public void test99(){} 108 | public void test100(){} 109 | public void test101(){} 110 | public void test102(){} 111 | public void test103(){} 112 | public void test104(){} 113 | public void test105(){} 114 | public void test106(){} 115 | public void test107(){} 116 | public void test108(){} 117 | public void test109(){} 118 | public void test110(){} 119 | public void test111(){} 120 | public void test112(){} 121 | public void test113(){} 122 | public void test114(){} 123 | public void test115(){} 124 | public void test116(){} 125 | public void test117(){} 126 | public void test118(){} 127 | public void test119(){} 128 | public void test120(){} 129 | public void test121(){} 130 | public void test122(){} 131 | public void test123(){} 132 | public void test124(){} 133 | public void test125(){} 134 | public void test126(){} 135 | public void test127(){} 136 | public void test128(){} 137 | public void test129(){} 138 | public void test130(){} 139 | public void test131(){} 140 | public void test132(){} 141 | public void test133(){} 142 | public void test134(){} 143 | public void test135(){} 144 | public void test136(){} 145 | public void test137(){} 146 | public void test138(){} 147 | public void test139(){} 148 | public void test140(){} 149 | public void test141(){} 150 | public void test142(){} 151 | public void test143(){} 152 | public void test144(){} 153 | public void test145(){} 154 | public void test146(){} 155 | public void test147(){} 156 | public void test148(){} 157 | public void test149(){} 158 | public void test150(){} 159 | public void test151(){} 160 | public void test152(){} 161 | public void test153(){} 162 | public void test154(){} 163 | public void test155(){} 164 | public void test156(){} 165 | public void test157(){} 166 | public void test158(){} 167 | public void test159(){} 168 | public void test160(){} 169 | public void test161(){} 170 | public void test162(){} 171 | public void test163(){} 172 | public void test164(){} 173 | public void test165(){} 174 | public void test166(){} 175 | public void test167(){} 176 | public void test168(){} 177 | public void test169(){} 178 | public void test170(){} 179 | public void test171(){} 180 | public void test172(){} 181 | public void test173(){} 182 | public void test174(){} 183 | public void test175(){} 184 | public void test176(){} 185 | public void test177(){} 186 | public void test178(){} 187 | public void test179(){} 188 | public void test180(){} 189 | public void test181(){} 190 | public void test182(){} 191 | public void test183(){} 192 | public void test184(){} 193 | public void test185(){} 194 | public void test186(){} 195 | public void test187(){} 196 | public void test188(){} 197 | public void test189(){} 198 | public void test190(){} 199 | public void test191(){} 200 | public void test192(){} 201 | public void test193(){} 202 | public void test194(){} 203 | public void test195(){} 204 | public void test196(){} 205 | public void test197(){} 206 | public void test198(){} 207 | public void test199(){} 208 | public void test200(){} 209 | public void test201(){} 210 | public void test202(){} 211 | public void test203(){} 212 | public void test204(){} 213 | public void test205(){} 214 | public void test206(){} 215 | public void test207(){} 216 | public void test208(){} 217 | public void test209(){} 218 | public void test210(){} 219 | public void test211(){} 220 | public void test212(){} 221 | public void test213(){} 222 | public void test214(){} 223 | public void test215(){} 224 | public void test216(){} 225 | public void test217(){} 226 | public void test218(){} 227 | public void test219(){} 228 | public void test220(){} 229 | public void test221(){} 230 | public void test222(){} 231 | public void test223(){} 232 | public void test224(){} 233 | public void test225(){} 234 | public void test226(){} 235 | public void test227(){} 236 | public void test228(){} 237 | public void test229(){} 238 | public void test230(){} 239 | public void test231(){} 240 | public void test232(){} 241 | public void test233(){} 242 | public void test234(){} 243 | public void test235(){} 244 | public void test236(){} 245 | public void test237(){} 246 | public void test238(){} 247 | public void test239(){} 248 | public void test240(){} 249 | public void test241(){} 250 | public void test242(){} 251 | public void test243(){} 252 | public void test244(){} 253 | public void test245(){} 254 | public void test246(){} 255 | public void test247(){} 256 | public void test248(){} 257 | public void test249(){} 258 | public void test250(){} 259 | public void test251(){} 260 | public void test252(){} 261 | public void test253(){} 262 | public void test254(){} 263 | public void test255(){} 264 | public void test256(){} 265 | public void test257(){} 266 | public void test258(){} 267 | public void test259(){} 268 | public void test260(){} 269 | public void test261(){} 270 | public void test262(){} 271 | public void test263(){} 272 | public void test264(){} 273 | public void test265(){} 274 | public void test266(){} 275 | public void test267(){} 276 | public void test268(){} 277 | public void test269(){} 278 | public void test270(){} 279 | public void test271(){} 280 | public void test272(){} 281 | public void test273(){} 282 | public void test274(){} 283 | public void test275(){} 284 | public void test276(){} 285 | public void test277(){} 286 | public void test278(){} 287 | public void test279(){} 288 | public void test280(){} 289 | public void test281(){} 290 | public void test282(){} 291 | public void test283(){} 292 | public void test284(){} 293 | public void test285(){} 294 | public void test286(){} 295 | public void test287(){} 296 | public void test288(){} 297 | public void test289(){} 298 | public void test290(){} 299 | public void test291(){} 300 | public void test292(){} 301 | public void test293(){} 302 | public void test294(){} 303 | public void test295(){} 304 | public void test296(){} 305 | public void test297(){} 306 | public void test298(){} 307 | public void test299(){} 308 | public void test300(){} 309 | public void test301(){} 310 | public void test302(){} 311 | public void test303(){} 312 | public void test304(){} 313 | public void test305(){} 314 | public void test306(){} 315 | public void test307(){} 316 | public void test308(){} 317 | public void test309(){} 318 | public void test310(){} 319 | public void test311(){} 320 | public void test312(){} 321 | public void test313(){} 322 | public void test314(){} 323 | public void test315(){} 324 | public void test316(){} 325 | public void test317(){} 326 | public void test318(){} 327 | public void test319(){} 328 | public void test320(){} 329 | public void test321(){} 330 | public void test322(){} 331 | public void test323(){} 332 | public void test324(){} 333 | public void test325(){} 334 | public void test326(){} 335 | public void test327(){} 336 | public void test328(){} 337 | public void test329(){} 338 | public void test330(){} 339 | public void test331(){} 340 | public void test332(){} 341 | public void test333(){} 342 | public void test334(){} 343 | public void test335(){} 344 | public void test336(){} 345 | public void test337(){} 346 | public void test338(){} 347 | public void test339(){} 348 | public void test340(){} 349 | public void test341(){} 350 | public void test342(){} 351 | public void test343(){} 352 | public void test344(){} 353 | public void test345(){} 354 | public void test346(){} 355 | public void test347(){} 356 | public void test348(){} 357 | public void test349(){} 358 | public void test350(){} 359 | public void test351(){} 360 | public void test352(){} 361 | public void test353(){} 362 | public void test354(){} 363 | public void test355(){} 364 | public void test356(){} 365 | public void test357(){} 366 | public void test358(){} 367 | public void test359(){} 368 | public void test360(){} 369 | public void test361(){} 370 | public void test362(){} 371 | public void test363(){} 372 | public void test364(){} 373 | public void test365(){} 374 | public void test366(){} 375 | public void test367(){} 376 | public void test368(){} 377 | public void test369(){} 378 | public void test370(){} 379 | public void test371(){} 380 | public void test372(){} 381 | public void test373(){} 382 | public void test374(){} 383 | public void test375(){} 384 | public void test376(){} 385 | public void test377(){} 386 | public void test378(){} 387 | public void test379(){} 388 | public void test380(){} 389 | public void test381(){} 390 | public void test382(){} 391 | public void test383(){} 392 | public void test384(){} 393 | public void test385(){} 394 | public void test386(){} 395 | public void test387(){} 396 | public void test388(){} 397 | public void test389(){} 398 | public void test390(){} 399 | public void test391(){} 400 | public void test392(){} 401 | public void test393(){} 402 | public void test394(){} 403 | public void test395(){} 404 | public void test396(){} 405 | public void test397(){} 406 | public void test398(){} 407 | public void test399(){} 408 | public void test400(){} 409 | public void test401(){} 410 | public void test402(){} 411 | public void test403(){} 412 | public void test404(){} 413 | public void test405(){} 414 | public void test406(){} 415 | public void test407(){} 416 | public void test408(){} 417 | public void test409(){} 418 | public void test410(){} 419 | public void test411(){} 420 | public void test412(){} 421 | public void test413(){} 422 | public void test414(){} 423 | public void test415(){} 424 | public void test416(){} 425 | public void test417(){} 426 | public void test418(){} 427 | public void test419(){} 428 | public void test420(){} 429 | public void test421(){} 430 | public void test422(){} 431 | public void test423(){} 432 | public void test424(){} 433 | public void test425(){} 434 | public void test426(){} 435 | public void test427(){} 436 | public void test428(){} 437 | public void test429(){} 438 | public void test430(){} 439 | public void test431(){} 440 | public void test432(){} 441 | public void test433(){} 442 | public void test434(){} 443 | public void test435(){} 444 | public void test436(){} 445 | public void test437(){} 446 | public void test438(){} 447 | public void test439(){} 448 | public void test440(){} 449 | public void test441(){} 450 | public void test442(){} 451 | public void test443(){} 452 | public void test444(){} 453 | public void test445(){} 454 | public void test446(){} 455 | public void test447(){} 456 | public void test448(){} 457 | public void test449(){} 458 | public void test450(){} 459 | public void test451(){} 460 | public void test452(){} 461 | public void test453(){} 462 | public void test454(){} 463 | public void test455(){} 464 | public void test456(){} 465 | public void test457(){} 466 | public void test458(){} 467 | public void test459(){} 468 | public void test460(){} 469 | public void test461(){} 470 | public void test462(){} 471 | public void test463(){} 472 | public void test464(){} 473 | public void test465(){} 474 | public void test466(){} 475 | public void test467(){} 476 | public void test468(){} 477 | public void test469(){} 478 | public void test470(){} 479 | public void test471(){} 480 | public void test472(){} 481 | public void test473(){} 482 | public void test474(){} 483 | public void test475(){} 484 | public void test476(){} 485 | public void test477(){} 486 | public void test478(){} 487 | public void test479(){} 488 | public void test480(){} 489 | public void test481(){} 490 | public void test482(){} 491 | public void test483(){} 492 | public void test484(){} 493 | public void test485(){} 494 | public void test486(){} 495 | public void test487(){} 496 | public void test488(){} 497 | public void test489(){} 498 | public void test490(){} 499 | public void test491(){} 500 | public void test492(){} 501 | public void test493(){} 502 | public void test494(){} 503 | public void test495(){} 504 | public void test496(){} 505 | public void test497(){} 506 | public void test498(){} 507 | public void test499(){} 508 | } 509 | -------------------------------------------------------------------------------- /demo/app/src/main/java/com/test/Test10.java: -------------------------------------------------------------------------------- 1 | package com.test; 2 | 3 | /** 4 | * @author zl 5 | * @time 2019/2/25 0025. 6 | */ 7 | public class Test10 { 8 | public void test0(){} 9 | public void test1(){} 10 | public void test2(){} 11 | public void test3(){} 12 | public void test4(){} 13 | public void test5(){} 14 | public void test6(){} 15 | public void test7(){} 16 | public void test8(){} 17 | public void test9(){} 18 | public void test10(){} 19 | public void test11(){} 20 | public void test12(){} 21 | public void test13(){} 22 | public void test14(){} 23 | public void test15(){} 24 | public void test16(){} 25 | public void test17(){} 26 | public void test18(){} 27 | public void test19(){} 28 | public void test20(){} 29 | public void test21(){} 30 | public void test22(){} 31 | public void test23(){} 32 | public void test24(){} 33 | public void test25(){} 34 | public void test26(){} 35 | public void test27(){} 36 | public void test28(){} 37 | public void test29(){} 38 | public void test30(){} 39 | public void test31(){} 40 | public void test32(){} 41 | public void test33(){} 42 | public void test34(){} 43 | public void test35(){} 44 | public void test36(){} 45 | public void test37(){} 46 | public void test38(){} 47 | public void test39(){} 48 | public void test40(){} 49 | public void test41(){} 50 | public void test42(){} 51 | public void test43(){} 52 | public void test44(){} 53 | public void test45(){} 54 | public void test46(){} 55 | public void test47(){} 56 | public void test48(){} 57 | public void test49(){} 58 | public void test50(){} 59 | public void test51(){} 60 | public void test52(){} 61 | public void test53(){} 62 | public void test54(){} 63 | public void test55(){} 64 | public void test56(){} 65 | public void test57(){} 66 | public void test58(){} 67 | public void test59(){} 68 | public void test60(){} 69 | public void test61(){} 70 | public void test62(){} 71 | public void test63(){} 72 | public void test64(){} 73 | public void test65(){} 74 | public void test66(){} 75 | public void test67(){} 76 | public void test68(){} 77 | public void test69(){} 78 | public void test70(){} 79 | public void test71(){} 80 | public void test72(){} 81 | public void test73(){} 82 | public void test74(){} 83 | public void test75(){} 84 | public void test76(){} 85 | public void test77(){} 86 | public void test78(){} 87 | public void test79(){} 88 | public void test80(){} 89 | public void test81(){} 90 | public void test82(){} 91 | public void test83(){} 92 | public void test84(){} 93 | public void test85(){} 94 | public void test86(){} 95 | public void test87(){} 96 | public void test88(){} 97 | public void test89(){} 98 | public void test90(){} 99 | public void test91(){} 100 | public void test92(){} 101 | public void test93(){} 102 | public void test94(){} 103 | public void test95(){} 104 | public void test96(){} 105 | public void test97(){} 106 | public void test98(){} 107 | public void test99(){} 108 | public void test100(){} 109 | public void test101(){} 110 | public void test102(){} 111 | public void test103(){} 112 | public void test104(){} 113 | public void test105(){} 114 | public void test106(){} 115 | public void test107(){} 116 | public void test108(){} 117 | public void test109(){} 118 | public void test110(){} 119 | public void test111(){} 120 | public void test112(){} 121 | public void test113(){} 122 | public void test114(){} 123 | public void test115(){} 124 | public void test116(){} 125 | public void test117(){} 126 | public void test118(){} 127 | public void test119(){} 128 | public void test120(){} 129 | public void test121(){} 130 | public void test122(){} 131 | public void test123(){} 132 | public void test124(){} 133 | public void test125(){} 134 | public void test126(){} 135 | public void test127(){} 136 | public void test128(){} 137 | public void test129(){} 138 | public void test130(){} 139 | public void test131(){} 140 | public void test132(){} 141 | public void test133(){} 142 | public void test134(){} 143 | public void test135(){} 144 | public void test136(){} 145 | public void test137(){} 146 | public void test138(){} 147 | public void test139(){} 148 | public void test140(){} 149 | public void test141(){} 150 | public void test142(){} 151 | public void test143(){} 152 | public void test144(){} 153 | public void test145(){} 154 | public void test146(){} 155 | public void test147(){} 156 | public void test148(){} 157 | public void test149(){} 158 | public void test150(){} 159 | public void test151(){} 160 | public void test152(){} 161 | public void test153(){} 162 | public void test154(){} 163 | public void test155(){} 164 | public void test156(){} 165 | public void test157(){} 166 | public void test158(){} 167 | public void test159(){} 168 | public void test160(){} 169 | public void test161(){} 170 | public void test162(){} 171 | public void test163(){} 172 | public void test164(){} 173 | public void test165(){} 174 | public void test166(){} 175 | public void test167(){} 176 | public void test168(){} 177 | public void test169(){} 178 | public void test170(){} 179 | public void test171(){} 180 | public void test172(){} 181 | public void test173(){} 182 | public void test174(){} 183 | public void test175(){} 184 | public void test176(){} 185 | public void test177(){} 186 | public void test178(){} 187 | public void test179(){} 188 | public void test180(){} 189 | public void test181(){} 190 | public void test182(){} 191 | public void test183(){} 192 | public void test184(){} 193 | public void test185(){} 194 | public void test186(){} 195 | public void test187(){} 196 | public void test188(){} 197 | public void test189(){} 198 | public void test190(){} 199 | public void test191(){} 200 | public void test192(){} 201 | public void test193(){} 202 | public void test194(){} 203 | public void test195(){} 204 | public void test196(){} 205 | public void test197(){} 206 | public void test198(){} 207 | public void test199(){} 208 | public void test200(){} 209 | public void test201(){} 210 | public void test202(){} 211 | public void test203(){} 212 | public void test204(){} 213 | public void test205(){} 214 | public void test206(){} 215 | public void test207(){} 216 | public void test208(){} 217 | public void test209(){} 218 | public void test210(){} 219 | public void test211(){} 220 | public void test212(){} 221 | public void test213(){} 222 | public void test214(){} 223 | public void test215(){} 224 | public void test216(){} 225 | public void test217(){} 226 | public void test218(){} 227 | public void test219(){} 228 | public void test220(){} 229 | public void test221(){} 230 | public void test222(){} 231 | public void test223(){} 232 | public void test224(){} 233 | public void test225(){} 234 | public void test226(){} 235 | public void test227(){} 236 | public void test228(){} 237 | public void test229(){} 238 | public void test230(){} 239 | public void test231(){} 240 | public void test232(){} 241 | public void test233(){} 242 | public void test234(){} 243 | public void test235(){} 244 | public void test236(){} 245 | public void test237(){} 246 | public void test238(){} 247 | public void test239(){} 248 | public void test240(){} 249 | public void test241(){} 250 | public void test242(){} 251 | public void test243(){} 252 | public void test244(){} 253 | public void test245(){} 254 | public void test246(){} 255 | public void test247(){} 256 | public void test248(){} 257 | public void test249(){} 258 | public void test250(){} 259 | public void test251(){} 260 | public void test252(){} 261 | public void test253(){} 262 | public void test254(){} 263 | public void test255(){} 264 | public void test256(){} 265 | public void test257(){} 266 | public void test258(){} 267 | public void test259(){} 268 | public void test260(){} 269 | public void test261(){} 270 | public void test262(){} 271 | public void test263(){} 272 | public void test264(){} 273 | public void test265(){} 274 | public void test266(){} 275 | public void test267(){} 276 | public void test268(){} 277 | public void test269(){} 278 | public void test270(){} 279 | public void test271(){} 280 | public void test272(){} 281 | public void test273(){} 282 | public void test274(){} 283 | public void test275(){} 284 | public void test276(){} 285 | public void test277(){} 286 | public void test278(){} 287 | public void test279(){} 288 | public void test280(){} 289 | public void test281(){} 290 | public void test282(){} 291 | public void test283(){} 292 | public void test284(){} 293 | public void test285(){} 294 | public void test286(){} 295 | public void test287(){} 296 | public void test288(){} 297 | public void test289(){} 298 | public void test290(){} 299 | public void test291(){} 300 | public void test292(){} 301 | public void test293(){} 302 | public void test294(){} 303 | public void test295(){} 304 | public void test296(){} 305 | public void test297(){} 306 | public void test298(){} 307 | public void test299(){} 308 | public void test300(){} 309 | public void test301(){} 310 | public void test302(){} 311 | public void test303(){} 312 | public void test304(){} 313 | public void test305(){} 314 | public void test306(){} 315 | public void test307(){} 316 | public void test308(){} 317 | public void test309(){} 318 | public void test310(){} 319 | public void test311(){} 320 | public void test312(){} 321 | public void test313(){} 322 | public void test314(){} 323 | public void test315(){} 324 | public void test316(){} 325 | public void test317(){} 326 | public void test318(){} 327 | public void test319(){} 328 | public void test320(){} 329 | public void test321(){} 330 | public void test322(){} 331 | public void test323(){} 332 | public void test324(){} 333 | public void test325(){} 334 | public void test326(){} 335 | public void test327(){} 336 | public void test328(){} 337 | public void test329(){} 338 | public void test330(){} 339 | public void test331(){} 340 | public void test332(){} 341 | public void test333(){} 342 | public void test334(){} 343 | public void test335(){} 344 | public void test336(){} 345 | public void test337(){} 346 | public void test338(){} 347 | public void test339(){} 348 | public void test340(){} 349 | public void test341(){} 350 | public void test342(){} 351 | public void test343(){} 352 | public void test344(){} 353 | public void test345(){} 354 | public void test346(){} 355 | public void test347(){} 356 | public void test348(){} 357 | public void test349(){} 358 | public void test350(){} 359 | public void test351(){} 360 | public void test352(){} 361 | public void test353(){} 362 | public void test354(){} 363 | public void test355(){} 364 | public void test356(){} 365 | public void test357(){} 366 | public void test358(){} 367 | public void test359(){} 368 | public void test360(){} 369 | public void test361(){} 370 | public void test362(){} 371 | public void test363(){} 372 | public void test364(){} 373 | public void test365(){} 374 | public void test366(){} 375 | public void test367(){} 376 | public void test368(){} 377 | public void test369(){} 378 | public void test370(){} 379 | public void test371(){} 380 | public void test372(){} 381 | public void test373(){} 382 | public void test374(){} 383 | public void test375(){} 384 | public void test376(){} 385 | public void test377(){} 386 | public void test378(){} 387 | public void test379(){} 388 | public void test380(){} 389 | public void test381(){} 390 | public void test382(){} 391 | public void test383(){} 392 | public void test384(){} 393 | public void test385(){} 394 | public void test386(){} 395 | public void test387(){} 396 | public void test388(){} 397 | public void test389(){} 398 | public void test390(){} 399 | public void test391(){} 400 | public void test392(){} 401 | public void test393(){} 402 | public void test394(){} 403 | public void test395(){} 404 | public void test396(){} 405 | public void test397(){} 406 | public void test398(){} 407 | public void test399(){} 408 | public void test400(){} 409 | public void test401(){} 410 | public void test402(){} 411 | public void test403(){} 412 | public void test404(){} 413 | public void test405(){} 414 | public void test406(){} 415 | public void test407(){} 416 | public void test408(){} 417 | public void test409(){} 418 | public void test410(){} 419 | public void test411(){} 420 | public void test412(){} 421 | public void test413(){} 422 | public void test414(){} 423 | public void test415(){} 424 | public void test416(){} 425 | public void test417(){} 426 | public void test418(){} 427 | public void test419(){} 428 | public void test420(){} 429 | public void test421(){} 430 | public void test422(){} 431 | public void test423(){} 432 | public void test424(){} 433 | public void test425(){} 434 | public void test426(){} 435 | public void test427(){} 436 | public void test428(){} 437 | public void test429(){} 438 | public void test430(){} 439 | public void test431(){} 440 | public void test432(){} 441 | public void test433(){} 442 | public void test434(){} 443 | public void test435(){} 444 | public void test436(){} 445 | public void test437(){} 446 | public void test438(){} 447 | public void test439(){} 448 | public void test440(){} 449 | public void test441(){} 450 | public void test442(){} 451 | public void test443(){} 452 | public void test444(){} 453 | public void test445(){} 454 | public void test446(){} 455 | public void test447(){} 456 | public void test448(){} 457 | public void test449(){} 458 | public void test450(){} 459 | public void test451(){} 460 | public void test452(){} 461 | public void test453(){} 462 | public void test454(){} 463 | public void test455(){} 464 | public void test456(){} 465 | public void test457(){} 466 | public void test458(){} 467 | public void test459(){} 468 | public void test460(){} 469 | public void test461(){} 470 | public void test462(){} 471 | public void test463(){} 472 | public void test464(){} 473 | public void test465(){} 474 | public void test466(){} 475 | public void test467(){} 476 | public void test468(){} 477 | public void test469(){} 478 | public void test470(){} 479 | public void test471(){} 480 | public void test472(){} 481 | public void test473(){} 482 | public void test474(){} 483 | public void test475(){} 484 | public void test476(){} 485 | public void test477(){} 486 | public void test478(){} 487 | public void test479(){} 488 | public void test480(){} 489 | public void test481(){} 490 | public void test482(){} 491 | public void test483(){} 492 | public void test484(){} 493 | public void test485(){} 494 | public void test486(){} 495 | public void test487(){} 496 | public void test488(){} 497 | public void test489(){} 498 | public void test490(){} 499 | public void test491(){} 500 | public void test492(){} 501 | public void test493(){} 502 | public void test494(){} 503 | public void test495(){} 504 | public void test496(){} 505 | public void test497(){} 506 | public void test498(){} 507 | public void test499(){} 508 | } 509 | -------------------------------------------------------------------------------- /demo/app/src/main/java/com/test/Test11.java: -------------------------------------------------------------------------------- 1 | package com.test; 2 | 3 | /** 4 | * @author zl 5 | * @time 2019/2/25 0025. 6 | */ 7 | public class Test11 { 8 | public void test0(){} 9 | public void test1(){} 10 | public void test2(){} 11 | public void test3(){} 12 | public void test4(){} 13 | public void test5(){} 14 | public void test6(){} 15 | public void test7(){} 16 | public void test8(){} 17 | public void test9(){} 18 | public void test10(){} 19 | public void test11(){} 20 | public void test12(){} 21 | public void test13(){} 22 | public void test14(){} 23 | public void test15(){} 24 | public void test16(){} 25 | public void test17(){} 26 | public void test18(){} 27 | public void test19(){} 28 | public void test20(){} 29 | public void test21(){} 30 | public void test22(){} 31 | public void test23(){} 32 | public void test24(){} 33 | public void test25(){} 34 | public void test26(){} 35 | public void test27(){} 36 | public void test28(){} 37 | public void test29(){} 38 | public void test30(){} 39 | public void test31(){} 40 | public void test32(){} 41 | public void test33(){} 42 | public void test34(){} 43 | public void test35(){} 44 | public void test36(){} 45 | public void test37(){} 46 | public void test38(){} 47 | public void test39(){} 48 | public void test40(){} 49 | public void test41(){} 50 | public void test42(){} 51 | public void test43(){} 52 | public void test44(){} 53 | public void test45(){} 54 | public void test46(){} 55 | public void test47(){} 56 | public void test48(){} 57 | public void test49(){} 58 | public void test50(){} 59 | public void test51(){} 60 | public void test52(){} 61 | public void test53(){} 62 | public void test54(){} 63 | public void test55(){} 64 | public void test56(){} 65 | public void test57(){} 66 | public void test58(){} 67 | public void test59(){} 68 | public void test60(){} 69 | public void test61(){} 70 | public void test62(){} 71 | public void test63(){} 72 | public void test64(){} 73 | public void test65(){} 74 | public void test66(){} 75 | public void test67(){} 76 | public void test68(){} 77 | public void test69(){} 78 | public void test70(){} 79 | public void test71(){} 80 | public void test72(){} 81 | public void test73(){} 82 | public void test74(){} 83 | public void test75(){} 84 | public void test76(){} 85 | public void test77(){} 86 | public void test78(){} 87 | public void test79(){} 88 | public void test80(){} 89 | public void test81(){} 90 | public void test82(){} 91 | public void test83(){} 92 | public void test84(){} 93 | public void test85(){} 94 | public void test86(){} 95 | public void test87(){} 96 | public void test88(){} 97 | public void test89(){} 98 | public void test90(){} 99 | public void test91(){} 100 | public void test92(){} 101 | public void test93(){} 102 | public void test94(){} 103 | public void test95(){} 104 | public void test96(){} 105 | public void test97(){} 106 | public void test98(){} 107 | public void test99(){} 108 | public void test100(){} 109 | public void test101(){} 110 | public void test102(){} 111 | public void test103(){} 112 | public void test104(){} 113 | public void test105(){} 114 | public void test106(){} 115 | public void test107(){} 116 | public void test108(){} 117 | public void test109(){} 118 | public void test110(){} 119 | public void test111(){} 120 | public void test112(){} 121 | public void test113(){} 122 | public void test114(){} 123 | public void test115(){} 124 | public void test116(){} 125 | public void test117(){} 126 | public void test118(){} 127 | public void test119(){} 128 | public void test120(){} 129 | public void test121(){} 130 | public void test122(){} 131 | public void test123(){} 132 | public void test124(){} 133 | public void test125(){} 134 | public void test126(){} 135 | public void test127(){} 136 | public void test128(){} 137 | public void test129(){} 138 | public void test130(){} 139 | public void test131(){} 140 | public void test132(){} 141 | public void test133(){} 142 | public void test134(){} 143 | public void test135(){} 144 | public void test136(){} 145 | public void test137(){} 146 | public void test138(){} 147 | public void test139(){} 148 | public void test140(){} 149 | public void test141(){} 150 | public void test142(){} 151 | public void test143(){} 152 | public void test144(){} 153 | public void test145(){} 154 | public void test146(){} 155 | public void test147(){} 156 | public void test148(){} 157 | public void test149(){} 158 | public void test150(){} 159 | public void test151(){} 160 | public void test152(){} 161 | public void test153(){} 162 | public void test154(){} 163 | public void test155(){} 164 | public void test156(){} 165 | public void test157(){} 166 | public void test158(){} 167 | public void test159(){} 168 | public void test160(){} 169 | public void test161(){} 170 | public void test162(){} 171 | public void test163(){} 172 | public void test164(){} 173 | public void test165(){} 174 | public void test166(){} 175 | public void test167(){} 176 | public void test168(){} 177 | public void test169(){} 178 | public void test170(){} 179 | public void test171(){} 180 | public void test172(){} 181 | public void test173(){} 182 | public void test174(){} 183 | public void test175(){} 184 | public void test176(){} 185 | public void test177(){} 186 | public void test178(){} 187 | public void test179(){} 188 | public void test180(){} 189 | public void test181(){} 190 | public void test182(){} 191 | public void test183(){} 192 | public void test184(){} 193 | public void test185(){} 194 | public void test186(){} 195 | public void test187(){} 196 | public void test188(){} 197 | public void test189(){} 198 | public void test190(){} 199 | public void test191(){} 200 | public void test192(){} 201 | public void test193(){} 202 | public void test194(){} 203 | public void test195(){} 204 | public void test196(){} 205 | public void test197(){} 206 | public void test198(){} 207 | public void test199(){} 208 | public void test200(){} 209 | public void test201(){} 210 | public void test202(){} 211 | public void test203(){} 212 | public void test204(){} 213 | public void test205(){} 214 | public void test206(){} 215 | public void test207(){} 216 | public void test208(){} 217 | public void test209(){} 218 | public void test210(){} 219 | public void test211(){} 220 | public void test212(){} 221 | public void test213(){} 222 | public void test214(){} 223 | public void test215(){} 224 | public void test216(){} 225 | public void test217(){} 226 | public void test218(){} 227 | public void test219(){} 228 | public void test220(){} 229 | public void test221(){} 230 | public void test222(){} 231 | public void test223(){} 232 | public void test224(){} 233 | public void test225(){} 234 | public void test226(){} 235 | public void test227(){} 236 | public void test228(){} 237 | public void test229(){} 238 | public void test230(){} 239 | public void test231(){} 240 | public void test232(){} 241 | public void test233(){} 242 | public void test234(){} 243 | public void test235(){} 244 | public void test236(){} 245 | public void test237(){} 246 | public void test238(){} 247 | public void test239(){} 248 | public void test240(){} 249 | public void test241(){} 250 | public void test242(){} 251 | public void test243(){} 252 | public void test244(){} 253 | public void test245(){} 254 | public void test246(){} 255 | public void test247(){} 256 | public void test248(){} 257 | public void test249(){} 258 | public void test250(){} 259 | public void test251(){} 260 | public void test252(){} 261 | public void test253(){} 262 | public void test254(){} 263 | public void test255(){} 264 | public void test256(){} 265 | public void test257(){} 266 | public void test258(){} 267 | public void test259(){} 268 | public void test260(){} 269 | public void test261(){} 270 | public void test262(){} 271 | public void test263(){} 272 | public void test264(){} 273 | public void test265(){} 274 | public void test266(){} 275 | public void test267(){} 276 | public void test268(){} 277 | public void test269(){} 278 | public void test270(){} 279 | public void test271(){} 280 | public void test272(){} 281 | public void test273(){} 282 | public void test274(){} 283 | public void test275(){} 284 | public void test276(){} 285 | public void test277(){} 286 | public void test278(){} 287 | public void test279(){} 288 | public void test280(){} 289 | public void test281(){} 290 | public void test282(){} 291 | public void test283(){} 292 | public void test284(){} 293 | public void test285(){} 294 | public void test286(){} 295 | public void test287(){} 296 | public void test288(){} 297 | public void test289(){} 298 | public void test290(){} 299 | public void test291(){} 300 | public void test292(){} 301 | public void test293(){} 302 | public void test294(){} 303 | public void test295(){} 304 | public void test296(){} 305 | public void test297(){} 306 | public void test298(){} 307 | public void test299(){} 308 | public void test300(){} 309 | public void test301(){} 310 | public void test302(){} 311 | public void test303(){} 312 | public void test304(){} 313 | public void test305(){} 314 | public void test306(){} 315 | public void test307(){} 316 | public void test308(){} 317 | public void test309(){} 318 | public void test310(){} 319 | public void test311(){} 320 | public void test312(){} 321 | public void test313(){} 322 | public void test314(){} 323 | public void test315(){} 324 | public void test316(){} 325 | public void test317(){} 326 | public void test318(){} 327 | public void test319(){} 328 | public void test320(){} 329 | public void test321(){} 330 | public void test322(){} 331 | public void test323(){} 332 | public void test324(){} 333 | public void test325(){} 334 | public void test326(){} 335 | public void test327(){} 336 | public void test328(){} 337 | public void test329(){} 338 | public void test330(){} 339 | public void test331(){} 340 | public void test332(){} 341 | public void test333(){} 342 | public void test334(){} 343 | public void test335(){} 344 | public void test336(){} 345 | public void test337(){} 346 | public void test338(){} 347 | public void test339(){} 348 | public void test340(){} 349 | public void test341(){} 350 | public void test342(){} 351 | public void test343(){} 352 | public void test344(){} 353 | public void test345(){} 354 | public void test346(){} 355 | public void test347(){} 356 | public void test348(){} 357 | public void test349(){} 358 | public void test350(){} 359 | public void test351(){} 360 | public void test352(){} 361 | public void test353(){} 362 | public void test354(){} 363 | public void test355(){} 364 | public void test356(){} 365 | public void test357(){} 366 | public void test358(){} 367 | public void test359(){} 368 | public void test360(){} 369 | public void test361(){} 370 | public void test362(){} 371 | public void test363(){} 372 | public void test364(){} 373 | public void test365(){} 374 | public void test366(){} 375 | public void test367(){} 376 | public void test368(){} 377 | public void test369(){} 378 | public void test370(){} 379 | public void test371(){} 380 | public void test372(){} 381 | public void test373(){} 382 | public void test374(){} 383 | public void test375(){} 384 | public void test376(){} 385 | public void test377(){} 386 | public void test378(){} 387 | public void test379(){} 388 | public void test380(){} 389 | public void test381(){} 390 | public void test382(){} 391 | public void test383(){} 392 | public void test384(){} 393 | public void test385(){} 394 | public void test386(){} 395 | public void test387(){} 396 | public void test388(){} 397 | public void test389(){} 398 | public void test390(){} 399 | public void test391(){} 400 | public void test392(){} 401 | public void test393(){} 402 | public void test394(){} 403 | public void test395(){} 404 | public void test396(){} 405 | public void test397(){} 406 | public void test398(){} 407 | public void test399(){} 408 | public void test400(){} 409 | public void test401(){} 410 | public void test402(){} 411 | public void test403(){} 412 | public void test404(){} 413 | public void test405(){} 414 | public void test406(){} 415 | public void test407(){} 416 | public void test408(){} 417 | public void test409(){} 418 | public void test410(){} 419 | public void test411(){} 420 | public void test412(){} 421 | public void test413(){} 422 | public void test414(){} 423 | public void test415(){} 424 | public void test416(){} 425 | public void test417(){} 426 | public void test418(){} 427 | public void test419(){} 428 | public void test420(){} 429 | public void test421(){} 430 | public void test422(){} 431 | public void test423(){} 432 | public void test424(){} 433 | public void test425(){} 434 | public void test426(){} 435 | public void test427(){} 436 | public void test428(){} 437 | public void test429(){} 438 | public void test430(){} 439 | public void test431(){} 440 | public void test432(){} 441 | public void test433(){} 442 | public void test434(){} 443 | public void test435(){} 444 | public void test436(){} 445 | public void test437(){} 446 | public void test438(){} 447 | public void test439(){} 448 | public void test440(){} 449 | public void test441(){} 450 | public void test442(){} 451 | public void test443(){} 452 | public void test444(){} 453 | public void test445(){} 454 | public void test446(){} 455 | public void test447(){} 456 | public void test448(){} 457 | public void test449(){} 458 | public void test450(){} 459 | public void test451(){} 460 | public void test452(){} 461 | public void test453(){} 462 | public void test454(){} 463 | public void test455(){} 464 | public void test456(){} 465 | public void test457(){} 466 | public void test458(){} 467 | public void test459(){} 468 | public void test460(){} 469 | public void test461(){} 470 | public void test462(){} 471 | public void test463(){} 472 | public void test464(){} 473 | public void test465(){} 474 | public void test466(){} 475 | public void test467(){} 476 | public void test468(){} 477 | public void test469(){} 478 | public void test470(){} 479 | public void test471(){} 480 | public void test472(){} 481 | public void test473(){} 482 | public void test474(){} 483 | public void test475(){} 484 | public void test476(){} 485 | public void test477(){} 486 | public void test478(){} 487 | public void test479(){} 488 | public void test480(){} 489 | public void test481(){} 490 | public void test482(){} 491 | public void test483(){} 492 | public void test484(){} 493 | public void test485(){} 494 | public void test486(){} 495 | public void test487(){} 496 | public void test488(){} 497 | public void test489(){} 498 | public void test490(){} 499 | public void test491(){} 500 | public void test492(){} 501 | public void test493(){} 502 | public void test494(){} 503 | public void test495(){} 504 | public void test496(){} 505 | public void test497(){} 506 | public void test498(){} 507 | public void test499(){} 508 | } 509 | -------------------------------------------------------------------------------- /demo/app/src/main/java/com/test/Test12.java: -------------------------------------------------------------------------------- 1 | package com.test; 2 | 3 | /** 4 | * @author zl 5 | * @time 2019/2/25 0025. 6 | */ 7 | public class Test12 { 8 | public void test0(){} 9 | public void test1(){} 10 | public void test2(){} 11 | public void test3(){} 12 | public void test4(){} 13 | public void test5(){} 14 | public void test6(){} 15 | public void test7(){} 16 | public void test8(){} 17 | public void test9(){} 18 | public void test10(){} 19 | public void test11(){} 20 | public void test12(){} 21 | public void test13(){} 22 | public void test14(){} 23 | public void test15(){} 24 | public void test16(){} 25 | public void test17(){} 26 | public void test18(){} 27 | public void test19(){} 28 | public void test20(){} 29 | public void test21(){} 30 | public void test22(){} 31 | public void test23(){} 32 | public void test24(){} 33 | public void test25(){} 34 | public void test26(){} 35 | public void test27(){} 36 | public void test28(){} 37 | public void test29(){} 38 | public void test30(){} 39 | public void test31(){} 40 | public void test32(){} 41 | public void test33(){} 42 | public void test34(){} 43 | public void test35(){} 44 | public void test36(){} 45 | public void test37(){} 46 | public void test38(){} 47 | public void test39(){} 48 | public void test40(){} 49 | public void test41(){} 50 | public void test42(){} 51 | public void test43(){} 52 | public void test44(){} 53 | public void test45(){} 54 | public void test46(){} 55 | public void test47(){} 56 | public void test48(){} 57 | public void test49(){} 58 | public void test50(){} 59 | public void test51(){} 60 | public void test52(){} 61 | public void test53(){} 62 | public void test54(){} 63 | public void test55(){} 64 | public void test56(){} 65 | public void test57(){} 66 | public void test58(){} 67 | public void test59(){} 68 | public void test60(){} 69 | public void test61(){} 70 | public void test62(){} 71 | public void test63(){} 72 | public void test64(){} 73 | public void test65(){} 74 | public void test66(){} 75 | public void test67(){} 76 | public void test68(){} 77 | public void test69(){} 78 | public void test70(){} 79 | public void test71(){} 80 | public void test72(){} 81 | public void test73(){} 82 | public void test74(){} 83 | public void test75(){} 84 | public void test76(){} 85 | public void test77(){} 86 | public void test78(){} 87 | public void test79(){} 88 | public void test80(){} 89 | public void test81(){} 90 | public void test82(){} 91 | public void test83(){} 92 | public void test84(){} 93 | public void test85(){} 94 | public void test86(){} 95 | public void test87(){} 96 | public void test88(){} 97 | public void test89(){} 98 | public void test90(){} 99 | public void test91(){} 100 | public void test92(){} 101 | public void test93(){} 102 | public void test94(){} 103 | public void test95(){} 104 | public void test96(){} 105 | public void test97(){} 106 | public void test98(){} 107 | public void test99(){} 108 | public void test100(){} 109 | public void test101(){} 110 | public void test102(){} 111 | public void test103(){} 112 | public void test104(){} 113 | public void test105(){} 114 | public void test106(){} 115 | public void test107(){} 116 | public void test108(){} 117 | public void test109(){} 118 | public void test110(){} 119 | public void test111(){} 120 | public void test112(){} 121 | public void test113(){} 122 | public void test114(){} 123 | public void test115(){} 124 | public void test116(){} 125 | public void test117(){} 126 | public void test118(){} 127 | public void test119(){} 128 | public void test120(){} 129 | public void test121(){} 130 | public void test122(){} 131 | public void test123(){} 132 | public void test124(){} 133 | public void test125(){} 134 | public void test126(){} 135 | public void test127(){} 136 | public void test128(){} 137 | public void test129(){} 138 | public void test130(){} 139 | public void test131(){} 140 | public void test132(){} 141 | public void test133(){} 142 | public void test134(){} 143 | public void test135(){} 144 | public void test136(){} 145 | public void test137(){} 146 | public void test138(){} 147 | public void test139(){} 148 | public void test140(){} 149 | public void test141(){} 150 | public void test142(){} 151 | public void test143(){} 152 | public void test144(){} 153 | public void test145(){} 154 | public void test146(){} 155 | public void test147(){} 156 | public void test148(){} 157 | public void test149(){} 158 | public void test150(){} 159 | public void test151(){} 160 | public void test152(){} 161 | public void test153(){} 162 | public void test154(){} 163 | public void test155(){} 164 | public void test156(){} 165 | public void test157(){} 166 | public void test158(){} 167 | public void test159(){} 168 | public void test160(){} 169 | public void test161(){} 170 | public void test162(){} 171 | public void test163(){} 172 | public void test164(){} 173 | public void test165(){} 174 | public void test166(){} 175 | public void test167(){} 176 | public void test168(){} 177 | public void test169(){} 178 | public void test170(){} 179 | public void test171(){} 180 | public void test172(){} 181 | public void test173(){} 182 | public void test174(){} 183 | public void test175(){} 184 | public void test176(){} 185 | public void test177(){} 186 | public void test178(){} 187 | public void test179(){} 188 | public void test180(){} 189 | public void test181(){} 190 | public void test182(){} 191 | public void test183(){} 192 | public void test184(){} 193 | public void test185(){} 194 | public void test186(){} 195 | public void test187(){} 196 | public void test188(){} 197 | public void test189(){} 198 | public void test190(){} 199 | public void test191(){} 200 | public void test192(){} 201 | public void test193(){} 202 | public void test194(){} 203 | public void test195(){} 204 | public void test196(){} 205 | public void test197(){} 206 | public void test198(){} 207 | public void test199(){} 208 | public void test200(){} 209 | public void test201(){} 210 | public void test202(){} 211 | public void test203(){} 212 | public void test204(){} 213 | public void test205(){} 214 | public void test206(){} 215 | public void test207(){} 216 | public void test208(){} 217 | public void test209(){} 218 | public void test210(){} 219 | public void test211(){} 220 | public void test212(){} 221 | public void test213(){} 222 | public void test214(){} 223 | public void test215(){} 224 | public void test216(){} 225 | public void test217(){} 226 | public void test218(){} 227 | public void test219(){} 228 | public void test220(){} 229 | public void test221(){} 230 | public void test222(){} 231 | public void test223(){} 232 | public void test224(){} 233 | public void test225(){} 234 | public void test226(){} 235 | public void test227(){} 236 | public void test228(){} 237 | public void test229(){} 238 | public void test230(){} 239 | public void test231(){} 240 | public void test232(){} 241 | public void test233(){} 242 | public void test234(){} 243 | public void test235(){} 244 | public void test236(){} 245 | public void test237(){} 246 | public void test238(){} 247 | public void test239(){} 248 | public void test240(){} 249 | public void test241(){} 250 | public void test242(){} 251 | public void test243(){} 252 | public void test244(){} 253 | public void test245(){} 254 | public void test246(){} 255 | public void test247(){} 256 | public void test248(){} 257 | public void test249(){} 258 | public void test250(){} 259 | public void test251(){} 260 | public void test252(){} 261 | public void test253(){} 262 | public void test254(){} 263 | public void test255(){} 264 | public void test256(){} 265 | public void test257(){} 266 | public void test258(){} 267 | public void test259(){} 268 | public void test260(){} 269 | public void test261(){} 270 | public void test262(){} 271 | public void test263(){} 272 | public void test264(){} 273 | public void test265(){} 274 | public void test266(){} 275 | public void test267(){} 276 | public void test268(){} 277 | public void test269(){} 278 | public void test270(){} 279 | public void test271(){} 280 | public void test272(){} 281 | public void test273(){} 282 | public void test274(){} 283 | public void test275(){} 284 | public void test276(){} 285 | public void test277(){} 286 | public void test278(){} 287 | public void test279(){} 288 | public void test280(){} 289 | public void test281(){} 290 | public void test282(){} 291 | public void test283(){} 292 | public void test284(){} 293 | public void test285(){} 294 | public void test286(){} 295 | public void test287(){} 296 | public void test288(){} 297 | public void test289(){} 298 | public void test290(){} 299 | public void test291(){} 300 | public void test292(){} 301 | public void test293(){} 302 | public void test294(){} 303 | public void test295(){} 304 | public void test296(){} 305 | public void test297(){} 306 | public void test298(){} 307 | public void test299(){} 308 | public void test300(){} 309 | public void test301(){} 310 | public void test302(){} 311 | public void test303(){} 312 | public void test304(){} 313 | public void test305(){} 314 | public void test306(){} 315 | public void test307(){} 316 | public void test308(){} 317 | public void test309(){} 318 | public void test310(){} 319 | public void test311(){} 320 | public void test312(){} 321 | public void test313(){} 322 | public void test314(){} 323 | public void test315(){} 324 | public void test316(){} 325 | public void test317(){} 326 | public void test318(){} 327 | public void test319(){} 328 | public void test320(){} 329 | public void test321(){} 330 | public void test322(){} 331 | public void test323(){} 332 | public void test324(){} 333 | public void test325(){} 334 | public void test326(){} 335 | public void test327(){} 336 | public void test328(){} 337 | public void test329(){} 338 | public void test330(){} 339 | public void test331(){} 340 | public void test332(){} 341 | public void test333(){} 342 | public void test334(){} 343 | public void test335(){} 344 | public void test336(){} 345 | public void test337(){} 346 | public void test338(){} 347 | public void test339(){} 348 | public void test340(){} 349 | public void test341(){} 350 | public void test342(){} 351 | public void test343(){} 352 | public void test344(){} 353 | public void test345(){} 354 | public void test346(){} 355 | public void test347(){} 356 | public void test348(){} 357 | public void test349(){} 358 | public void test350(){} 359 | public void test351(){} 360 | public void test352(){} 361 | public void test353(){} 362 | public void test354(){} 363 | public void test355(){} 364 | public void test356(){} 365 | public void test357(){} 366 | public void test358(){} 367 | public void test359(){} 368 | public void test360(){} 369 | public void test361(){} 370 | public void test362(){} 371 | public void test363(){} 372 | public void test364(){} 373 | public void test365(){} 374 | public void test366(){} 375 | public void test367(){} 376 | public void test368(){} 377 | public void test369(){} 378 | public void test370(){} 379 | public void test371(){} 380 | public void test372(){} 381 | public void test373(){} 382 | public void test374(){} 383 | public void test375(){} 384 | public void test376(){} 385 | public void test377(){} 386 | public void test378(){} 387 | public void test379(){} 388 | public void test380(){} 389 | public void test381(){} 390 | public void test382(){} 391 | public void test383(){} 392 | public void test384(){} 393 | public void test385(){} 394 | public void test386(){} 395 | public void test387(){} 396 | public void test388(){} 397 | public void test389(){} 398 | public void test390(){} 399 | public void test391(){} 400 | public void test392(){} 401 | public void test393(){} 402 | public void test394(){} 403 | public void test395(){} 404 | public void test396(){} 405 | public void test397(){} 406 | public void test398(){} 407 | public void test399(){} 408 | public void test400(){} 409 | public void test401(){} 410 | public void test402(){} 411 | public void test403(){} 412 | public void test404(){} 413 | public void test405(){} 414 | public void test406(){} 415 | public void test407(){} 416 | public void test408(){} 417 | public void test409(){} 418 | public void test410(){} 419 | public void test411(){} 420 | public void test412(){} 421 | public void test413(){} 422 | public void test414(){} 423 | public void test415(){} 424 | public void test416(){} 425 | public void test417(){} 426 | public void test418(){} 427 | public void test419(){} 428 | public void test420(){} 429 | public void test421(){} 430 | public void test422(){} 431 | public void test423(){} 432 | public void test424(){} 433 | public void test425(){} 434 | public void test426(){} 435 | public void test427(){} 436 | public void test428(){} 437 | public void test429(){} 438 | public void test430(){} 439 | public void test431(){} 440 | public void test432(){} 441 | public void test433(){} 442 | public void test434(){} 443 | public void test435(){} 444 | public void test436(){} 445 | public void test437(){} 446 | public void test438(){} 447 | public void test439(){} 448 | public void test440(){} 449 | public void test441(){} 450 | public void test442(){} 451 | public void test443(){} 452 | public void test444(){} 453 | public void test445(){} 454 | public void test446(){} 455 | public void test447(){} 456 | public void test448(){} 457 | public void test449(){} 458 | public void test450(){} 459 | public void test451(){} 460 | public void test452(){} 461 | public void test453(){} 462 | public void test454(){} 463 | public void test455(){} 464 | public void test456(){} 465 | public void test457(){} 466 | public void test458(){} 467 | public void test459(){} 468 | public void test460(){} 469 | public void test461(){} 470 | public void test462(){} 471 | public void test463(){} 472 | public void test464(){} 473 | public void test465(){} 474 | public void test466(){} 475 | public void test467(){} 476 | public void test468(){} 477 | public void test469(){} 478 | public void test470(){} 479 | public void test471(){} 480 | public void test472(){} 481 | public void test473(){} 482 | public void test474(){} 483 | public void test475(){} 484 | public void test476(){} 485 | public void test477(){} 486 | public void test478(){} 487 | public void test479(){} 488 | public void test480(){} 489 | public void test481(){} 490 | public void test482(){} 491 | public void test483(){} 492 | public void test484(){} 493 | public void test485(){} 494 | public void test486(){} 495 | public void test487(){} 496 | public void test488(){} 497 | public void test489(){} 498 | public void test490(){} 499 | public void test491(){} 500 | public void test492(){} 501 | public void test493(){} 502 | public void test494(){} 503 | public void test495(){} 504 | public void test496(){} 505 | public void test497(){} 506 | public void test498(){} 507 | public void test499(){} 508 | } 509 | -------------------------------------------------------------------------------- /demo/app/src/main/java/com/test/Test13.java: -------------------------------------------------------------------------------- 1 | package com.test; 2 | 3 | /** 4 | * @author zl 5 | * @time 2019/2/25 0025. 6 | */ 7 | public class Test13 { 8 | public void test0(){} 9 | public void test1(){} 10 | public void test2(){} 11 | public void test3(){} 12 | public void test4(){} 13 | public void test5(){} 14 | public void test6(){} 15 | public void test7(){} 16 | public void test8(){} 17 | public void test9(){} 18 | public void test10(){} 19 | public void test11(){} 20 | public void test12(){} 21 | public void test13(){} 22 | public void test14(){} 23 | public void test15(){} 24 | public void test16(){} 25 | public void test17(){} 26 | public void test18(){} 27 | public void test19(){} 28 | public void test20(){} 29 | public void test21(){} 30 | public void test22(){} 31 | public void test23(){} 32 | public void test24(){} 33 | public void test25(){} 34 | public void test26(){} 35 | public void test27(){} 36 | public void test28(){} 37 | public void test29(){} 38 | public void test30(){} 39 | public void test31(){} 40 | public void test32(){} 41 | public void test33(){} 42 | public void test34(){} 43 | public void test35(){} 44 | public void test36(){} 45 | public void test37(){} 46 | public void test38(){} 47 | public void test39(){} 48 | public void test40(){} 49 | public void test41(){} 50 | public void test42(){} 51 | public void test43(){} 52 | public void test44(){} 53 | public void test45(){} 54 | public void test46(){} 55 | public void test47(){} 56 | public void test48(){} 57 | public void test49(){} 58 | public void test50(){} 59 | public void test51(){} 60 | public void test52(){} 61 | public void test53(){} 62 | public void test54(){} 63 | public void test55(){} 64 | public void test56(){} 65 | public void test57(){} 66 | public void test58(){} 67 | public void test59(){} 68 | public void test60(){} 69 | public void test61(){} 70 | public void test62(){} 71 | public void test63(){} 72 | public void test64(){} 73 | public void test65(){} 74 | public void test66(){} 75 | public void test67(){} 76 | public void test68(){} 77 | public void test69(){} 78 | public void test70(){} 79 | public void test71(){} 80 | public void test72(){} 81 | public void test73(){} 82 | public void test74(){} 83 | public void test75(){} 84 | public void test76(){} 85 | public void test77(){} 86 | public void test78(){} 87 | public void test79(){} 88 | public void test80(){} 89 | public void test81(){} 90 | public void test82(){} 91 | public void test83(){} 92 | public void test84(){} 93 | public void test85(){} 94 | public void test86(){} 95 | public void test87(){} 96 | public void test88(){} 97 | public void test89(){} 98 | public void test90(){} 99 | public void test91(){} 100 | public void test92(){} 101 | public void test93(){} 102 | public void test94(){} 103 | public void test95(){} 104 | public void test96(){} 105 | public void test97(){} 106 | public void test98(){} 107 | public void test99(){} 108 | public void test100(){} 109 | public void test101(){} 110 | public void test102(){} 111 | public void test103(){} 112 | public void test104(){} 113 | public void test105(){} 114 | public void test106(){} 115 | public void test107(){} 116 | public void test108(){} 117 | public void test109(){} 118 | public void test110(){} 119 | public void test111(){} 120 | public void test112(){} 121 | public void test113(){} 122 | public void test114(){} 123 | public void test115(){} 124 | public void test116(){} 125 | public void test117(){} 126 | public void test118(){} 127 | public void test119(){} 128 | public void test120(){} 129 | public void test121(){} 130 | public void test122(){} 131 | public void test123(){} 132 | public void test124(){} 133 | public void test125(){} 134 | public void test126(){} 135 | public void test127(){} 136 | public void test128(){} 137 | public void test129(){} 138 | public void test130(){} 139 | public void test131(){} 140 | public void test132(){} 141 | public void test133(){} 142 | public void test134(){} 143 | public void test135(){} 144 | public void test136(){} 145 | public void test137(){} 146 | public void test138(){} 147 | public void test139(){} 148 | public void test140(){} 149 | public void test141(){} 150 | public void test142(){} 151 | public void test143(){} 152 | public void test144(){} 153 | public void test145(){} 154 | public void test146(){} 155 | public void test147(){} 156 | public void test148(){} 157 | public void test149(){} 158 | public void test150(){} 159 | public void test151(){} 160 | public void test152(){} 161 | public void test153(){} 162 | public void test154(){} 163 | public void test155(){} 164 | public void test156(){} 165 | public void test157(){} 166 | public void test158(){} 167 | public void test159(){} 168 | public void test160(){} 169 | public void test161(){} 170 | public void test162(){} 171 | public void test163(){} 172 | public void test164(){} 173 | public void test165(){} 174 | public void test166(){} 175 | public void test167(){} 176 | public void test168(){} 177 | public void test169(){} 178 | public void test170(){} 179 | public void test171(){} 180 | public void test172(){} 181 | public void test173(){} 182 | public void test174(){} 183 | public void test175(){} 184 | public void test176(){} 185 | public void test177(){} 186 | public void test178(){} 187 | public void test179(){} 188 | public void test180(){} 189 | public void test181(){} 190 | public void test182(){} 191 | public void test183(){} 192 | public void test184(){} 193 | public void test185(){} 194 | public void test186(){} 195 | public void test187(){} 196 | public void test188(){} 197 | public void test189(){} 198 | public void test190(){} 199 | public void test191(){} 200 | public void test192(){} 201 | public void test193(){} 202 | public void test194(){} 203 | public void test195(){} 204 | public void test196(){} 205 | public void test197(){} 206 | public void test198(){} 207 | public void test199(){} 208 | public void test200(){} 209 | public void test201(){} 210 | public void test202(){} 211 | public void test203(){} 212 | public void test204(){} 213 | public void test205(){} 214 | public void test206(){} 215 | public void test207(){} 216 | public void test208(){} 217 | public void test209(){} 218 | public void test210(){} 219 | public void test211(){} 220 | public void test212(){} 221 | public void test213(){} 222 | public void test214(){} 223 | public void test215(){} 224 | public void test216(){} 225 | public void test217(){} 226 | public void test218(){} 227 | public void test219(){} 228 | public void test220(){} 229 | public void test221(){} 230 | public void test222(){} 231 | public void test223(){} 232 | public void test224(){} 233 | public void test225(){} 234 | public void test226(){} 235 | public void test227(){} 236 | public void test228(){} 237 | public void test229(){} 238 | public void test230(){} 239 | public void test231(){} 240 | public void test232(){} 241 | public void test233(){} 242 | public void test234(){} 243 | public void test235(){} 244 | public void test236(){} 245 | public void test237(){} 246 | public void test238(){} 247 | public void test239(){} 248 | public void test240(){} 249 | public void test241(){} 250 | public void test242(){} 251 | public void test243(){} 252 | public void test244(){} 253 | public void test245(){} 254 | public void test246(){} 255 | public void test247(){} 256 | public void test248(){} 257 | public void test249(){} 258 | public void test250(){} 259 | public void test251(){} 260 | public void test252(){} 261 | public void test253(){} 262 | public void test254(){} 263 | public void test255(){} 264 | public void test256(){} 265 | public void test257(){} 266 | public void test258(){} 267 | public void test259(){} 268 | public void test260(){} 269 | public void test261(){} 270 | public void test262(){} 271 | public void test263(){} 272 | public void test264(){} 273 | public void test265(){} 274 | public void test266(){} 275 | public void test267(){} 276 | public void test268(){} 277 | public void test269(){} 278 | public void test270(){} 279 | public void test271(){} 280 | public void test272(){} 281 | public void test273(){} 282 | public void test274(){} 283 | public void test275(){} 284 | public void test276(){} 285 | public void test277(){} 286 | public void test278(){} 287 | public void test279(){} 288 | public void test280(){} 289 | public void test281(){} 290 | public void test282(){} 291 | public void test283(){} 292 | public void test284(){} 293 | public void test285(){} 294 | public void test286(){} 295 | public void test287(){} 296 | public void test288(){} 297 | public void test289(){} 298 | public void test290(){} 299 | public void test291(){} 300 | public void test292(){} 301 | public void test293(){} 302 | public void test294(){} 303 | public void test295(){} 304 | public void test296(){} 305 | public void test297(){} 306 | public void test298(){} 307 | public void test299(){} 308 | public void test300(){} 309 | public void test301(){} 310 | public void test302(){} 311 | public void test303(){} 312 | public void test304(){} 313 | public void test305(){} 314 | public void test306(){} 315 | public void test307(){} 316 | public void test308(){} 317 | public void test309(){} 318 | public void test310(){} 319 | public void test311(){} 320 | public void test312(){} 321 | public void test313(){} 322 | public void test314(){} 323 | public void test315(){} 324 | public void test316(){} 325 | public void test317(){} 326 | public void test318(){} 327 | public void test319(){} 328 | public void test320(){} 329 | public void test321(){} 330 | public void test322(){} 331 | public void test323(){} 332 | public void test324(){} 333 | public void test325(){} 334 | public void test326(){} 335 | public void test327(){} 336 | public void test328(){} 337 | public void test329(){} 338 | public void test330(){} 339 | public void test331(){} 340 | public void test332(){} 341 | public void test333(){} 342 | public void test334(){} 343 | public void test335(){} 344 | public void test336(){} 345 | public void test337(){} 346 | public void test338(){} 347 | public void test339(){} 348 | public void test340(){} 349 | public void test341(){} 350 | public void test342(){} 351 | public void test343(){} 352 | public void test344(){} 353 | public void test345(){} 354 | public void test346(){} 355 | public void test347(){} 356 | public void test348(){} 357 | public void test349(){} 358 | public void test350(){} 359 | public void test351(){} 360 | public void test352(){} 361 | public void test353(){} 362 | public void test354(){} 363 | public void test355(){} 364 | public void test356(){} 365 | public void test357(){} 366 | public void test358(){} 367 | public void test359(){} 368 | public void test360(){} 369 | public void test361(){} 370 | public void test362(){} 371 | public void test363(){} 372 | public void test364(){} 373 | public void test365(){} 374 | public void test366(){} 375 | public void test367(){} 376 | public void test368(){} 377 | public void test369(){} 378 | public void test370(){} 379 | public void test371(){} 380 | public void test372(){} 381 | public void test373(){} 382 | public void test374(){} 383 | public void test375(){} 384 | public void test376(){} 385 | public void test377(){} 386 | public void test378(){} 387 | public void test379(){} 388 | public void test380(){} 389 | public void test381(){} 390 | public void test382(){} 391 | public void test383(){} 392 | public void test384(){} 393 | public void test385(){} 394 | public void test386(){} 395 | public void test387(){} 396 | public void test388(){} 397 | public void test389(){} 398 | public void test390(){} 399 | public void test391(){} 400 | public void test392(){} 401 | public void test393(){} 402 | public void test394(){} 403 | public void test395(){} 404 | public void test396(){} 405 | public void test397(){} 406 | public void test398(){} 407 | public void test399(){} 408 | public void test400(){} 409 | public void test401(){} 410 | public void test402(){} 411 | public void test403(){} 412 | public void test404(){} 413 | public void test405(){} 414 | public void test406(){} 415 | public void test407(){} 416 | public void test408(){} 417 | public void test409(){} 418 | public void test410(){} 419 | public void test411(){} 420 | public void test412(){} 421 | public void test413(){} 422 | public void test414(){} 423 | public void test415(){} 424 | public void test416(){} 425 | public void test417(){} 426 | public void test418(){} 427 | public void test419(){} 428 | public void test420(){} 429 | public void test421(){} 430 | public void test422(){} 431 | public void test423(){} 432 | public void test424(){} 433 | public void test425(){} 434 | public void test426(){} 435 | public void test427(){} 436 | public void test428(){} 437 | public void test429(){} 438 | public void test430(){} 439 | public void test431(){} 440 | public void test432(){} 441 | public void test433(){} 442 | public void test434(){} 443 | public void test435(){} 444 | public void test436(){} 445 | public void test437(){} 446 | public void test438(){} 447 | public void test439(){} 448 | public void test440(){} 449 | public void test441(){} 450 | public void test442(){} 451 | public void test443(){} 452 | public void test444(){} 453 | public void test445(){} 454 | public void test446(){} 455 | public void test447(){} 456 | public void test448(){} 457 | public void test449(){} 458 | public void test450(){} 459 | public void test451(){} 460 | public void test452(){} 461 | public void test453(){} 462 | public void test454(){} 463 | public void test455(){} 464 | public void test456(){} 465 | public void test457(){} 466 | public void test458(){} 467 | public void test459(){} 468 | public void test460(){} 469 | public void test461(){} 470 | public void test462(){} 471 | public void test463(){} 472 | public void test464(){} 473 | public void test465(){} 474 | public void test466(){} 475 | public void test467(){} 476 | public void test468(){} 477 | public void test469(){} 478 | public void test470(){} 479 | public void test471(){} 480 | public void test472(){} 481 | public void test473(){} 482 | public void test474(){} 483 | public void test475(){} 484 | public void test476(){} 485 | public void test477(){} 486 | public void test478(){} 487 | public void test479(){} 488 | public void test480(){} 489 | public void test481(){} 490 | public void test482(){} 491 | public void test483(){} 492 | public void test484(){} 493 | public void test485(){} 494 | public void test486(){} 495 | public void test487(){} 496 | public void test488(){} 497 | public void test489(){} 498 | public void test490(){} 499 | public void test491(){} 500 | public void test492(){} 501 | public void test493(){} 502 | public void test494(){} 503 | public void test495(){} 504 | public void test496(){} 505 | public void test497(){} 506 | public void test498(){} 507 | public void test499(){} 508 | } 509 | -------------------------------------------------------------------------------- /demo/app/src/main/java/com/test/Test14.java: -------------------------------------------------------------------------------- 1 | package com.test; 2 | 3 | /** 4 | * @author zl 5 | * @time 2019/2/25 0025. 6 | */ 7 | public class Test14 { 8 | public void test0(){} 9 | public void test1(){} 10 | public void test2(){} 11 | public void test3(){} 12 | public void test4(){} 13 | public void test5(){} 14 | public void test6(){} 15 | public void test7(){} 16 | public void test8(){} 17 | public void test9(){} 18 | public void test10(){} 19 | public void test11(){} 20 | public void test12(){} 21 | public void test13(){} 22 | public void test14(){} 23 | public void test15(){} 24 | public void test16(){} 25 | public void test17(){} 26 | public void test18(){} 27 | public void test19(){} 28 | public void test20(){} 29 | public void test21(){} 30 | public void test22(){} 31 | public void test23(){} 32 | public void test24(){} 33 | public void test25(){} 34 | public void test26(){} 35 | public void test27(){} 36 | public void test28(){} 37 | public void test29(){} 38 | public void test30(){} 39 | public void test31(){} 40 | public void test32(){} 41 | public void test33(){} 42 | public void test34(){} 43 | public void test35(){} 44 | public void test36(){} 45 | public void test37(){} 46 | public void test38(){} 47 | public void test39(){} 48 | public void test40(){} 49 | public void test41(){} 50 | public void test42(){} 51 | public void test43(){} 52 | public void test44(){} 53 | public void test45(){} 54 | public void test46(){} 55 | public void test47(){} 56 | public void test48(){} 57 | public void test49(){} 58 | public void test50(){} 59 | public void test51(){} 60 | public void test52(){} 61 | public void test53(){} 62 | public void test54(){} 63 | public void test55(){} 64 | public void test56(){} 65 | public void test57(){} 66 | public void test58(){} 67 | public void test59(){} 68 | public void test60(){} 69 | public void test61(){} 70 | public void test62(){} 71 | public void test63(){} 72 | public void test64(){} 73 | public void test65(){} 74 | public void test66(){} 75 | public void test67(){} 76 | public void test68(){} 77 | public void test69(){} 78 | public void test70(){} 79 | public void test71(){} 80 | public void test72(){} 81 | public void test73(){} 82 | public void test74(){} 83 | public void test75(){} 84 | public void test76(){} 85 | public void test77(){} 86 | public void test78(){} 87 | public void test79(){} 88 | public void test80(){} 89 | public void test81(){} 90 | public void test82(){} 91 | public void test83(){} 92 | public void test84(){} 93 | public void test85(){} 94 | public void test86(){} 95 | public void test87(){} 96 | public void test88(){} 97 | public void test89(){} 98 | public void test90(){} 99 | public void test91(){} 100 | public void test92(){} 101 | public void test93(){} 102 | public void test94(){} 103 | public void test95(){} 104 | public void test96(){} 105 | public void test97(){} 106 | public void test98(){} 107 | public void test99(){} 108 | public void test100(){} 109 | public void test101(){} 110 | public void test102(){} 111 | public void test103(){} 112 | public void test104(){} 113 | public void test105(){} 114 | public void test106(){} 115 | public void test107(){} 116 | public void test108(){} 117 | public void test109(){} 118 | public void test110(){} 119 | public void test111(){} 120 | public void test112(){} 121 | public void test113(){} 122 | public void test114(){} 123 | public void test115(){} 124 | public void test116(){} 125 | public void test117(){} 126 | public void test118(){} 127 | public void test119(){} 128 | public void test120(){} 129 | public void test121(){} 130 | public void test122(){} 131 | public void test123(){} 132 | public void test124(){} 133 | public void test125(){} 134 | public void test126(){} 135 | public void test127(){} 136 | public void test128(){} 137 | public void test129(){} 138 | public void test130(){} 139 | public void test131(){} 140 | public void test132(){} 141 | public void test133(){} 142 | public void test134(){} 143 | public void test135(){} 144 | public void test136(){} 145 | public void test137(){} 146 | public void test138(){} 147 | public void test139(){} 148 | public void test140(){} 149 | public void test141(){} 150 | public void test142(){} 151 | public void test143(){} 152 | public void test144(){} 153 | public void test145(){} 154 | public void test146(){} 155 | public void test147(){} 156 | public void test148(){} 157 | public void test149(){} 158 | public void test150(){} 159 | public void test151(){} 160 | public void test152(){} 161 | public void test153(){} 162 | public void test154(){} 163 | public void test155(){} 164 | public void test156(){} 165 | public void test157(){} 166 | public void test158(){} 167 | public void test159(){} 168 | public void test160(){} 169 | public void test161(){} 170 | public void test162(){} 171 | public void test163(){} 172 | public void test164(){} 173 | public void test165(){} 174 | public void test166(){} 175 | public void test167(){} 176 | public void test168(){} 177 | public void test169(){} 178 | public void test170(){} 179 | public void test171(){} 180 | public void test172(){} 181 | public void test173(){} 182 | public void test174(){} 183 | public void test175(){} 184 | public void test176(){} 185 | public void test177(){} 186 | public void test178(){} 187 | public void test179(){} 188 | public void test180(){} 189 | public void test181(){} 190 | public void test182(){} 191 | public void test183(){} 192 | public void test184(){} 193 | public void test185(){} 194 | public void test186(){} 195 | public void test187(){} 196 | public void test188(){} 197 | public void test189(){} 198 | public void test190(){} 199 | public void test191(){} 200 | public void test192(){} 201 | public void test193(){} 202 | public void test194(){} 203 | public void test195(){} 204 | public void test196(){} 205 | public void test197(){} 206 | public void test198(){} 207 | public void test199(){} 208 | public void test200(){} 209 | public void test201(){} 210 | public void test202(){} 211 | public void test203(){} 212 | public void test204(){} 213 | public void test205(){} 214 | public void test206(){} 215 | public void test207(){} 216 | public void test208(){} 217 | public void test209(){} 218 | public void test210(){} 219 | public void test211(){} 220 | public void test212(){} 221 | public void test213(){} 222 | public void test214(){} 223 | public void test215(){} 224 | public void test216(){} 225 | public void test217(){} 226 | public void test218(){} 227 | public void test219(){} 228 | public void test220(){} 229 | public void test221(){} 230 | public void test222(){} 231 | public void test223(){} 232 | public void test224(){} 233 | public void test225(){} 234 | public void test226(){} 235 | public void test227(){} 236 | public void test228(){} 237 | public void test229(){} 238 | public void test230(){} 239 | public void test231(){} 240 | public void test232(){} 241 | public void test233(){} 242 | public void test234(){} 243 | public void test235(){} 244 | public void test236(){} 245 | public void test237(){} 246 | public void test238(){} 247 | public void test239(){} 248 | public void test240(){} 249 | public void test241(){} 250 | public void test242(){} 251 | public void test243(){} 252 | public void test244(){} 253 | public void test245(){} 254 | public void test246(){} 255 | public void test247(){} 256 | public void test248(){} 257 | public void test249(){} 258 | public void test250(){} 259 | public void test251(){} 260 | public void test252(){} 261 | public void test253(){} 262 | public void test254(){} 263 | public void test255(){} 264 | public void test256(){} 265 | public void test257(){} 266 | public void test258(){} 267 | public void test259(){} 268 | public void test260(){} 269 | public void test261(){} 270 | public void test262(){} 271 | public void test263(){} 272 | public void test264(){} 273 | public void test265(){} 274 | public void test266(){} 275 | public void test267(){} 276 | public void test268(){} 277 | public void test269(){} 278 | public void test270(){} 279 | public void test271(){} 280 | public void test272(){} 281 | public void test273(){} 282 | public void test274(){} 283 | public void test275(){} 284 | public void test276(){} 285 | public void test277(){} 286 | public void test278(){} 287 | public void test279(){} 288 | public void test280(){} 289 | public void test281(){} 290 | public void test282(){} 291 | public void test283(){} 292 | public void test284(){} 293 | public void test285(){} 294 | public void test286(){} 295 | public void test287(){} 296 | public void test288(){} 297 | public void test289(){} 298 | public void test290(){} 299 | public void test291(){} 300 | public void test292(){} 301 | public void test293(){} 302 | public void test294(){} 303 | public void test295(){} 304 | public void test296(){} 305 | public void test297(){} 306 | public void test298(){} 307 | public void test299(){} 308 | public void test300(){} 309 | public void test301(){} 310 | public void test302(){} 311 | public void test303(){} 312 | public void test304(){} 313 | public void test305(){} 314 | public void test306(){} 315 | public void test307(){} 316 | public void test308(){} 317 | public void test309(){} 318 | public void test310(){} 319 | public void test311(){} 320 | public void test312(){} 321 | public void test313(){} 322 | public void test314(){} 323 | public void test315(){} 324 | public void test316(){} 325 | public void test317(){} 326 | public void test318(){} 327 | public void test319(){} 328 | public void test320(){} 329 | public void test321(){} 330 | public void test322(){} 331 | public void test323(){} 332 | public void test324(){} 333 | public void test325(){} 334 | public void test326(){} 335 | public void test327(){} 336 | public void test328(){} 337 | public void test329(){} 338 | public void test330(){} 339 | public void test331(){} 340 | public void test332(){} 341 | public void test333(){} 342 | public void test334(){} 343 | public void test335(){} 344 | public void test336(){} 345 | public void test337(){} 346 | public void test338(){} 347 | public void test339(){} 348 | public void test340(){} 349 | public void test341(){} 350 | public void test342(){} 351 | public void test343(){} 352 | public void test344(){} 353 | public void test345(){} 354 | public void test346(){} 355 | public void test347(){} 356 | public void test348(){} 357 | public void test349(){} 358 | public void test350(){} 359 | public void test351(){} 360 | public void test352(){} 361 | public void test353(){} 362 | public void test354(){} 363 | public void test355(){} 364 | public void test356(){} 365 | public void test357(){} 366 | public void test358(){} 367 | public void test359(){} 368 | public void test360(){} 369 | public void test361(){} 370 | public void test362(){} 371 | public void test363(){} 372 | public void test364(){} 373 | public void test365(){} 374 | public void test366(){} 375 | public void test367(){} 376 | public void test368(){} 377 | public void test369(){} 378 | public void test370(){} 379 | public void test371(){} 380 | public void test372(){} 381 | public void test373(){} 382 | public void test374(){} 383 | public void test375(){} 384 | public void test376(){} 385 | public void test377(){} 386 | public void test378(){} 387 | public void test379(){} 388 | public void test380(){} 389 | public void test381(){} 390 | public void test382(){} 391 | public void test383(){} 392 | public void test384(){} 393 | public void test385(){} 394 | public void test386(){} 395 | public void test387(){} 396 | public void test388(){} 397 | public void test389(){} 398 | public void test390(){} 399 | public void test391(){} 400 | public void test392(){} 401 | public void test393(){} 402 | public void test394(){} 403 | public void test395(){} 404 | public void test396(){} 405 | public void test397(){} 406 | public void test398(){} 407 | public void test399(){} 408 | public void test400(){} 409 | public void test401(){} 410 | public void test402(){} 411 | public void test403(){} 412 | public void test404(){} 413 | public void test405(){} 414 | public void test406(){} 415 | public void test407(){} 416 | public void test408(){} 417 | public void test409(){} 418 | public void test410(){} 419 | public void test411(){} 420 | public void test412(){} 421 | public void test413(){} 422 | public void test414(){} 423 | public void test415(){} 424 | public void test416(){} 425 | public void test417(){} 426 | public void test418(){} 427 | public void test419(){} 428 | public void test420(){} 429 | public void test421(){} 430 | public void test422(){} 431 | public void test423(){} 432 | public void test424(){} 433 | public void test425(){} 434 | public void test426(){} 435 | public void test427(){} 436 | public void test428(){} 437 | public void test429(){} 438 | public void test430(){} 439 | public void test431(){} 440 | public void test432(){} 441 | public void test433(){} 442 | public void test434(){} 443 | public void test435(){} 444 | public void test436(){} 445 | public void test437(){} 446 | public void test438(){} 447 | public void test439(){} 448 | public void test440(){} 449 | public void test441(){} 450 | public void test442(){} 451 | public void test443(){} 452 | public void test444(){} 453 | public void test445(){} 454 | public void test446(){} 455 | public void test447(){} 456 | public void test448(){} 457 | public void test449(){} 458 | public void test450(){} 459 | public void test451(){} 460 | public void test452(){} 461 | public void test453(){} 462 | public void test454(){} 463 | public void test455(){} 464 | public void test456(){} 465 | public void test457(){} 466 | public void test458(){} 467 | public void test459(){} 468 | public void test460(){} 469 | public void test461(){} 470 | public void test462(){} 471 | public void test463(){} 472 | public void test464(){} 473 | public void test465(){} 474 | public void test466(){} 475 | public void test467(){} 476 | public void test468(){} 477 | public void test469(){} 478 | public void test470(){} 479 | public void test471(){} 480 | public void test472(){} 481 | public void test473(){} 482 | public void test474(){} 483 | public void test475(){} 484 | public void test476(){} 485 | public void test477(){} 486 | public void test478(){} 487 | public void test479(){} 488 | public void test480(){} 489 | public void test481(){} 490 | public void test482(){} 491 | public void test483(){} 492 | public void test484(){} 493 | public void test485(){} 494 | public void test486(){} 495 | public void test487(){} 496 | public void test488(){} 497 | public void test489(){} 498 | public void test490(){} 499 | public void test491(){} 500 | public void test492(){} 501 | public void test493(){} 502 | public void test494(){} 503 | public void test495(){} 504 | public void test496(){} 505 | public void test497(){} 506 | public void test498(){} 507 | public void test499(){} 508 | } 509 | -------------------------------------------------------------------------------- /demo/app/src/main/java/com/xiyou/demo/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.xiyou.demo; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.util.Log; 6 | import android.view.ViewConfiguration; 7 | 8 | import com.test.Test299; 9 | 10 | public class MainActivity extends Activity { 11 | @Override 12 | public void onCreate(Bundle savedInstanceState) { 13 | super.onCreate(savedInstanceState); 14 | setContentView(R.layout.activity_main); 15 | Log.d("PreviewProject", ViewConfiguration.get(this).getScaledTouchSlop()+""); 16 | Log.d("PreviewProject","call onCreate"); 17 | new Test299().test0(); 18 | try { 19 | Thread.sleep(200000); 20 | } catch (InterruptedException e) { 21 | e.printStackTrace(); 22 | } 23 | } 24 | 25 | @Override 26 | protected void onSaveInstanceState(Bundle outState) { 27 | super.onSaveInstanceState(outState); 28 | Log.d("PreviewProject","call onSaveInstanceState"); 29 | } 30 | 31 | @Override 32 | protected void onRestoreInstanceState(Bundle savedInstanceState) { 33 | super.onRestoreInstanceState(savedInstanceState); 34 | Log.d("PreviewProject","call onRestoreInstanceState"); 35 | } 36 | 37 | @Override 38 | protected void onResume() { 39 | super.onResume(); 40 | Log.d("PreviewProject","call onResume"); 41 | } 42 | 43 | @Override 44 | protected void onPause() { 45 | super.onPause(); 46 | Log.d("PreviewProject","call onPause"); 47 | } 48 | 49 | @Override 50 | protected void onStop() { 51 | super.onStop(); 52 | Log.d("PreviewProject","call onStop"); 53 | } 54 | } -------------------------------------------------------------------------------- /demo/app/src/main/java/com/xiyou/demo/MyApplication.java: -------------------------------------------------------------------------------- 1 | package com.xiyou.demo; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | import android.util.Log; 6 | 7 | /** 8 | * @author zl 9 | * @time 2019/2/26 0026. 10 | */ 11 | public class MyApplication extends Application { 12 | @Override 13 | protected void attachBaseContext(Context base) { 14 | super.attachBaseContext(base); 15 | Log.d("PreviewProject","MyApplication call attachBaseContext"); 16 | } 17 | 18 | @Override 19 | public void onCreate() { 20 | super.onCreate(); 21 | Log.d("PreviewProject","MyApplication call onCreate"); 22 | 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /demo/app/src/main/res/drawable/a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/demo/app/src/main/res/drawable/a.jpg -------------------------------------------------------------------------------- /demo/app/src/main/res/drawable/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/demo/app/src/main/res/drawable/app_icon.png -------------------------------------------------------------------------------- /demo/app/src/main/res/drawable/b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/demo/app/src/main/res/drawable/b.jpg -------------------------------------------------------------------------------- /demo/app/src/main/res/drawable/c.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/demo/app/src/main/res/drawable/c.jpg -------------------------------------------------------------------------------- /demo/app/src/main/res/drawable/e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/demo/app/src/main/res/drawable/e.jpg -------------------------------------------------------------------------------- /demo/app/src/main/res/drawable/f.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/demo/app/src/main/res/drawable/f.jpg -------------------------------------------------------------------------------- /demo/app/src/main/res/drawable/g.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/demo/app/src/main/res/drawable/g.jpg -------------------------------------------------------------------------------- /demo/app/src/main/res/drawable/h.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/demo/app/src/main/res/drawable/h.jpg -------------------------------------------------------------------------------- /demo/app/src/main/res/drawable/i.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/demo/app/src/main/res/drawable/i.jpg -------------------------------------------------------------------------------- /demo/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 16 | 17 | -------------------------------------------------------------------------------- /demo/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.3.3' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | jcenter() 18 | } 19 | } 20 | 21 | task clean(type: Delete) { 22 | delete rootProject.buildDir 23 | } 24 | -------------------------------------------------------------------------------- /demo/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | -------------------------------------------------------------------------------- /demo/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/demo/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /demo/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Feb 25 17:21:25 GMT+08:00 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip 7 | -------------------------------------------------------------------------------- /demo/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /demo/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /demo/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /img/dex_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/img/dex_structure.png -------------------------------------------------------------------------------- /img/effect.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/img/effect.jpg -------------------------------------------------------------------------------- /shell_util/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /shell_util/.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple Java application that includes a class with main() method -------------------------------------------------------------------------------- /shell_util/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /shell_util/.idea/libraries/fastjson_1_2_29.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /shell_util/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /shell_util/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /shell_util/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /shell_util/libs/fastjson-1.2.29.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/shell_util/libs/fastjson-1.2.29.jar -------------------------------------------------------------------------------- /shell_util/out/production/shell_util/com/test/Main.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/shell_util/out/production/shell_util/com/test/Main.class -------------------------------------------------------------------------------- /shell_util/out/production/shell_util/com/utils/AndroidXmlUtils.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/shell_util/out/production/shell_util/com/utils/AndroidXmlUtils.class -------------------------------------------------------------------------------- /shell_util/out/production/shell_util/com/utils/ApkShellUtils.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/shell_util/out/production/shell_util/com/utils/ApkShellUtils.class -------------------------------------------------------------------------------- /shell_util/out/production/shell_util/com/utils/ApkToolUtils.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/shell_util/out/production/shell_util/com/utils/ApkToolUtils.class -------------------------------------------------------------------------------- /shell_util/out/production/shell_util/com/utils/CmdExecutor$StreamGobbler.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/shell_util/out/production/shell_util/com/utils/CmdExecutor$StreamGobbler.class -------------------------------------------------------------------------------- /shell_util/out/production/shell_util/com/utils/CmdExecutor.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/shell_util/out/production/shell_util/com/utils/CmdExecutor.class -------------------------------------------------------------------------------- /shell_util/out/production/shell_util/com/utils/Constant.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/shell_util/out/production/shell_util/com/utils/Constant.class -------------------------------------------------------------------------------- /shell_util/out/production/shell_util/com/utils/DexFile.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/shell_util/out/production/shell_util/com/utils/DexFile.class -------------------------------------------------------------------------------- /shell_util/out/production/shell_util/com/utils/FileUtils.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/shell_util/out/production/shell_util/com/utils/FileUtils.class -------------------------------------------------------------------------------- /shell_util/out/production/shell_util/com/utils/SecurityUtils.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/shell_util/out/production/shell_util/com/utils/SecurityUtils.class -------------------------------------------------------------------------------- /shell_util/out/production/shell_util/com/utils/SignUtils$Keystore.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/shell_util/out/production/shell_util/com/utils/SignUtils$Keystore.class -------------------------------------------------------------------------------- /shell_util/out/production/shell_util/com/utils/SignUtils.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/shell_util/out/production/shell_util/com/utils/SignUtils.class -------------------------------------------------------------------------------- /shell_util/shell_util.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /shell_util/src/com/test/Main.java: -------------------------------------------------------------------------------- 1 | package com.test; 2 | 3 | import com.utils.ApkShellUtils; 4 | import com.utils.FileUtils; 5 | 6 | import java.io.*; 7 | import java.util.Scanner; 8 | 9 | public class Main { 10 | 11 | private static String primaryApkPath = "G:\\demo\\shell\\demo.apk"; 12 | private static String outShellApkPath = "G:\\demo\\shell\\shell_demo.apk"; 13 | private static String unShellApkPath = "G:\\demo\\shell\\unshell.apk"; 14 | public static void main(String[] args) { 15 | try { 16 | if(!FileUtils.isExit(primaryApkPath, unShellApkPath)){ 17 | System.out.println("file is null"); 18 | return; 19 | } 20 | FileUtils.delete("G:\\demo\\shell\\demo"); 21 | FileUtils.delete("G:\\demo\\shell\\unshell"); 22 | FileUtils.delete(outShellApkPath); 23 | ApkShellUtils.apkShell(primaryApkPath,unShellApkPath,outShellApkPath); 24 | // FileUtils.unZip(primaryApkPath,"G:\\demo\\shell\\demo"); 25 | } catch (Exception e) { 26 | e.printStackTrace(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /shell_util/src/com/utils/AndroidXmlUtils.java: -------------------------------------------------------------------------------- 1 | package com.utils; 2 | 3 | import org.w3c.dom.Document; 4 | import org.w3c.dom.Element; 5 | import org.xml.sax.SAXException; 6 | 7 | import javax.xml.parsers.DocumentBuilder; 8 | import javax.xml.parsers.DocumentBuilderFactory; 9 | import javax.xml.parsers.ParserConfigurationException; 10 | import javax.xml.transform.*; 11 | import javax.xml.transform.dom.DOMSource; 12 | import javax.xml.transform.stream.StreamResult; 13 | import java.io.IOException; 14 | 15 | /** 16 | * Created by zoulong on 2019/2/26 0026. 17 | */ 18 | public class AndroidXmlUtils { 19 | private static final String NS = "http://schemas.android.com/apk/res/android"; 20 | public static String readApplicationName(String manifestPath) throws ParserConfigurationException, IOException, SAXException { 21 | DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 22 | factory.setValidating(true); 23 | factory.setNamespaceAware(true); 24 | DocumentBuilder builder = factory.newDocumentBuilder(); 25 | Document document = builder.parse(manifestPath); 26 | Element element = document.getDocumentElement(); 27 | Element applicationElement = (Element)element.getElementsByTagName("application").item(0); 28 | if(applicationElement.hasAttributeNS(NS,"name")){ 29 | return applicationElement.getAttributeNodeNS(NS,"name").getValue(); 30 | }else{ 31 | return null; 32 | } 33 | } 34 | 35 | public static void changeApplicationName(String manifestPath, String newName) throws ParserConfigurationException, IOException, SAXException, TransformerException { 36 | DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 37 | factory.setValidating(true); 38 | factory.setNamespaceAware(true); 39 | DocumentBuilder builder = factory.newDocumentBuilder(); 40 | Document document = builder.parse(manifestPath); 41 | Element element = document.getDocumentElement(); 42 | Element applicationElement = (Element)element.getElementsByTagName("application").item(0); 43 | if(applicationElement.hasAttribute("name")){ 44 | applicationElement.getAttributeNodeNS(NS,"name").setValue(newName); 45 | }else{ 46 | applicationElement.setAttribute("android:name",newName); 47 | } 48 | 49 | writeXmlToLocal(document,manifestPath); 50 | } 51 | 52 | 53 | public static void addMateData(String manifestPath,String name,String value) throws ParserConfigurationException, IOException, SAXException, TransformerException { 54 | DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 55 | factory.setValidating(true); 56 | factory.setNamespaceAware(true); 57 | DocumentBuilder builder = factory.newDocumentBuilder(); 58 | Document document = builder.parse(manifestPath); 59 | Element element = document.getDocumentElement(); 60 | Element applicationElement = (Element)element.getElementsByTagName("application").item(0); 61 | Element mateDataElement = document.createElement("meta-data"); 62 | mateDataElement.setAttribute("android:name",name); 63 | mateDataElement.setAttribute("android:value",value); 64 | applicationElement.appendChild(mateDataElement); 65 | writeXmlToLocal(document,manifestPath); 66 | } 67 | 68 | private static void writeXmlToLocal(Document document, String outXmlPath) throws TransformerException { 69 | TransformerFactory tff = TransformerFactory.newInstance(); 70 | Transformer tf = tff.newTransformer(); 71 | tf.setOutputProperty(OutputKeys.INDENT,"yes"); 72 | tf.transform(new DOMSource(document),new StreamResult(outXmlPath)); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /shell_util/src/com/utils/ApkShellUtils.java: -------------------------------------------------------------------------------- 1 | package com.utils; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | 5 | import javax.crypto.BadPaddingException; 6 | import javax.crypto.IllegalBlockSizeException; 7 | import javax.crypto.NoSuchPaddingException; 8 | import java.io.*; 9 | import java.security.InvalidKeyException; 10 | import java.security.MessageDigest; 11 | import java.security.NoSuchAlgorithmException; 12 | import java.util.ArrayList; 13 | import java.util.zip.Adler32; 14 | 15 | /** 16 | * Created by zoulong on 2019/2/25 0025. 17 | */ 18 | public class ApkShellUtils { 19 | 20 | /** 21 | * 给apk加壳 22 | * @param primaryApkPath 原apk 23 | * @param unShellApkPath 解壳apk 24 | * @param outApkPath 加壳后新APK 25 | * @throws Exception 26 | */ 27 | public static void apkShell(String primaryApkPath,String unShellApkPath,String outApkPath) throws Exception{ 28 | if(!FileUtils.isExit(primaryApkPath, unShellApkPath)){ 29 | throw new RuntimeException("check params"); 30 | } 31 | //解压原apk 32 | String unPrimaryApkDstPath = primaryApkPath.replace(".apk", ""); 33 | ApkToolUtils.decompile(primaryApkPath, unPrimaryApkDstPath); 34 | String primaryManifestPath = unPrimaryApkDstPath + File.separator + "AndroidManifest.xml"; 35 | 36 | //解压解壳apk 37 | String unShellApkDstPath = unShellApkPath.replace(".apk", ""); 38 | ApkToolUtils.decompile(unShellApkPath, unShellApkDstPath); 39 | String unShellManifestPath = unShellApkDstPath + File.separator + "AndroidManifest.xml"; 40 | String unShellDexPath = unShellApkDstPath + File.separator + "classes.dex"; 41 | File unShellFile = new File(unShellDexPath); 42 | 43 | 44 | File unApkDir = new File(unPrimaryApkDstPath); 45 | ArrayList dexArray = new ArrayList(); 46 | for(File file : unApkDir.listFiles()){//读取解壳后的dex 47 | if(file.getName().endsWith(".dex")){ 48 | dexArray.add(file); 49 | } 50 | } 51 | String shellDexPath = unPrimaryApkDstPath + File.separator + "classes.dex"; 52 | shellDex(dexArray, unShellFile, shellDexPath);//生产新的dex(加壳) 53 | 54 | String mateInfPath = unPrimaryApkDstPath + File.separator +"META-INF";//删除meta-inf,重新签名后会生成 55 | FileUtils.delete(mateInfPath); 56 | 57 | for(File file : dexArray){//清理多余dex文件 58 | if(file.getName().equals("classes.dex")){ 59 | continue; 60 | } 61 | FileUtils.delete(file.getAbsolutePath()); 62 | } 63 | 64 | String unShellApplicationName = AndroidXmlUtils.readApplicationName(unShellManifestPath);//解壳ApplicationName 65 | String primaryApplicationName = AndroidXmlUtils.readApplicationName(primaryManifestPath);//原applicationName 66 | AndroidXmlUtils.changeApplicationName(primaryManifestPath, unShellApplicationName);//改变原Applicationname为解壳ApplicationName 67 | if(primaryApplicationName != null){//将原ApplicationName写入mateData中,解壳application中会读取并替换应用Application 68 | AndroidXmlUtils.addMateData(primaryManifestPath, "APPLICATION_CLASS_NAME", primaryApplicationName); 69 | } 70 | //回编,回编系统最好是linux 71 | ApkToolUtils.compile(unPrimaryApkDstPath,outApkPath); 72 | //v1签名 73 | SignUtils.V1(outApkPath, SignUtils.getDefaultKeystore()); 74 | //清理目录 75 | FileUtils.delete(unPrimaryApkDstPath); 76 | FileUtils.delete(unShellApkDstPath); 77 | } 78 | 79 | /** 80 | * 给dex加壳 81 | * @param primaryDexs 原dex集合 82 | * @param unShellDex 解壳dex 83 | * @param shellDexPath 生成新的dex路径 84 | * @throws IOException 85 | * @throws NoSuchAlgorithmException 86 | * @throws InvalidKeyException 87 | * @throws BadPaddingException 88 | * @throws NoSuchPaddingException 89 | * @throws IllegalBlockSizeException 90 | */ 91 | private static void shellDex(ArrayList primaryDexs, File unShellDex, String shellDexPath) throws IOException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, NoSuchPaddingException, IllegalBlockSizeException { 92 | int primaryDexLen = 0; 93 | ArrayList dexFileInfos = new ArrayList<>(primaryDexs.size()); 94 | for(File file : primaryDexs){//计算所有primary的长度 95 | DexFile dexFile = new DexFile(file.getName(),encryptionAES(readFileBytes(file))); 96 | dexFileInfos.add(dexFile); 97 | primaryDexLen += dexFile.getDexLength(); 98 | } 99 | byte[] unShellDexFileByte = readFileBytes(unShellDex); 100 | int unShellDexLen = unShellDexFileByte.length;//解壳dex长度 101 | 102 | String dexFileComment = JSON.toJSONString(dexFileInfos);//原dexs描述 103 | int dexFileCommentLen = dexFileComment.getBytes().length;//dexs描述长度 104 | 105 | int totalLen = primaryDexLen+dexFileCommentLen + unShellDexLen+4;//新dex总长度 106 | byte[] shellDex = new byte[totalLen]; 107 | 108 | System.arraycopy(unShellDexFileByte,0,shellDex,0,unShellDexLen);//先拷贝解壳dex 109 | 110 | int currentCopyIndex = unShellDexLen; 111 | for(DexFile dexFile : dexFileInfos){//拷贝原dexs 112 | System.arraycopy(dexFile.getData(),0,shellDex,currentCopyIndex,dexFile.getDexLength()); 113 | currentCopyIndex += dexFile.getDexLength(); 114 | } 115 | 116 | System.arraycopy(dexFileComment.getBytes(),0,shellDex,currentCopyIndex,dexFileCommentLen);//加入dexs描述 117 | 118 | System.arraycopy(intToByte(dexFileCommentLen),0,shellDex,totalLen-4,4);//描述长度 119 | fixFileSizeHeader(shellDex);//修改dex头 file_size值 120 | fixSHA1Header(shellDex);//修改dex头 sha1值 121 | fixCheckSumHeader(shellDex);//修改dex头,CheckSum 校验码 122 | 123 | // 把内容写到 newDexFile 124 | File file = new File(shellDexPath); 125 | if (!file.exists()) { 126 | file.createNewFile(); 127 | } 128 | 129 | FileOutputStream localFileOutputStream = new FileOutputStream(shellDexPath); 130 | localFileOutputStream.write(shellDex); 131 | localFileOutputStream.flush(); 132 | localFileOutputStream.close(); 133 | } 134 | 135 | 136 | //在此做数据加密 137 | private static byte[] encryptionAES(byte[] data) throws IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException { 138 | 139 | return SecurityUtils.AESEncryption(Constant.AES_PRIVATE_KEY,Constant.AES_IV,Constant.AES_TYPE,data); 140 | } 141 | 142 | /** 143 | * 修改dex头,CheckSum 校验码 144 | * 145 | * @param dexBytes 146 | */ 147 | private static void fixCheckSumHeader(byte[] dexBytes) { 148 | Adler32 adler = new Adler32(); 149 | adler.update(dexBytes, 12, dexBytes.length - 12);// 从12到文件末尾计算校验码 150 | long value = adler.getValue(); 151 | int va = (int) value; 152 | byte[] newcs = intToByte(va); 153 | // 高位在前,低位在前掉个个 154 | byte[] recs = new byte[4]; 155 | for (int i = 0; i < 4; i++) { 156 | recs[i] = newcs[newcs.length - 1 - i]; 157 | 158 | } 159 | System.arraycopy(recs, 0, dexBytes, 8, 4);// 效验码赋值(8-11) 160 | } 161 | 162 | /** 163 | * 修改dex头 sha1值 164 | * 165 | * @param dexBytes 166 | * @throws NoSuchAlgorithmException 167 | */ 168 | private static void fixSHA1Header(byte[] dexBytes) 169 | throws NoSuchAlgorithmException { 170 | MessageDigest md = MessageDigest.getInstance("SHA-1"); 171 | md.update(dexBytes, 32, dexBytes.length - 32);// 从32为到结束计算sha--1 172 | byte[] newdt = md.digest(); 173 | System.arraycopy(newdt, 0, dexBytes, 12, 20);// 修改sha-1值(12-31) 174 | // 输出sha-1值,可有可无 175 | String hexstr = ""; 176 | for (int i = 0; i < newdt.length; i++) { 177 | hexstr += Integer.toString((newdt[i] & 0xff) + 0x100, 16) 178 | .substring(1); 179 | } 180 | System.out.println("sha-1 值:" + hexstr); 181 | 182 | } 183 | 184 | 185 | /** 186 | * int 转byte[] 187 | * 188 | * @param number 189 | * @return 190 | */ 191 | public static byte[] intToByte(int number) { 192 | byte[] b = new byte[4]; 193 | for (int i = 3; i >= 0; i--) { 194 | b[i] = (byte) (number % 256); 195 | number >>= 8; 196 | } 197 | return b; 198 | } 199 | 200 | /** 201 | * 修改dex头 file_size值 202 | * 203 | * @param dexBytes 204 | */ 205 | private static void fixFileSizeHeader(byte[] dexBytes) { 206 | // 新文件长度 207 | byte[] newfs = intToByte(dexBytes.length); 208 | 209 | byte[] refs = new byte[4]; 210 | // 高位在前,低位在前掉个个 211 | for (int i = 0; i < 4; i++) { 212 | refs[i] = newfs[newfs.length - 1 - i]; 213 | 214 | } 215 | System.arraycopy(refs, 0, dexBytes, 32, 4);// 修改(32-35) 216 | System.out.println(); 217 | } 218 | 219 | /** 220 | * 以二进制读出文件内容 221 | * 222 | * @param file 223 | * @return 224 | * @throws IOException 225 | */ 226 | @SuppressWarnings("resource") 227 | private static byte[] readFileBytes(File file) throws IOException { 228 | byte[] arrayOfByte = new byte[1024]; 229 | ByteArrayOutputStream localByteArrayOutputStream = new ByteArrayOutputStream(); 230 | FileInputStream fis = new FileInputStream(file); 231 | while (true) { 232 | int i = fis.read(arrayOfByte); 233 | if (i != -1) { 234 | localByteArrayOutputStream.write(arrayOfByte, 0, i); 235 | } else { 236 | fis.close(); 237 | return localByteArrayOutputStream.toByteArray(); 238 | } 239 | } 240 | } 241 | } 242 | -------------------------------------------------------------------------------- /shell_util/src/com/utils/ApkToolUtils.java: -------------------------------------------------------------------------------- 1 | package com.utils; 2 | 3 | import java.io.IOException; 4 | 5 | /** 6 | * Created by zoulong on 2019/2/26 0026. 7 | */ 8 | public class ApkToolUtils { 9 | private static final String APKTOOL_PATH = "tools/apktool/apktool.jar"; 10 | public static boolean decompile(String apkPath,String outPath) throws IOException, InterruptedException { 11 | String cmd = "java -jar %s -s d %s -o %s"; 12 | cmd = String.format(cmd, new String[]{APKTOOL_PATH, apkPath, outPath}); 13 | CmdExecutor.executor(cmd); 14 | return true; 15 | } 16 | 17 | public static boolean compile(String apkDir, String outPath) throws IOException, InterruptedException { 18 | String cmd = "java -jar %s b %s -o %s"; 19 | cmd = String.format(cmd, new String[]{APKTOOL_PATH, apkDir, outPath}); 20 | CmdExecutor.executor(cmd); 21 | return true; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /shell_util/src/com/utils/CmdExecutor.java: -------------------------------------------------------------------------------- 1 | package com.utils; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.IOException; 5 | import java.io.InputStream; 6 | import java.io.InputStreamReader; 7 | 8 | public class CmdExecutor { 9 | 10 | public static boolean executor(String executeStr) throws IOException, InterruptedException { 11 | return executor(executeStr,"GB2312"); 12 | } 13 | 14 | public static boolean executor(String executeStr,String character) throws IOException, InterruptedException { 15 | System.out.println("执行命令:"+executeStr); 16 | Process p = Runtime.getRuntime().exec(executeStr); 17 | StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(),character); 18 | errorGobbler.start(); 19 | 20 | StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(),character); 21 | outGobbler.start(); 22 | int executorResultCode = p.waitFor(); 23 | System.out.println("进程执行返回值:"+executorResultCode); 24 | if(executorResultCode!=0){ 25 | System.out.println("操作系统错误代码0:成功\n操作系统错误代码1:操作不允许\n操作系统错误代码2:没有这样的文件或目录\n操作系统错误代码3:没有这样的过程\n" + 26 | "操作系统错误代码4:中断的系统调用\n操作系统错误代码5:输入/输出错误\n操作系统错误代码6:没有这样的设备或地址\n操作系统错误代码7:参数列表太长\n" + 27 | "操作系统错误代码8:执行格式错误\n操作系统错误代码9:坏的文件描述符\n操作系统错误代码10:无子过程"); 28 | } 29 | return executorResultCode==0; 30 | } 31 | 32 | private static class StreamGobbler extends Thread { 33 | private InputStream is; 34 | private String character; 35 | 36 | public StreamGobbler(InputStream is, String character) { 37 | this.is = is; 38 | this.character = character; 39 | } 40 | 41 | public void run() { 42 | InputStreamReader isr = null; 43 | BufferedReader br = null; 44 | try { 45 | isr = new InputStreamReader(is,character); 46 | br = new BufferedReader(isr); 47 | String line=null; 48 | while ( (line = br.readLine()) != null) { 49 | System.out.println(line); 50 | } 51 | } catch (IOException ioe) { 52 | ioe.printStackTrace(); 53 | } finally{ 54 | try { 55 | br.close(); 56 | isr.close(); 57 | } catch (Exception e) { 58 | e.printStackTrace(); 59 | } 60 | 61 | } 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /shell_util/src/com/utils/Constant.java: -------------------------------------------------------------------------------- 1 | package com.utils; 2 | 3 | /** 4 | * Created by zoulong on 2019/2/26 0026. 5 | */ 6 | public class Constant { 7 | public static final String AES_IV = "1234567898765432";//16位 8 | public static final String AES_TYPE = "AES/ECB/PKCS5Padding";//填充类型 9 | //私钥 10 | public static final String AES_PRIVATE_KEY="1111222233334444";//AES固定格式为128/192/256 bits.即:16/24/32bytes。DES固定格式为128bits,即8bytes。 11 | } 12 | -------------------------------------------------------------------------------- /shell_util/src/com/utils/DexFile.java: -------------------------------------------------------------------------------- 1 | package com.utils; 2 | 3 | import com.alibaba.fastjson.annotation.JSONField; 4 | 5 | /** 6 | * Created by zoulong on 2019/2/25 0025. 7 | */ 8 | public class DexFile { 9 | private String dexName; 10 | private int dexLength; 11 | //使用transient 和 serialize = false效果等同 12 | @JSONField(serialize = false) 13 | private byte[] data; 14 | public DexFile() { 15 | } 16 | 17 | public DexFile(String dexName, byte[] data) { 18 | this.dexName = dexName; 19 | this.dexLength = data.length; 20 | this.data = data; 21 | } 22 | 23 | public String getDexName() { 24 | return dexName; 25 | } 26 | 27 | public void setDexName(String dexName) { 28 | this.dexName = dexName; 29 | } 30 | 31 | public int getDexLength() { 32 | return dexLength; 33 | } 34 | 35 | public void setDexLength(int dexLength) { 36 | this.dexLength = dexLength; 37 | } 38 | 39 | public byte[] getData() { 40 | return data; 41 | } 42 | 43 | public void setData(byte[] data) { 44 | this.data = data; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /shell_util/src/com/utils/FileUtils.java: -------------------------------------------------------------------------------- 1 | package com.utils; 2 | 3 | import java.io.*; 4 | import java.nio.charset.Charset; 5 | import java.util.Enumeration; 6 | import java.util.zip.ZipEntry; 7 | import java.util.zip.ZipFile; 8 | import java.util.zip.ZipOutputStream; 9 | 10 | /** 11 | * Created by zoulong on 2019/2/25 0025. 12 | */ 13 | public class FileUtils { 14 | public static boolean isExit(String path){ 15 | if(path == null && path.length() ==0) return false; 16 | File file = new File(path); 17 | return file.exists(); 18 | } 19 | 20 | public static boolean isExit(String ... paths){ 21 | for(String path:paths){ 22 | if(!isExit(path)) return false; 23 | } 24 | return true; 25 | } 26 | 27 | public static boolean unZip(String zipPath,String dstPath){ 28 | if(!isExit(zipPath)) return false; 29 | try { 30 | ZipFile zip = new ZipFile(zipPath, Charset.forName("GBK")); 31 | Enumeration em = (Enumeration) zip.entries(); 32 | while (em != null && em.hasMoreElements()){ 33 | ZipEntry ze = em.nextElement(); 34 | String outPath = dstPath + File.separator + ze.getName(); 35 | File dstFile = new File(outPath); 36 | if(!dstFile.exists()){ 37 | dstFile.getParentFile().mkdirs(); 38 | } 39 | InputStream in = zip.getInputStream(ze); 40 | FileOutputStream out = new FileOutputStream(outPath); 41 | byte[] buf = new byte[1024]; 42 | int len; 43 | while ((len = in.read(buf)) > 0){ 44 | out.write(buf,0,len); 45 | } 46 | in.close(); 47 | out.close(); 48 | } 49 | zip.close(); 50 | } catch (IOException e) { 51 | e.printStackTrace(); 52 | return false; 53 | } 54 | return true; 55 | } 56 | 57 | /** 58 | * 压缩成ZIP 方法1 59 | * @param srcDir 压缩文件夹路径 60 | * @param outPath 压缩文件输出流 61 | * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; 62 | * false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败) 63 | * @throws RuntimeException 压缩失败会抛出运行时异常 64 | */ 65 | public static void toZip(String srcDir, String outPath, boolean KeepDirStructure) 66 | throws RuntimeException{ 67 | ZipOutputStream zos = null ; 68 | try { 69 | zos = new ZipOutputStream(new FileOutputStream(outPath)); 70 | File sourceFile = new File(srcDir); 71 | File[] dirFiles = new File(srcDir).listFiles(); 72 | for(File file:dirFiles) 73 | compress(file,zos,file.getName(),KeepDirStructure); 74 | } catch (Exception e) { 75 | throw new RuntimeException("zip error from ZipUtils",e); 76 | }finally{ 77 | if(zos != null){ 78 | try { 79 | zos.close(); 80 | } catch (IOException e) { 81 | e.printStackTrace(); 82 | } 83 | } 84 | } 85 | } 86 | 87 | /** 88 | * 递归压缩方法 89 | * @param sourceFile 源文件 90 | * @param zos zip输出流 91 | * @param name 压缩后的名称 92 | * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; 93 | * false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败) 94 | * @throws Exception 95 | */ 96 | private static void compress(File sourceFile, ZipOutputStream zos, String name,boolean KeepDirStructure) throws Exception{ 97 | byte[] buf = new byte[1024]; 98 | if(sourceFile.isFile()){ 99 | // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字 100 | zos.putNextEntry(new ZipEntry(name)); 101 | // copy文件到zip输出流中 102 | int len; 103 | FileInputStream in = new FileInputStream(sourceFile); 104 | while ((len = in.read(buf)) != -1){ 105 | zos.write(buf, 0, len); 106 | } 107 | // Complete the entry 108 | zos.closeEntry(); 109 | in.close(); 110 | } else { 111 | File[] listFiles = sourceFile.listFiles(); 112 | if(listFiles == null || listFiles.length == 0){ 113 | // 需要保留原来的文件结构时,需要对空文件夹进行处理 114 | if(KeepDirStructure){ 115 | // 空文件夹的处理 116 | zos.putNextEntry(new ZipEntry(name + "/")); 117 | // 没有文件,不需要文件的copy 118 | zos.closeEntry(); 119 | } 120 | }else { 121 | for (File file : listFiles) { 122 | // 判断是否需要保留原来的文件结构 123 | if (KeepDirStructure) { 124 | // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠, 125 | // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了 126 | compress(file, zos, name + "/" + file.getName(),KeepDirStructure); 127 | } else { 128 | compress(file, zos, file.getName(),KeepDirStructure); 129 | } 130 | } 131 | } 132 | } 133 | } 134 | 135 | public static boolean delete(String path){ 136 | if(!isExit(path)) return true; 137 | File file = new File(path); 138 | if(file.isFile()){ 139 | return file.delete(); 140 | }else{ 141 | if(file.listFiles().length == 0) file.delete(); 142 | else{ 143 | for(File tempFile : file.listFiles()){ 144 | delete(tempFile.getAbsolutePath()); 145 | } 146 | return file.delete(); 147 | } 148 | } 149 | return true; 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /shell_util/src/com/utils/SecurityUtils.java: -------------------------------------------------------------------------------- 1 | package com.utils; 2 | 3 | import java.security.InvalidKeyException; 4 | import java.security.NoSuchAlgorithmException; 5 | import java.security.SecureRandom; 6 | 7 | import javax.crypto.BadPaddingException; 8 | import javax.crypto.Cipher; 9 | import javax.crypto.IllegalBlockSizeException; 10 | import javax.crypto.KeyGenerator; 11 | import javax.crypto.NoSuchPaddingException; 12 | import javax.crypto.SecretKey; 13 | import javax.crypto.spec.IvParameterSpec; 14 | import javax.crypto.spec.SecretKeySpec; 15 | 16 | /** 17 | * @author zl 18 | * @time 2019/2/26 0026. 19 | */ 20 | public class SecurityUtils { 21 | /* 22 | * 加密 23 | * 1.构造密钥生成器 24 | * 2.根据ecnodeRules规则初始化密钥生成器 25 | * 3.产生密钥 26 | * 4.创建和初始化密码器 27 | * 5.内容加密 28 | * 6.返回字符串 29 | */ 30 | public static byte[] AESEncryption(String privateKey,String iv,String AES_TYPE,byte[] data) throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException { 31 | IvParameterSpec zeroIv = new IvParameterSpec(iv.getBytes()); 32 | //两个参数,第一个为私钥字节数组, 第二个为加密方式 AES或者DES 33 | SecretKeySpec key = new SecretKeySpec(privateKey.getBytes(), "AES"); 34 | //实例化加密类,参数为加密方式,要写全 35 | Cipher cipher = Cipher.getInstance(AES_TYPE); //PKCS5Padding比PKCS7Padding效率高,PKCS7Padding可支持IOS加解密 36 | //初始化,此方法可以采用三种方式,按加密算法要求来添加。(1)无第三个参数(2)第三个参数为SecureRandom random = new SecureRandom();中random对象,随机数。(AES不可采用这种方法)(3)采用此代码中的IVParameterSpec 37 | //加密时使用:ENCRYPT_MODE; 解密时使用:DECRYPT_MODE; 38 | cipher.init(Cipher.ENCRYPT_MODE, key); //CBC类型的可以在第三个参数传递偏移量zeroIv,ECB没有偏移量 39 | //加密操作,返回加密后的字节数组,然后需要编码。主要编解码方式有Base64, HEX, UUE,7bit等等。此处看服务器需要什么编码方式 40 | byte[] encryptedData = cipher.doFinal(data); 41 | return encryptedData; 42 | } 43 | /* 44 | * 解密 45 | * 解密过程: 46 | * 1.同加密1-4步 47 | * 2.将加密后的字符串反纺成byte[]数组 48 | * 3.将加密内容解密 49 | */ 50 | public static byte[] AESDecrypt(String privateKey,String iv,String AES_TYPE,byte[] data) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException { 51 | IvParameterSpec zeroIv = new IvParameterSpec(iv.getBytes()); 52 | SecretKeySpec key = new SecretKeySpec(privateKey.getBytes(), "AES"); 53 | Cipher cipher = Cipher.getInstance(AES_TYPE); 54 | //与加密时不同MODE:Cipher.DECRYPT_MODE 55 | cipher.init(Cipher.DECRYPT_MODE, key); //CBC类型的可以在第三个参数传递偏移量zeroIv,ECB没有偏移量 56 | byte[] decryptedData = cipher.doFinal(data); 57 | return decryptedData; 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /shell_util/src/com/utils/SignUtils.java: -------------------------------------------------------------------------------- 1 | package com.utils; 2 | 3 | import java.io.IOException; 4 | 5 | /** 6 | * 使用该工具必须配置好java环境 7 | * Created by zoulong on 2019/2/26 0026. 8 | */ 9 | public class SignUtils { 10 | public static void V1(String apkPath,Keystore keystore) throws IOException, InterruptedException { 11 | String cmd = "jarsigner -verbose -keystore %s -storepass %s -keypass %s %s %s -digestalg SHA1 -sigalg SHA1withRSA"; 12 | cmd = String.format(cmd, new String[]{keystore.getPath(),keystore.getAliasPassword(),keystore.getPassword(),apkPath,keystore.getAliasName()}); 13 | CmdExecutor.executor(cmd); 14 | } 15 | 16 | public static Keystore getDefaultKeystore(){ 17 | Keystore keystore = new Keystore(); 18 | keystore.setPath("tools/keystore/test.keystore"); 19 | keystore.setName("test"); 20 | keystore.setAliasName("test"); 21 | keystore.setPassword("test123"); 22 | keystore.setAliasPassword("test123"); 23 | return keystore; 24 | } 25 | 26 | public static class Keystore { 27 | private String path; 28 | private String name; 29 | private String password; 30 | private String aliasName; 31 | private String aliasPassword; 32 | 33 | public String getPath() { 34 | return path; 35 | } 36 | 37 | public void setPath(String path) { 38 | this.path = path; 39 | } 40 | 41 | public String getName() { 42 | return name; 43 | } 44 | 45 | public void setName(String name) { 46 | this.name = name; 47 | } 48 | 49 | public String getPassword() { 50 | return password; 51 | } 52 | 53 | public void setPassword(String password) { 54 | this.password = password; 55 | } 56 | 57 | public String getAliasName() { 58 | return aliasName; 59 | } 60 | 61 | public void setAliasName(String aliasName) { 62 | this.aliasName = aliasName; 63 | } 64 | 65 | public String getAliasPassword() { 66 | return aliasPassword; 67 | } 68 | 69 | public void setAliasPassword(String aliasPassword) { 70 | this.aliasPassword = aliasPassword; 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /shell_util/tools/apktool/apktool.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/shell_util/tools/apktool/apktool.jar -------------------------------------------------------------------------------- /shell_util/tools/keystore/test.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ray-tianfeng/dex-shell/7623c3b16d4c36bf0cb941255603891a259826fd/shell_util/tools/keystore/test.keystore -------------------------------------------------------------------------------- /项目介绍.txt: -------------------------------------------------------------------------------- 1 | demo:原测试demo 2 | shell_util:加壳工程 3 | ReforceApk:解壳工程 --------------------------------------------------------------------------------