一个快速分析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);
}


相关文章
|
1月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
117 4
|
1月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
2月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
203 0
安卓项目:app注册/登录界面设计
|
22天前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
27 8
|
2月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
80 15
Android 系统缓存扫描与清理方法分析
|
1月前
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
49 8
|
25天前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
33 1
|
1月前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
1月前
|
Java 开发工具 Windows
【Azure App Service】在App Service中调用Stroage SDK上传文件时遇见 System.OutOfMemoryException
System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
|
1月前
|
Java Linux API
Android SDK
【10月更文挑战第21天】
82 1