国内市场上有许许多多的应用市场,常见的有:百度、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 选项可跳过源码编译,节省时间。
反编译工具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 结果输出
Paste_Image.png使用python pandas优雅输出测试结果,并写入到csv文件。
完整代码地址:
https://github.com/yi-heng/Android-Test/blob/master/Android_Channel_Test/channelverify.py
网友评论