一个快速分析android app使用了哪些sdk的工具

简介: 一个快速分析android app使用了哪些sdk的工具

前段时间我们要准备开始做移动端广告sdk,我需要了解市面上一些常用的广告sdk使用情况。如果一个个app去分析,那工作量会非常庞大,所以就产生了这个工具AnalysisApp。通过这个工具我已经分析了top 200个app,并可以识别出99个sdk。能够识别的sdk列表


要是时间充裕,我会不断完善这个项目。


github地址:


https://github.com/fengzhizi715/AnalysisApp


工具使用



首先,它是一个java工程,用Intellij Idea进行开发。混合着groovy,你完全可以把它看成是java,因为需要借助groovy的语法糖快速实现一些功能。


image.png


AnalysisApp工程目录.jpeg


其次,如果要分析某个app使用哪些sdk,必须把AnalysisApp的代码clone下来,并且需要拿到待分析app的AndroidManifest.xml文件。如何获取app的AndroidManifest.xml文件不在本工具的使用范围之列。


AnalysisApp程序的入口在Main.java的main()方法中。需要修改AndroidManifest.xml的路径。

image.png


程序入口.jpeg


其实,更好的做法是把它做成一个service放在服务端,可以不断更新sdk的特征值。

最后,我们来看一下它分析某个app的运行效果:


image.png


分析sdk结果.jpeg


实现原理



  1. 读取某个app的AndroidManifest.xml文件,将其转换成相应的对象。
  2. 遍历该对象中Activity、Service、meta-data、Receiver等元素列表,将其跟sdk的特征值进行匹配。如果匹配成功表示app包含该sdk,并记录下来。


由于整个工程是java的工程,所以由Spring进行统一管理。


handler包下的各个Handler用于处理sdk的特征值。

image.png


handler包下的各个Handler.jpeg


一个Handler至少有一个sdk的特征值。Spring对这些Handler进行管理,通过责任链(Chain of Responsibility)模式将各个Handler串联起来。

@Data
public class Analysis {
    private List<BaseHandler> handlers;
    public BaseHandler getFirstHandler() {
        if (Preconditions.isNotBlank(handlers)) {
            int len = handlers.size();
            for (int i = 0;i<len;i++) {
                if(i>0) {
                    handlers.get(i-1).setNextHandler(handlers.get(i));
                }
            }
            return handlers.get(0);
        }
        return null;
    }
}


对于某些特别复杂的Handler,比如BAT这几家都有很多sdk,他们的Handler会写的非常长,所以采用DFA的算法进行优化。以百度为例,简化了BaiduHandler的代码量。

@Service
class BaiduHandler extends BaseHandler {
    protected boolean handle(ActivityRequest request) {
        State s;
        for (s = BaiduStates.Init; !(s instanceof FinalState); s=s.next(request)) {
        }
        return s == AcceptingState.Accept;
    }
}


所有需要处理BaiduHandler的逻辑放到BaiduStates中去。

/**
 * Created by tony on 16/8/12.
 */
public enum BaiduStates implements State {
    Init {
        public State next(ActivityRequest request) {
            if (request.getActivity()!=null) {
                return ACTIVITY_STATE;
            } else if (request.getMetadata()!=null) {
                return METADATA_STATE;
            } else if (request.getService()!=null) {
                return SERVICE_STATE;
            }
            return FailingState.Fail;
        }
    },
    ACTIVITY_STATE {
        public State next(ActivityRequest request) {
            if (request.getActivity().getName() != null) {
                if (request.getActivity().getName().equals("com.baidu.wallet.paysdk.ui.WelcomeActivity")) {
                    SDK sdk = new SDK("百度钱包sdk");
                    AppInfo.getInstance().addSDK(sdk);
                    return AcceptingState.Accept;
                } else if (request.getActivity().getName().equals("com.baidu.mobad.feeds.BaiduActivity")) {
                    SDK sdk = new SDK("百度MSSP信息流广告",true);
                    AppInfo.getInstance().addSDK(sdk);
                    return AcceptingState.Accept;
                }
            }
            return FailingState.Fail;
        }
    },
    METADATA_STATE {
        public State next(ActivityRequest request) {
            if (request.getMetadata().getName() != null) {
                if (request.getMetadata().getName().equals("com.baidu.lbsapi.API_KEY")) {
                    SDK sdk = new SDK("百度地图sdk");
                    AppInfo.getInstance().addSDK(sdk);
                    return AcceptingState.Accept;
                } else if (request.getMetadata().getName().equals("BaiduMobAd_APP_ID")) {
                    SDK sdk = new SDK("百度广告联盟sdk",true);
                    AppInfo.getInstance().addSDK(sdk);
                    return AcceptingState.Accept;
                } else if (request.getMetadata().getName().equals("BaiduMobAd_STAT_ID")) {
                    SDK sdk = new SDK("百度移动统计sdk");
                    AppInfo.getInstance().addSDK(sdk);
                    return AcceptingState.Accept;
                }
            }
            return FailingState.Fail;
        }
    },
    SERVICE_STATE {
        public State next(ActivityRequest request) {
            if (request.getService().name !=null) {
                if (request.getService().name.equals("com.baidu.android.pushservice.PushService")) {
                    SDK sdk = new SDK("百度云推送sdk");
                    AppInfo.getInstance().addSDK(sdk);
                    return AcceptingState.Accept;
                }
            }
            return FailingState.Fail;
        }
    };
    public abstract State next(ActivityRequest request);
}


相关文章
|
28天前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
109 0
安卓项目:app注册/登录界面设计
|
2月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
45 2
|
8天前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
34 15
Android 系统缓存扫描与清理方法分析
|
9天前
|
程序员 开发工具 Android开发
Android|使用阿里云推流 SDK 实现双路推流不同画面
本文记录了一种使用没有原生支持多路推流的阿里云推流 Android SDK,实现同时推送两路不同画面的流的方法。
32 7
|
2月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
104 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
22天前
|
存储 Linux Android开发
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作
|
2月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
114 3
|
2月前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
102 2
|
21天前
|
API 开发工具 UED
在 UWP 中使用 Windows App SDK
【10月更文挑战第17天】在UWP中使用Windows App SDK可增强应用功能和性能。首先了解SDK特性,接着安装Visual Studio 2022及以上版本,并从微软官网下载安装SDK。配置项目时,确保目标版本支持SDK,添加SDK引用后即可使用新API提升应用体验。开发过程中应充分利用调试工具进行测试,确保应用的兼容性和稳定性。
|
22天前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。

热门文章

最新文章