Android渠道版本自动化校验

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

1. 问题

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

2. 怎么做

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

  1. 批量反编译Android Apk
  2. 遍历反编译后的apk文件夹,从AndroidManifest.xml取出渠道号
  3. 比较渠道号与apk名称、比较各种key
  4. 将测试结果写入csv文件

3. 过程

3.1 安装环境

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

3.2 反编译Android Apk

apktool.jar -f 会对apk的资源文件、源码等所有的文件进行反编译,耗时较长。
使用 -s 选项可跳过源码编译,节省时间。

反编译工具apktool.jar: https://bitbucket.org/iBotPeaches/apktool/downloads

    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文件,即可看到渠道号

<meta-data android:name="UMENG_CHANNEL" android:value="meizu"/>

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文件。

《Android渠道版本自动化校验》 Paste_Image.png

完整代码地址:

https://github.com/yi-heng/Android-Test/blob/master/Android_Channel_Test/channelverify.py
    原文作者:一直小鱼
    原文地址: https://www.jianshu.com/p/1934baf15d49
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞