国内市场上有许许多多的应用市场,常见的有:百度、360、腾讯应用宝、豌豆荚等。其他手机厂家如小米、华为、魅族、三星等都有自己的应用市场,总共有上百家!

1. 问题

发版前,Android工程师打包了上百个渠道版本,如何检验渠道号与apk名称是否一致?版本、友盟、环信、极光推送、高德地图等key是否准确?

2. 怎么做

Android Apk的渠道号、key等一般存放在AndroidManifest.xml文件中。

批量反编译Android Apk

遍历反编译后的apk文件夹,从AndroidManifest.xml取出渠道号

比较渠道号与apk名称、比较各种key

将测试结果写入csv文件

3. 过程

3.1 安装环境

windows/Linux/Mac都可,你需要做的就是安装好Java,或Python。由于android为java所编写,所以需要下载apktool.jar反编译工具反编译class文件和xml文件。

3.2 反编译Android Apk

apktool.jar -f 会对apk的资源文件、源码等所有的文件进行反编译,耗时较长。

使用 -s 选项可跳过源码编译,节省时间。

java -jar apktool.jar d -f package.apk

输出结果如下:

I: Using Apktool 2.1.0 on test.apk

I: Loading resource table...

I: Decoding AndroidManifest.xml with resources...

I: Loading resource table from file: C:\Users\Administrator\apktool\framework\1.apk

I: Regular manifest package...

I: Decoding file-resources...

I: Decoding values */* XMLs...

I: Baksmaling classes.dex...

I: Copying assets and libs...

I: Copying unknown files...

I: Copying original files...

打开AndroidManifest.xml文件,即可看到渠道号

3.3 获取渠道号

几十个渠道怎么办?这时就用到python了。

输入目录,遍历目录下的apk.

def decompiler(vdir):

vapk = [ cv for cv in os.listdir(vdir) if os.path.splitext(cv)[1] == '.apk' ]

print(" -> The Path has found {0} channel version,is in decomopiling,Please wait.....\n".format(len(vapk)))

for idx,apk in enumerate(vapk):

channeldir,extension = os.path.splitext(apk)

if os.path.isdir(channeldir):

pass

else:

print(" -> The \033[1;37;44m {0} \33[0m Apk is processing : {1}".format(idx,apk))

#反编译apk文件

os.popen('java -jar apktool.jar d -s {0}'.format(apk))

reverse_apk_folder = [ opf for opf in os.listdir(vdir) if os.path.isdir(opf) ]

print("-------------------------------------------------------------------")

print(" -> {0} Finish Apk decompiling.".format(now))

print(" -> Total: \033[1;32;44m {0} \33[0m Apk Floder. ".format(len(reverse_apk_folder)))

return vapk,reverse_apk_folder

或者直接输入编译后的apk文件夹,具体如下:

def get_apk_umeng_value(reverse_folder):

umeng_channel = []

for rfn in reverse_folder:

manifest = os.path.join(version_catalogue,rfn,'AndroidManifest.xml')

with open(manifest,'r+') as m:

umeng_line = [ line.strip() for line in m.readlines() if 'UMENG_CHANNEL' in line ]

for ul in umeng_line:

ucv = ul.split('=')[2]

#使用strip过滤"/>//--等特殊字符

umeng_channel.append(ucv.strip('"/>// --'))

return umeng_channel

处理AndroidManifest.xml文件

def handling(filename,text):

textual_value = ""

with open(filename,'r+') as m:

line = [ line.strip() for line in m.readlines() if text in line ]

for n in line:

value = n.split('=')[2]

#使用strip过滤"/>//--等特殊字符

textual_value = value.strip('"/>// --')

return textual_value

3.4 结果输出

使用python pandas优雅输出测试结果,并写入到csv文件。

Paste_Image.png

完整代码地址:

https://github.com/yi-heng/Android-Test/blob/master/Android_Channel_Test/channelverify.py

android渠道校验,Android渠道版本自动化校验相关推荐

  1. AVB校验微观版本:android avb(Android Verified Boot)验证

    前辈原文:https://blog.csdn.net/weixin_43836778/article/details/90400147 其实可能有人会说,怎么整这么多重复的,其实不是的.这是为了不断地 ...

  2. android 渠道方案,Android多渠道打包时获取当前渠道的方法

    作为Androidapp,发布多个分发平台是常规操作.然后,有时由于个渠道面对的用户不同,或平台审核标准不同,需要在各渠道使用不同的业务逻辑,这就需要根据渠道使用选择差异化代码. 这里把简单的代码记一 ...

  3. android 渠道索取,Android多渠道打包时获取当前渠道的方法

    作为android app,发布多个分发平台是常规操作.然后,有时由于个渠道面对的用户不同,或平台审核标准不同,需要在各渠道使用不同的业务逻辑,这就需要根据渠道使用选择差异化代码. 这里把简单的代码记 ...

  4. android 8.0的imei简书,Android 8.0通知栏渠道,渠道组的适配和使用

    Android 8.0通知栏渠道,渠道组的适配和使用 推广一下 博客 android 8.0开始引入了渠道组的概念,app可以对通知类型进行细分,比如划分为:广告消息,私聊消息,群聊消息等. 但其实到 ...

  5. android多渠道 依赖,android 不同渠道 添加不同依赖jar 使用不同代码

    android由于不同的渠道用到的依赖不同,比如个推sdk分谷歌市场版和国内版,要在同一个项目中根据渠道来分别加载两个sdk. 1.将两个jar包凡在src目录下的lib文件夹中,并且在gradle文 ...

  6. 踩雷1:Android Studio:3dmap 隐私合规校验失败: errorcode 555570 确保调用SDK任何接口前先调用更新隐私合规updatePrivacyShow、updateP

    Android Studio:3dmap 隐私合规校验失败: errorcode 555570 确保调用SDK任何接口前先调用更新隐私合规 出现隐私合规校验失败这样的情况下,查找高德地图开发者平台开发 ...

  7. android 渠道方案,Android 不同渠道差异代码

    前言 在开发过程中,会遇到这种业务. 在某一个渠道,需要引入一些三方sdk,需要写一些差异性代码,跟原来的业务有重叠.如果所有的判断逻辑都写在一起,会出现很多if(flavor==xxx),并且三方s ...

  8. Android Studio Gradle实践之多渠道自动化打包+版本号管理

    转: Android Studio Gradle实践之多渠道自动化打包+版本号管理 上次介绍了Android Studio的安装.配置和基本使用.这次讲一下Android Studio用到的打包工具G ...

  9. Android Studio TV开发教程(十五) Android N及更早版本中的建议

    Android Studio TV开发教程 (转自Android官网https://developer.android.com/training/tv/start) 文章源自:光谷佳武 https:/ ...

最新文章

  1. It--网络生涯去向何方?
  2. 机器学习笔记:线性判别分析(Fisher)
  3. 就业局培训计算机心得,人社局计算机培训心得体会.doc
  4. Centos7 +Django的安装
  5. 利用定时器中断方式控制led灯的闪烁速度_实验四 LED点阵
  6. 智能用电计量管理系统 远程预付费管理系统的设计与应用
  7. 惠普HP ENVY 5055 打印机驱动
  8. smart原则_设立目标的smart原则
  9. 16.子查询之exists型子查询
  10. 程序员的进化,Python程序员是最大的亮点
  11. 修改rpg maker mv的几种上限2020-05-25
  12. 转载:stm32的引脚有两种用途
  13. libxml2下载,下载地址大全
  14. 2021届工科生求职日记1——Abing
  15. lms算法的verilog实现_最小均方算法(LMS Algorithm)理论及DSP实现
  16. java key类型_Java 基础类型
  17. 运维工程师必备技能之操作系统运维(一)
  18. 我的毕业实习一年总结
  19. 车载安全计算机是列控车载,CTCS-2级列控系统车载安全计算机主要功能的研究和仿真.pdf...
  20. GhostScript命令参数详解(转)

热门文章

  1. Lucene和Solr版本对应关系
  2. JQuery插件之弹窗:lhgDialog
  3. Rman 非catalog恢复
  4. 数据库导出成txt文件
  5. 安卓4.4不支持touchend事件解决办法
  6. JDK7集合框架源码阅读(五) Hashtable
  7. bzoj2843极地旅行社题解
  8. 管理docker容器
  9. Python学习——编码转换
  10. PHP用substr截取字符串出现中文乱码问题用mb_substr