精华内容
下载资源
问答
  • Android APK 分析工具

    2019-03-04 17:21:05
    如果您想要验证 Gradle 是否已将原生库打包到 APK 中,可以使用APK 分析器: 选择Build > Analyze APK。 从app/build/outputs/apk/目录中选择 APK 并点击OK。 如图 3 中所示,您会在...

    官网介绍:

    https://developer.android.com/studio/build/apk-analyzer.html

    如果您想要验证 Gradle 是否已将原生库打包到 APK 中,可以使用 APK 分析器

    1. 选择 Build > Analyze APK
    2. 从 app/build/outputs/apk/ 目录中选择 APK 并点击 OK
    3. 如图 3 中所示,您会在 APK 分析器窗口的 lib/<ABI>/ 下看到 libnative-lib.so

    提示:如果您想要试验使用原生代码的其他 Android 应用,请点击 File > New > Import Sample 并从 Ndk 列表中选择示例项目。 

    展开全文
  • Android APK分析工具

    千次阅读 2016-07-06 15:00:37
    1、Apktool 官网: ... 源码: ...还原 Apk 中所包含的 resources.arsc...那些值得你试试的Android竞品分析工具 欢迎关注微信公众号:DroidMind 精品内容独家发布平台 呈现与博客不一样的技术干货

    1、Apktool

    官网:http://ibotpeaches.github.io/Apktool/

    源码:
    Github地址:https://github.com/iBotPeaches/Apktool
    Bitbucket地址:https://bitbucket.org/iBotPeaches/apktool/downloads

    配置文档:http://ibotpeaches.github.io/Apktool/install/
    使用文档:http://ibotpeaches.github.io/Apktool/documentation/

    功能:
    还原 Apk 中所包含的 resources.arsc, classes.dex, 9.png 和 xml 等文件;
    对 Apk 进行重新(二次)打包;
    反编译依赖于 Framework 的 apk 文件;
    运行调试 Smali 文件;

    2、SmaliIdea

    下载地址:https://bitbucket.org/JesusFreke/smali/downloads
    文档:https://github.com/JesusFreke/smali/wiki/smalidea

    功能:smali 调试,这个插件是基于 IntelliJ IDEA / Android Studio 的

    3、dex2jar

    官网:https://sourceforge.net/projects/dex2jar/

    源码:
    Github地址:https://github.com/pxb1988/dex2jar
    Bitbucket地址:https://bitbucket.org/pxb1988/dex2jar

    功能:
    将 dex 文件还原成为 jar 文件;
    将 dex 文件还原成为 smali 文件;

    4、jd-gui

    官网:http://jd.benow.ca/

    源码:https://github.com/java-decompiler/jd-gui

    功能:
    查看 dex 文件还原成为 jar 文件代码;
    将 jar 文件中所有的 class 文件转换成为 java 文件;

    5、enjarify

    源码:https://github.com/google/enjarify

    配置文档:下载源码到本地,并安装 Python3 的环境,同时配置好环境变量

    使用文档:可以参考上面的源码地址中的说明,或者乌云平台的文章 http://wiki.wooyun.org/android:tools:enjarify

    功能:可直接将 apk 文件还原成为 jar 文件,也可以和 dex2jar 一样,直接操作某个dex

    6、Procyon

    源码:https://bitbucket.org/mstrobel/procyon

    配置文档:通过下载链接 https://bitbucket.org/mstrobel/procyon/downloads ,下载 jar 包到本地即可

    使用文档:https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

    功能:将反编译得到 jar 包还原成 java 文件,同时能够更强的还原代码的逻辑结构

    7、jadx

    下载地址:https://github.com/skylot/jadx

    功能:和apktool反编译的功能差不多,但是有一个特色,就是他的可视化功能,能够高效的分析apk的结构

    ClassyShark

    官网:http://classyshark.com/

    源码:https://github.com/google/android-classyshark

    配置文档:通过下载链接 https://github.com/google/android-classyshark/releases ,下载 jar 包到本地即可

    功能:可直接浏览 Apk,支持对.dex, .aar, .so,.apk, .jar, .class等文件的操作。

    8、TcpDump

    官网:http://www.androidtcpdump.com/

    下载地址:http://www.androidtcpdump.com/android-tcpdump/downloads

    使用文档:

    Trinea版本:http://www.trinea.cn/android/tcpdump_wireshark/
    MrPeak版本:http://mrpeak.cn/blog/tutorial-tcpdump/

    功能:对手机进行网络抓包,前提是手机已经获取 Root 权限。支持 HTTP 和 HTTPS ,还支持更多其他协议。

    9、WireShark

    官网:https://www.wireshark.org/
    下载地址:https://www.wireshark.org/#download
    使用文档:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html (非常齐全的文档)

    功能:
    配置 Tcpdump 生成打 pcap 文件,进行分析;
    或者可以让电脑建立热点,手机连上电脑创建的热点进行抓包,这种方式处理起来更加方便灵活;

    10、Fiddler

    官网:http://www.telerik.com/fiddler

    下载地址:https://www.telerik.com/download/fiddler

    使用文档:直接参考 Trinea 的文章 http://www.trinea.cn/android/android-network-sniffer/ 即可。

    功能:支持对 HTTP 和 HTTPS 两种协议进行抓包。

    11、Charles

    下载地址:https://www.charlesproxy.com

    功能:Mac下面使用的抓包工具

    12、ByteCodeViewer

    官网:http://bytecodeviewer.com

    github:https://github.com/Konloch/bytecode-viewer

    功能:Java反编译

    13、Android Killer

    网址:http://www.pd521.com/thread-103-1-1.html

    功能:一款可视化的安卓应用逆向工具,集Apk反编译、Apk打包、Apk签名,编码互转,ADB通信(应用安装-卸载-运行-设备文件管理)等特色功能于一 身

    参考文章:

    http://www.jianshu.com/p/ba2d9eca47a2

    那些值得你试试的Android竞品分析工具

    欢迎关注微信公众号:DroidMind
    精品内容独家发布平台
    20170619210700424

    呈现与博客不一样的技术干货

    展开全文
  • 一款可视化的安卓应用逆向工具,集Apk反编译、Apk打包、Apk签名,编码互转,ADB通信(应用安装-卸载-运行-设备文件管理)等特色功能于一 身 参考文章: http://www.jianshu.com/p/ba2d9eca47a2 那些值得你试试的...

    1、Apktool

    官网:http://ibotpeaches.github.io/Apktool/

    源码:

    Github地址:https://github.com/iBotPeaches/Apktool

    Bitbucket地址:https://bitbucket.org/iBotPeaches/apktool/downloads

    配置文档:http://ibotpeaches.github.io/Apktool/install/

    使用文档:http://ibotpeaches.github.io/Apktool/documentation/

    功能:

    还原 Apk 中所包含的 resources.arsc, classes.dex, 9.png 和 xml 等文件;

    对 Apk 进行重新(二次)打包;

    反编译依赖于 Framework 的 apk 文件;

    运行调试 Smali 文件;

    2、SmaliIdea

    下载地址:https://bitbucket.org/JesusFreke/smali/downloads

    文档:https://github.com/JesusFreke/smali/wiki/smalidea

    功能:smali 调试,这个插件是基于 IntelliJ IDEA / Android Studio 的

    3、dex2jar

    官网:https://sourceforge.net/projects/dex2jar/

    源码:

    Github地址:https://github.com/pxb1988/dex2jar

    Bitbucket地址:https://bitbucket.org/pxb1988/dex2jar

    功能:

    将 dex 文件还原成为 jar 文件;

    将 dex 文件还原成为 smali 文件;

    4、jd-gui

    官网:http://jd.benow.ca/

    源码:https://github.com/java-decompiler/jd-gui

    功能:

    查看 dex 文件还原成为 jar 文件代码;

    将 jar 文件中所有的 class 文件转换成为 java 文件;

    5、enjarify

    源码:https://github.com/google/enjarify

    配置文档:下载源码到本地,并安装 Python3 的环境,同时配置好环境变量

    使用文档:可以参考上面的源码地址中的说明,或者乌云平台的文章 http://wiki.wooyun.org/android:tools:enjarify

    功能:可直接将 apk 文件还原成为 jar 文件,也可以和 dex2jar 一样,直接操作某个dex

    6、Procyon

    源码:https://bitbucket.org/mstrobel/procyon

    配置文档:通过下载链接 https://bitbucket.org/mstrobel/procyon/downloads ,下载 jar 包到本地即可

    使用文档:https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

    功能:将反编译得到 jar 包还原成 java 文件,同时能够更强的还原代码的逻辑结构

    7、jadx

    下载地址:https://github.com/skylot/jadx

    功能:和apktool反编译的功能差不多,但是有一个特色,就是他的可视化功能,能够高效的分析apk的结构

    ClassyShark

    官网:http://classyshark.com/

    源码:https://github.com/google/android-classyshark

    配置文档:通过下载链接 https://github.com/google/android-classyshark/releases ,下载 jar 包到本地即可

    功能:可直接浏览 Apk,支持对.dex, .aar, .so,.apk, .jar, .class等文件的操作。

    8、TcpDump

    官网:http://www.androidtcpdump.com/

    下载地址:http://www.androidtcpdump.com/android-tcpdump/downloads

    使用文档:

    Trinea版本:http://www.trinea.cn/android/tcpdump_wireshark/

    MrPeak版本:http://mrpeak.cn/blog/tutorial-tcpdump/

    功能:对手机进行网络抓包,前提是手机已经获取 Root 权限。支持 HTTP 和 HTTPS ,还支持更多其他协议。

    9、WireShark

    官网:https://www.wireshark.org/

    下载地址:https://www.wireshark.org/#download

    使用文档:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html (非常齐全的文档)

    功能:

    配置 Tcpdump 生成打 pcap 文件,进行分析;

    或者可以让电脑建立热点,手机连上电脑创建的热点进行抓包,这种方式处理起来更加方便灵活;

    10、Fiddler

    官网:http://www.telerik.com/fiddler

    下载地址:https://www.telerik.com/download/fiddler

    使用文档:直接参考 Trinea 的文章 http://www.trinea.cn/android/android-network-sniffer/ 即可。

    功能:支持对 HTTP 和 HTTPS 两种协议进行抓包。

    11、Charles

    下载地址:https://www.charlesproxy.com

    功能:Mac下面使用的抓包工具

    12、ByteCodeViewer

    官网:http://bytecodeviewer.com

    github:https://github.com/Konloch/bytecode-viewer

    功能:Java反编译

    13、Android Killer

    网址:http://www.pd521.com/thread-103-1-1.html

    功能:一款可视化的安卓应用逆向工具,集Apk反编译、Apk打包、Apk签名,编码互转,ADB通信(应用安装-卸载-运行-设备文件管理)等特色功能于一 身

    参考文章:

    http://www.jianshu.com/p/ba2d9eca47a2

    那些值得你试试的Android竞品分析工具

    欢迎关注微信公众号:DroidMind

    精品内容独家发布平台

    3cef6d9b46a74fb99013fe2fa8dc288f.jpg

    呈现与博客不一样的技术干货

    展开全文
  • Android studio 有工具Analyze APK 做了类似的事情,但是无法进行持续集成,本文参照Alalyze APK 的功能,分析APK各个文件大小,并给出对应的结果报告 使用方法 java -jar apk.jar App-1.0.apk App-2.0...

    apk文件比对

    新版本发布时,需要check下新版本Apk包大小,以及具体哪些文件导致Apk变大,从而针对性的进行优化。Android studio 有工具Analyze APK 做了类似的事情,但是无法进行持续集成,本文参照Alalyze APK 的功能,分析APK各个文件大小,并给出对应的结果报告

    使用方法

    java -jar apk.jar App-1.0.apk App-2.0.apk changes

    会输出diffReport.html

    diffReport.html 结果

    这里写图片描述

    源码

    Main.java

    import java.io.*;
    import java.text.NumberFormat;
    import java.util.*;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    
    import org.pegdown.PegDownProcessor;
    
    public class Main {
    
        static final String NA = "N/A";
        static String StyleCSS ="";
        static final NumberFormat format = NumberFormat.getInstance();
        static final Comparator comparator = new Comparator<DiffItem>() {
            @Override
            public int compare(DiffItem o1, DiffItem o2) {
                return (int) (Math.abs(o2.diffSize) - Math.abs(o1.diffSize));
            }
        };
    
        public static void main(String[] args) {
            if (args.length != 3) {
                System.out.println("Usage: ApkCompare oldApk newApk outputFilename");
                System.out.println("Example: ApkCompare App-1.0.apk App-2.0.apk changes");
                System.out.println("This would output a diff file named changes.md at current directory");
                return;
            }
    
            Map<String, Long> oldFilesInfo = getFilesInfo(args[0]);
            Map<String, Long> newFilesInfo = getFilesInfo(args[1]);
            List<DiffItem> outputDiffList = new ArrayList<DiffItem>();
            Set<Map.Entry<String, Long>> oldEntries = oldFilesInfo.entrySet();
    
            for (Map.Entry<String, Long> oldEntry : oldEntries) {
                DiffItem diffItem = new DiffItem();
                String keyOldFilename = oldEntry.getKey();
                diffItem.oldFilename = keyOldFilename;
                Long oldFileSize = oldEntry.getValue();
                Long newFileSize = newFilesInfo.get(keyOldFilename);
                if (newFileSize == null) { //新APK中删除了的文件
                    diffItem.newFilename = NA;
                    diffItem.diffSize = -oldFileSize;
                } else {
                    diffItem.newFilename = diffItem.oldFilename;
                    diffItem.diffSize = newFileSize - oldFileSize;
                }
                newFilesInfo.remove(keyOldFilename);
                if (diffItem.diffSize != 0L) { //仅统计文件大小有改变的情况
                    outputDiffList.add(diffItem);
                }
            }
    
            //新版本中新增的文件
            Set<Map.Entry<String, Long>> newEntries = newFilesInfo.entrySet();
            for (Map.Entry<String, Long> newEntry : newEntries) {
                DiffItem diffItem = new DiffItem();
                diffItem.oldFilename = NA;
                diffItem.newFilename = newEntry.getKey();
                diffItem.diffSize = newEntry.getValue();
                outputDiffList.add(diffItem);
            }
    
            outputMarkdown(args, outputDiffList);
    
            System.out.println("APK compare done!");
            System.out.println("output file: " + new File(args[2]).getAbsolutePath() + ".md");
            try {
                get(new File(args[2]).getAbsolutePath() + ".md");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        public static String readFile(String filepath)throws IOException{
            FileReader reader = new FileReader(filepath);//定义一个fileReader对象,用来初始化BufferedReader
            BufferedReader bReader = new BufferedReader(reader);//new一个BufferedReader对象,将文件内容读取到缓存
            StringBuilder sb = new StringBuilder();//定义一个字符串缓存,将字符串存放缓存中
            String s = "";
            while ((s =bReader.readLine()) != null) {//逐行读取文件内容,不读取换行符和末尾的空格
                sb.append(s + "\n");//将读取的字符串添加换行符后累加存放在缓存中
            }
            bReader.close();
            return  sb.toString();  
        }
    
        public static String readJarFile(String filepath)throws IOException{
            InputStream inputStream = Main.class.getResourceAsStream(filepath);
            BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream));         
            StringBuilder sb = new StringBuilder();
            String s = "";
            while ((s =bReader.readLine()) != null) {
                sb.append(s + "\n");
            }
            bReader.close();
            return  sb.toString();  
        }
    
    
        public static void get(String filepath) throws IOException{
            String html = null;
    
            html =readFile(filepath);       
    
            PegDownProcessor pdp = new PegDownProcessor(Integer.MAX_VALUE);
            html = pdp.markdownToHtml(html);
            StyleCSS = readJarFile("style.css");
            html=StyleCSS+html;
            FileWriter writer;
            try {
                writer = new FileWriter("diffReport.html");
                writer.write(html);
                writer.flush();
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }    
        }
    
    
    
        private static void outputMarkdown(String[] filenames, List<DiffItem> outputDiffList) {
            try {
                List<DiffItem> increased = new ArrayList<DiffItem>();
                List<DiffItem> decreased = new ArrayList<DiffItem>();
                List<DiffItem> added = new ArrayList<DiffItem>();
                List<DiffItem> removed = new ArrayList<DiffItem>();
    
                int increasedCnt = 0;
                int decreasedCnt = 0;
                int addedCnt = 0;
                int removedCnt = 0;
                //文件数量
                int increasedFileCnt = 0;
                int decreasedFileCnt = 0;
                int addedFileCnt = 0;
                int removedFileCnt = 0;
    
                for (DiffItem diffItem : outputDiffList) {
                    if (NA.equals(diffItem.oldFilename)) { //新版本完全新增文件
                        added.add(diffItem);
                        addedCnt += diffItem.diffSize;
                        addedFileCnt++;
                    } else if (NA.equals(diffItem.newFilename)) { //新版本删除了的文件
                        removed.add(diffItem);
                        removedCnt += diffItem.diffSize;
                        removedFileCnt++;
                    } else if (diffItem.diffSize > 0) { //同一文件有差异,新版本中size增加了
                        increased.add(diffItem);
                        increasedCnt += diffItem.diffSize;
                        increasedFileCnt++;
                    } else {//同一文件有差异,新版本中size减小了
                        decreased.add(diffItem);
                        decreasedCnt += diffItem.diffSize;
                        decreasedFileCnt++;
                    }
                }
    
                BufferedWriter writer = new BufferedWriter(new FileWriter(filenames[2] + ".md"));
                File oldApkFile = new File(filenames[0]);
    //            writer.write("### "+oldApkFile.getName());
    //            writer.write(" VS ");
                File newApkFile = new File(filenames[1]);
    //            writer.write(newApkFile.getName());
    //            writer.write("\n\n");
                writer.write("## 包大小 \n\n");
    
                writer.write("| 线上版本 | 新版本 | Diff |\n");
                writer.write("| --------- | --------- | ---------: |\n");
                writer.append("| ").append(long2float(oldApkFile.length())+"Mb ").
                       append("| ").append(long2float(newApkFile.length())+"Mb ").
                       append("| ").append(long2float(newApkFile.length() - oldApkFile.length())+"Mb ")
                       .append("| \n");
    
                writer.write("## 包大小详细文件比对 \n\n");
                writer.write("| 文件 | 数量 | Diff (byte) |\n");
                writer.write("| --------- | --------- | ---------: |\n");
                writer.append("| 新版本中增加的文件 | ").append(format.format(addedFileCnt)+" | ").append(format.format(addedCnt)).append(" | \n");
                writer.append("| 新版本中大小增加的文件 | ").append(format.format(increasedFileCnt)+" | ").append(format.format(increasedCnt)).append(" | \n");
                writer.append("| 新版本中大小减小的文件 | ").append(format.format(decreasedFileCnt)+" | ").append(format.format(decreasedCnt)).append(" | \n");
                writer.append("| 新版本中被删除的文件 | ").append(format.format(removedFileCnt)+" | ").append(format.format(removedCnt)).append(" | \n");
                writer.append("| 总计 | ").append(format.format(addedFileCnt+increasedFileCnt+decreasedFileCnt+removedFileCnt)+" | ").append(format.format(addedCnt + increasedCnt + decreasedCnt + removedCnt)).append("   | \n\n");
    
                outputMarkdownAddedList(writer, added);
                outputMarkdownIncreasedList(writer, increased);
                outputMarkdownDecreasedList(writer, decreased);
                outputMarkdownRemovedList(writer, removed);
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private static void outputMarkdownAddedList(Writer writer, List<DiffItem> outputDiffList) {
            if (outputDiffList.size() > 0) {
                try {
                    Collections.sort(outputDiffList, comparator);
                    writer.append("## ").append("新版本中增加的文件");
                    writer.append("<a name=\"added\"></a>\n");
                    writer.append("| File Name | Size (byte)|\n");
                    writer.append("| --------- | ---------: |\n");
                    for (DiffItem diffItem : outputDiffList) {
                        writer.append("| ").append(diffItem.newFilename).append(" | ")
                                .append(format.format(diffItem.diffSize))
                                .append(" |\n");
                        writer.flush();
                    }
                    writer.write("\n");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        private static void outputMarkdownIncreasedList(Writer writer, List<DiffItem> outputDiffList) {
            if (outputDiffList.size() > 0) {
                try {
                    Collections.sort(outputDiffList, comparator);
                    writer.append("## ").append("新版本中大小增加的文件");
                    writer.append("<a name=\"increased\"></a>\n");
                    writer.append("| File Name | Increased Size (byte)|\n");
                    writer.append("| --------- | ---------: |\n");
                    for (DiffItem diffItem : outputDiffList) {
                        writer.append("| ").append(diffItem.newFilename).append(" | ")
                                .append(format.format(diffItem.diffSize))
                                .append(" |\n");
                        writer.flush();
                    }
                    writer.write("\n");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        private static void outputMarkdownDecreasedList(Writer writer, List<DiffItem> outputDiffList) {
            if (outputDiffList.size() > 0) {
                try {
                    Collections.sort(outputDiffList, comparator);
                    writer.append("## ").append("新版本中大小减小的文件");
                    writer.append("<a name=\"decreased\"></a>\n");
                    writer.append("| File Name | Decreased Size (byte)|\n");
                    writer.append("| --------- | ---------: |\n");
                    for (DiffItem diffItem : outputDiffList) {
                        writer.append("| ").append(diffItem.newFilename).append(" | ")
                                .append(format.format(diffItem.diffSize))
                                .append(" |\n");
                        writer.flush();
                    }
                    writer.write("\n");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        private static void outputMarkdownRemovedList(Writer writer, List<DiffItem> outputDiffList) {
            if (outputDiffList.size() > 0) {
                try {
                    Collections.sort(outputDiffList, comparator);
                    writer.append("## ").append("新版本中被删除的文件");
                    writer.append("<a name=\"removed\"></a>\n");
                    writer.append("| File Name | Decreased Size (byte)|\n");
                    writer.append("| --------- | ---------: |\n");
                    for (DiffItem diffItem : outputDiffList) {
                        writer.append("| ").append(diffItem.oldFilename).append(" | ")
                                .append(format.format(diffItem.diffSize))
                                .append(" |\n");
                        writer.flush();
                    }
                    writer.write("\n");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        private static Map<String, Long> getFilesInfo(String apkFilePath) {
            Map<String, Long> map = new LinkedHashMap<String, Long>();
            try {
                ZipFile apkFile = new ZipFile(apkFilePath);
                Enumeration<? extends ZipEntry> entries = apkFile.entries();
                while (entries.hasMoreElements()) {
                    ZipEntry entry = entries.nextElement();
                    String filename = entry.getName();
                    long size = entry.getSize();
                    map.put(filename, size);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return map;
        }
    
        private static class DiffItem {
            String oldFilename;
            String newFilename;
            Long diffSize;
        }
    
        public static float long2float(long l){
            return (float)(Math.round(Float.valueOf(l)/(1024*1024)*100))/100;
        }
    
    }

    css文件

    <html lang= "zh-CN">
    <head>
    <style type="text/css">
        body {
            font: normal 11px auto "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
            color: #4f6b72;
            background: #E6EAE9;
        }
        a {
            color: #c75f3e;
        }
        table {
            width: 700px;
            padding: 0;
            margin: 0;
            border: 0;
            margin: 0;
            border-collapse: collapse;
            border-spacing: 0;
        }
        th {
            font: bold 11px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
            color: #4f6b72;
            border-right: 1px solid #C1DAD7;
            border-bottom: 1px solid #C1DAD7;
            border-top: 1px solid #C1DAD7;
            letter-spacing: 2px;
            text-transform: uppercase;
            text-align: left;
            padding: 6px 6px 6px 12px;
            background: #CAE8EA no-repeat;
        }
        td {
            border-right: 1px solid #C1DAD7;
            border-bottom: 1px solid #C1DAD7;
            background: #fff;
            font-size: 11px;
            padding: 6px 6px 6px 12px;
            color: #4f6b72;
        }
        /*---------for IE 5.x bug*/
        html>body td {
            font-size: 11px;
        }
        body,
        td,
        th {
            font-family: 宋体, Arial;
            font-size: 12px;
        }
        </style>
    </head>

    pom文件

    <?xml version="1.0" encoding="UTF-8"?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.example.test</groupId>
      <artifactId>apk</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    
      <name>apk</name>
      <!-- FIXME change it to the project's website -->
      <url>http://www.example.com</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
        <dependency>
        <groupId>org.pegdown</groupId>
        <artifactId>pegdown</artifactId>
        <version>1.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.commonjava.googlecode.markdown4j</groupId>
        <artifactId>markdown4j</artifactId>
        <version>2.2-cj-1.0</version>
    </dependency>
      </dependencies>
    
      <build>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
          <plugins>
            <plugin>
              <artifactId>maven-clean-plugin</artifactId>
              <version>3.0.0</version>
            </plugin>
            <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
            <plugin>
              <artifactId>maven-resources-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.7.0</version>
            </plugin>
            <plugin>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>2.20.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-jar-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-install-plugin</artifactId>
              <version>2.5.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-deploy-plugin</artifactId>
              <version>2.8.2</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </project>
    

    将其导成jar包,既可以在持续集成中使用

    展开全文
  • Android apk 分析工具APK Analyzer

    万次阅读 2017-04-06 00:12:18
    前言Android studio 2.2 版本后自带有一个分析工具APK Analyzer。这是一个专门分析 apk 的神器,主要作用如下: 1. (重要) 直观的看到 apk 中各个文件的大小 (比如 DEX,resource 等等)。我们可根据文件大小信息...
  • 安卓APK分析工具APKAnalyser的使用

    千次阅读 2015-07-31 17:48:32
    APKAnalyser 是 Android 静态,虚拟分析工具,用来测试和验证 Android 应用的开发工作。ApkAnalyser 是个完整的工具链,可以修改二进制应用。用户可以改装,安装,运行,验证 logcat 的结果。ApkAnalyser 同时支持...
  • Android Studio APK分析工具--APK Analyzer

    千次阅读 2016-12-15 10:07:52
    1、将一个apk拖动到Android Studio的编辑器窗口 2、在Project窗口中,双击build/output/apks/目录下的apk 3、在菜单栏中选择选择Build &gt; Analyze APK,然后选择要分析apk 按照上面方法就可以进入下面...
  • Android应用程序分析主要有静态分析和动态分析两种,常见的静态分析工具是Apktool、dex2jar以及jdgui。今天突然主要到Google code上有个叫做androguard的工具,提供了一系列的Apk以及dex、odex、arsc等文件的分析...
  • 原文:...中提供了一个非常实用的tool - apkanalyzer, 该tool的路径是android_sdk/tools/bin/apkanalyzer注意:该tool无法直接在window上运行,请下载安装git for windows: https:/...
  • 主要介绍了Android快速分析apk工具aapt的使用教程,本文讲解了什么是aapt、主要用法、使用aapt、查看apk的基本信息、查看基本信息、查看应用权限等内容,需要的朋友可以参考下
  • 包含三个APK分析的常用工具软件,ApkAnalyser-master.zip;APKMessenger.zip;onekey-decompile-apk-1.0.1.zip
  • 1.下载ApkAnalyser的jar包2. 启动 java -Xmx1024m -jar ApkAnalyser.jar 双击也可以3. 设置adb的路径在 File>settings 目录下4. 设置apk及sdk路径在 File>Set paths...左边 Android SDK 里设置sdk路径: /android-sdk-p
  • 关于使用Android Studio的APK分析工具Analyze Apk,可以十分方便的查看Apk的基本信息,如占用空间、版本号、SDK版本等,可以看到各个文件大小,如DEX、res、lib、assets等,及利用ApkAnalyzer分析学习第三方APK的...
  • Android apk包解压逆向工具,你可以用它来解压apk文件,来分析Android apk大致的架构。比较适合Android apk 分析
  • 这是一个基于radare2,apktool和APKiD的APK文件静态分析工具
  • 一款可视化的、易用的、快捷的、一体化的安卓APK修改工具,集成了ApkTool、Dex2jar、JD-GUI等Apk修改工具,集Apk反编译、Apk查壳、加密解密、Apk调试分析Apk打包、Apk签名,支持语法高亮的代码编辑器。
  • 01 背景 apk体积的不断增大,会带来很多限制和问题。可以在分析apk的构成时,分析哪些文件或者资源是可以优化的。...android studio自带的 apk分析器 (参考文末连接) 常用命令: aapt l xxx.ap...
  • Android apk分析利器--ClassyShark

    千次阅读 2017-08-02 17:18:20
    一、概述对一个程序员来说可以破解别人的app是一...今天就和大家一起学习一款好用的apk分析利器ClassyShark,通过使用ClassyShark我们可以很容易的看到一个apk使用了哪些第三方开源库,对于我们日常进行开发工作还是很
  • Android Apk反编译工具

    2018-09-10 14:15:12
    ClassShark 是一款查看Android执行文件(apk)的浏览工具, 使用这款工具,可以很方便的打开APK/Zip/Class/Jar 文件和分析里面的内容。
  • Android apk反编译工具

    2017-09-19 11:20:30
    Apk反编译工具包括了apktool、dex2jar和jd-gui三个工具,apktool用于apk反编译获取资源文件等,dex2jar用于分析classes.dex文件,jd-gui可以用于打开dex2jar分析生成的classes-dex2jar.jar文件从而查看源代码。
  • java反编译源码保护应用程序分析器 用于获取有关 Andoid APK 文件的详细信息的 Java 应用程序/库。 如何使用 准备首次使用 如果要构建和更改 ApkAnalyzer 的代码,则需要执行以下步骤。 ApkAnalyzer 使用 Apktool ...
  • ApkTool Android APK 逆向分析

    千次阅读 2017-02-20 22:05:06
    AndroidAPK 逆向分析 下载APK逆向工具ApkTool下载地址 https://ibotpeaches.github.io/Apktool/ 查看安装说明 https://ibotpeaches.github.io/Apktool/install/ 检查java版本 C:\Users\Administrator>...
  • ApkToolPlus 是一个可视化的跨平台 apk 分析工具,使用 java 语言开发的一个桌面应用。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,290
精华内容 12,916
热门标签
关键字:

安卓apk分析工具