初尝Perl -- 使用aapt给apk软件包批量重命名

    不知道什么是Perl猛戳这个链接 http://zh.wikipedia.org/wiki/Perl

    任务:    
            随着手机/平板的各方面性能的不断发展(CPU,内存,存储),Android这个移动领域绝对的霸主也升级到了4.1版本,软硬件的提高意味着人们对使用体验有了越来越高的要求,在移动设备里面安装的App也越来越多,但是Android总是以刷机为乐趣的,每次刷机就意味着要备份软件(这里不讨论软件数据的备份),也就意味着备份apk,apk一多,管理起来就成了一件头痛的事情,最起码的,我们要知道我们都备份了哪些apk,最最起码要知道它们叫什么名字,因为不管在windows还是linux平台下面,都是无法直接解析apk的名字的。所以不管你是以什么样的方式备份出来的apk,它总不可能是按你的要求来命名的,今天的目标/任务就是把apk按你的要求来命名。

    方法:
            由于在windows/linux上无法直接通过系统的文件管理器解析apk的名字等等属性,所以必须要借助别的工具,这其中最好的必须是Google自家的aapt工具,不知道aapt是什么?猛戳这个链接http://www.ltesting.net/ceshi/ceshijishu/sjcs/android/2012/0511/204843.html。aapt可以直接读取出来一个apk的各种属性,比如AndroidManifest.xml里面定义的包名,软件名,版本号,使用的权限等等信息。使用aapt读取出来的信息是一大堆,所以必须要使用正则表达式的模式匹配获取我们所需要的信息,然后再根据要求来给相应的apk重命名。注意,这个地方是要给当前目录下所有的apk自动重命名,所以,必然要用到for语句(在perl里面是foreach)。

    先介绍一下aapt的使用。这里只介绍用到的功能,dump,具体命令是aapt d(ump) badging mms.apk。它会打印出如下的信息:

package: name='com.elsdoerfer.android.autostarts' versionCode='24' versionName='1.7.7'
sdkVersion:'4'
targetSdkVersion:'14'
application-label:'Autostarts'
application-label-zh:'自启管家'
application-icon-160:'res/drawable/icon.png'
application-icon-240:'res/drawable-hdpi/icon.png'
application: label='Autostarts' icon='res/drawable/icon.png'
launchable-activity: name='com.elsdoerfer.android.autostarts.ListActivity'  label='Autostarts' icon=''
uses-permission:'android.permission.WRITE_SETTINGS'
uses-permission:'android.permission.WRITE_SECURE_SETTINGS'
uses-permission:'android.permission.CHANGE_COMPONENT_ENABLED_STATE'
uses-configuration:
uses-gl-es:'0xffffffff'
uses-feature:'android.hardware.touchscreen'
uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional'
main
other-activities
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--' 'zh'
densities: '160' '240'

    注意,在windows的cmd里面,编码是cp936,和aapt默认输出的utf8是冲突的,所以如果你直接执行上述命令,会在cmd的窗口中看到所有的中文都是乱码的,正确的方法是把输出的结果重定向到文本文件里面,再用记事本或其它的工具打开输出的文本文件,就不会有乱码了。关于aapt的其它用法请自行查看帮助,直接输入aapt即可。

    我们的目标就是要从上面的那一堆的数据中,用perl里面的正则表达式提取出我们需要的信息,我所需要的信息数据于这样:Google Play 音乐_v5.0.1053J.731804_(com.google.android.music).apk,软件名称_v版本号_(apk的包名).apk。

    通过分析上面的输出结果可以看到:
        name='com.elsdoerfer.android.autostarts'
        versionName='1.7.7'
        application-label:'Autostarts'
        application-label-zh:'自启管家'
    这四个字符串是我们要需要的,下面的任务就是如何把它们的值提取出来。下面上整个程序的perl源代码。


# use strict;
use Encode;
use open ':encoding(GBK)', ':std';
use open ':encoding(UTF-8)';

my @files = (glob(".*.apk"), glob("*.apk"));

foreach (@files)
{
    # print "Start Processing -> $_ \n";

    # 执行aapt并赋值给$info
    $info = `aapt d badging $_`;

    $info =~ m/name=\'(.*?)\'/;
    $pkg_name = $1;  # apk的包名
    $info =~ m/versionName=\'(.*?)\'/;
    $version = $1;  # apk的版本号

    # 判断是否存在 label-zh_CN名字,
    # 若不存在则以label名字代替
    if ($info =~ m/application-label-zh_CN:\'(.*?)\'/) {
        $name = $1;
    }
    else {
        $info =~ m/application-label:\'(.*?)\'/;
        $name = $1;  
    }

    # 拼接格式化后想要的文件名
    $out_filename = "$name\_v$version\_($pkg_name).apk";

    open(LOG, ">>log.txt") || warn "Can't Open the file";
    print LOG "$out_filename \n";

    # 必须要转换成gb2312编码,否则会造成中文乱码
    $out_filename = encode("gb2312", $out_filename);
    print decode("gb2312", $out_filename);

    # 若修改后导致文件重名,则输出警告,不作处理
    if(-e $out_filename){
        warn "Can't rename $_ to $out_filename.
        The $out_filename exists!\n";
    }
    else{  
        # 重命名文件,若重命名失败,则输出警告
        # 注意此处不要调用system("ren $a $b")或`ren a b`
        # 因为直接调用会造成文件名有空格会重命名失败的问题
        rename $_, $out_filename
            or warn "Rename $_ to $out_filename failed: $!\n";

    }

    print "\n";
}

close LOG || warn "Can't close the file";



    对这个perl文件作一个小小的解释:
        my @files = (glob(".*.apk"), glob("*.apk"));    使用glob()函数获取到目录下面的所有文件名,这里使用的是*.apk和.*.apk,这两个是有区别的,因为perl源于unix/linux,在linux下面,所有以点开头的文件都是隐藏文件,程序默认是不解析的,所以我们必须要加上.*.apk。
        foreach (@files)   

转载于:https://www.cnblogs.com/iwantcomputer/p/8489813.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: aapt2-7.3.0-8691043是Android应用程序打包工具(aapt2)的版本号。aapt2是Android开发工具包(SDK)中的一个重要工具,用于将应用程序的资源文件(如布局、图像和字符串)打包到一个应用程序包(APK)中。 版本号中的“7.3.0”表示这是aapt2的第7.3.0版本。版本号中的“8691043”是该版本的唯一标识符,用于在开发者社区中唯一地标识该版本。 每个版本的aapt2都带来了一些改进和修复,例如性能优化、Bug修复和新功能。通过升级aapt2到最新版本,开发者可以从这些改进中受益。此外,更新aapt2还能保持与最新Android操作系统版本的兼容性。 为了使用aapt2-7.3.0-8691043,开发者需要下载并安装适当的Android SDK版本。然后,他们可以通过命令行界面或集成开发环境(如Android Studio)使用aapt2来构建和打包他们的应用程序。 总之,aapt2-7.3.0-8691043是Android开发工具包中的一个重要版本,它为开发者提供了打包应用程序资源的功能,并提供了许多改进和修复来改善开发体验和应用程序的性能。 ### 回答2: aapt2-7.3.0-8691043是Android Asset Packaging Tool (AAPT)的一个版本。AAPT是Android的一项重要工具,用于处理和管理Android应用程序的资源。它负责将应用程序的资源文件(如图片、布局文件和字符串)编译成二进制格式,以便在应用程序运行时能够有效地加载和使用这些资源。 aapt2-7.3.0-8691043是AAPT在特定时间内的一个具体版本。版本号中的数字表示软件的版本,8691043是该版本的构建号。 每个AAPT版本都会带来一些新功能、改进和修复。这些更新可能包括对资源文件的更好的处理、提高了性能、修复了已知的错误和漏洞等。用户可以通过更新AAPT工具,以便在开发和构建Android应用程序时能够享受到最新的功能和改进。 在使用aapt2-7.3.0-8691043时,开发者可以通过命令行或构建脚本使用工具编译资源文件。该工具可以将资源文件编译成二进制格式,并生成与Android应用程序兼容的APK文件。开发者也可以使用它来检查资源文件的有效性和完整性,以确保应用程序在运行时正确加载和使用这些资源。 总之,aapt2-7.3.0-8691043是Android开发中不可或缺的工具之一,用于管理和处理应用程序的资源文件。通过及时更新AAPT工具,开发者可以获得更好的性能和更多的功能,从而提高他们的应用程序的质量和用户体验。 ### 回答3: aapt2-7.3.0-8691043 是 Android Asset Packaging Tool (AAPT) 的一个版本。AAPT 是一个 Android 开发工具,用于编译和打包应用程序的资源文件。它可以将应用程序的资源文件(如布局文件,图标,字符串,颜色等)处理成二进制格式,以便在 Android 设备上运行。 这个版本号中的“7.3.0”代表主要版本为7,次要版本为3,修订版本为0。版本号的增加通常意味着在之前版本的基础上进行了更改、添加或修复了一些功能或问题。 最后的“8691043”是构建号,用于标识编译过程中的特定版本。 aapt2-7.3.0-8691043 是一个较新的版本,意味着其中可能包含了一些新的功能或修复了之前版本中的一些问题。如果你在进行 Android 应用开发时遇到了与资源文件相关的问题,可以尝试升级到这个版本,以获得最新的功能和修复。 总的来说,aapt2-7.3.0-8691043 是 Android 开发工具中的一个版本,它用于编译和打包应用程序的资源文件,可以提供更好的开发体验和应用的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值