Android apk多渠道验证工具 – 不提供工具,只提供源码

原理基于上篇的多渠道打包工具,我们使用apktool解压需要验证的apk文件后,去读AndroidManifest.xml,当读到渠道号哪一行的时候输出即可。

源码如下:

Main.java

[java][/java] view plaincopy

  1. package com.Market5577.channelVerifyTool;
  2. public class Main {
  3.     public static void main(String[] args) {
  4.         System.out
  5.                 .println(“=====**====Code by H3c=====**======”);
  6.         System.out.println(“==**==渠道验证工具==**==”);
  7.         if (args.length != 1) {
  8.             System.out
  9.                     .println(“==ERROR==usage:java -jar channelV.jar apkDirectory======”);
  10.             System.out
  11.                     .println(“==INFO==Example: java -jar channelV.jar /apps======”);
  12.             return;
  13.         }
  14.         String apk = args[0];
  15.         SplitApk sp = new SplitApk(apk);
  16.         sp.mySplit();
  17.     }
  18. }

SplitApk.java

[java][/java] view plaincopy

  1. package com.Market5577.channelVerifyTool;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;
  7. import java.util.HashMap;
  8. public class SplitApk {
  9.     HashMap<String, String> qudao = new HashMap<String, String>();// 渠道号,渠道名
  10.     String curPath;// 当前文件夹路径
  11.     String apkDirectory;
  12.     public SplitApk(String directory) {
  13.         this.curPath = new File(“”).getAbsolutePath();
  14.         this.apkDirectory = directory;
  15.     }
  16.     public void mySplit() {
  17.         File dire = new File(apkDirectory);
  18.         if (!dire.exists()) {
  19.             System.out.println(“没有该文件”);
  20.             return;
  21.         }
  22.         if (dire.isDirectory()) {
  23.             File[] sonFile = dire.listFiles();
  24.             for (File file : sonFile) {
  25.                 modifyXudao(file.getAbsolutePath());
  26.             }
  27.         } else {
  28.             modifyXudao(apkDirectory);
  29.         }
  30.         System.out.println(“====Over====”);
  31.     }
  32.     /**
  33.      * apktool解压apk,替换渠道值
  34.      *
  35.      * @throws Exception
  36.      */
  37.     private void modifyXudao(String apkName) {
  38.         // 解压 /C 执行字符串指定的命令然后终断
  39.         String cmdUnpack = “cmd.exe /C java -jar apktool.jar d -f -s “
  40.                 + apkName;
  41.         runCmd(cmdUnpack);
  42.         String[] apkFilePath = apkName.split(“\\\\”);
  43.         String shortApkName = apkFilePath[apkFilePath.length – 1];
  44.         String dir = shortApkName.split(“.apk”)[0];
  45.         File packDir = new File(dir);// 获得解压的apk目录
  46.         String f_mani = packDir.getAbsolutePath() + “\\AndroidManifest.xml”;
  47.         File manifest = new File(f_mani);
  48.         for (int i = 0; i < 10; i++) {
  49.             if (manifest.exists()) {
  50.                 break;
  51.             }
  52.             try {
  53.                 Thread.sleep(1000);
  54.             } catch (InterruptedException e) {
  55.                 e.printStackTrace();
  56.             }
  57.         }
  58.         if (!manifest.exists()) {
  59.             System.out.println(“====验证失败======”);
  60.         }
  61.         /*
  62.          * 遍历map,复制manifese进来,修改后打包,签名,存储在对应文件夹中
  63.          */
  64.         BufferedReader br = null;
  65.         FileReader fr = null;
  66.         String keyLine = null;
  67.         try {
  68.             fr = new FileReader(manifest);
  69.             br = new BufferedReader(fr);
  70.             String line = null;
  71.             while ((line = br.readLine()) != null) {
  72.                 if (line.contains(“\”BaiduMobAd_CHANNEL\””)) { // 关键代码===我这里是用的百度统计工具
  73.                     keyLine = line;
  74.                 }
  75.             }
  76.         } catch (Exception e) {
  77.             e.printStackTrace();
  78.             System.out.println(“====验证失败======”);
  79.         } finally {
  80.             try {
  81.                 if (fr != null) {
  82.                     fr.close();
  83.                 }
  84.                 if (br != null) {
  85.                     br.close();
  86.                 }
  87.             } catch (IOException e) {
  88.                 e.printStackTrace();
  89.             }
  90.         }
  91.         if (keyLine != null) {
  92.             String tmps[] = keyLine.split(“\\\””);
  93.             System.out.println(“读到的渠道是:” + tmps[3]);
  94.         } else {
  95.             System.out.println(“====验证失败,请关闭======”);
  96.         }
  97.         // 删除中途文件
  98.         String cmdKey = String.format(“cmd.exe /C rd /s/q %s”, dir);
  99.         runCmd(cmdKey);
  100.     }
  101.     /**
  102.      * 执行指令
  103.      *
  104.      * @param cmd
  105.      */
  106.     public void runCmd(String cmd) {
  107.         Runtime rt = Runtime.getRuntime();
  108.         BufferedReader br = null;
  109.         InputStreamReader isr = null;
  110.         try {
  111.             Process p = rt.exec(cmd);
  112.             // p.waitFor();
  113.             isr = new InputStreamReader(p.getInputStream());
  114.             br = new BufferedReader(isr);
  115.             String msg = null;
  116.             while ((msg = br.readLine()) != null) {
  117.                 System.out.println(msg);
  118.             }
  119.         } catch (Exception e) {
  120.             e.printStackTrace();
  121.         } finally {
  122.             try {
  123.                 if (isr != null) {
  124.                     isr.close();
  125.                 }
  126.                 if (br != null) {
  127.                     br.close();
  128.                 }
  129.             } catch (IOException e) {
  130.                 e.printStackTrace();
  131.             }
  132.         }
  133.     }
  134. }

生成jar后写一个批处理即可:

[html][/html] view plaincopy

  1. @echo off
  2. ::set /p var=请拖入apk:
  3. ::java -jar cVerify.jar %var%
  4. java -jar cVerify.jar C:\Users\Harris\Desktop\rePackTool\apk
  5. echo.&echo 请按任意键退出…&pause>nul
  6. exit

该工具支持文件和文件夹的拖入~

全文完

标签