My Profile Photo

Kris Lee


专注移动互联,提供移动开发、培训与解决方案


【Android课堂】用powershell+Ant实现Andoird为不合市场编译、签名自动化

powershell_ant

通过本文我们可能通过使用powershell+ant来实现为不同市场编译、签名,从而实现自动化,节约我们的时间。

  1. 如果给自己的android工程加上ant配置文件。

2.如果通过 powershell打包

为什么我们要这样?

许多人问,eclipse不是自带的打包工具吗?还费力写这个脚本来干嘛?而且ant都还没搞懂,那么powershell又是干嘛的?

如果你真想这样问,那我觉得你肯定不是合格的天朝的子民。

如果我们自己开发过自己的应用,或者在公司做过打包的工作,那么你一定很惊讶天朝如满天星星般的安卓市场!!甚至一现在,也还是有十多家在顽强的挣扎着。

有人又总问了,再多的市场,我们一个包不是也是行吗?

行是行的,但是你知道谁下载了你的应用吗?哪个市场多吗?应该在哪个市场去多做宣传呢?

如果你想知道,那么你最好还是给每个市场都打个不同的包,然后查看统计结果 ,下次针对特定的市场做一些特定的推广吧。

 

我们再来试想一下,如果我们还是用eclipse的打包工具,一个一个打包,打包完了后再修改一下渠道值 ,再打包。你觉得你有必需把你宝贵的生命浪费在这无聊的打包上面吗?????!!!

如果你不想,follow me .

===================

在开始前的一些说明:接下来的代码是基于eoe在线课堂上面的代码而来,在兴趣的可以去听听,由eoe的wanx给我们带来的:Powershell(脚本)+Ant(编译)实现一键打包

如果我没有猜错的话,wanx也是借鉴网上这篇文章 :用powershell脚本实现Andoird为不同市场编译、签名自动化,效率极大提高

如果你现在百度里面搜索 powershell打包,大半都是牛博的这篇文件。这也是中国互联网的一个通病,一个人原创点东西出来,然后大家就随处帖,而且还不把原文地址附件上。

当然,我在这里指责也是给自己打耳光,因为我也是将在下面窃取他的劳动成果。

===================

开始吧!!

 

实现思路

  1. 用PowerShell实现一个方法:使用ant自动编译项目,在每次编译之前,修改 AndroidManifest.xml 中meta-data UMENG_CHANNEL 的值为指定市场的标识。
  2. 用字符串数组存储所有市场的标识,遍历该数组,遍历至每个元素时,都将该元素传入上面的方法,可实现针对不同的市场进行编译,编译完成后,再对编译好的应用签名即可。

系统环境

  • Windows 7 Untimate
  • JDK 7 Update1,假设路径为: E:\Program Files\Java\jdk1.7.0_01
  • apache-ant-1.8.2,假设路径为:E:\Program Files\apache-ant-1.8.2
  • Android SDK,假设路径为:E:\Program Files\Android\android-sdk

用ant自动编译项目

  • 假设Android项目路径为:D:\workspace\MyApp
  • 检查是否存在文件D:\workspace\MyApp\build.xml,这是使用ant编译项目时需要用到的配置文件
    • 不存在,在command窗口中执行:
      • D:    #切换到d盘,你的项目在哪个盘就切换过去。如果这个都不理解的,自行百度
      • CD D:\workspace\MyApp    #切换到我们的项目目录
      • "E:\Program Files\Android\android-sdk\tools\android" update project --path .  #为我们的项目添加上build.xml配置文件。注意path后有个点,表示当前目录
    • 若存在或通过上面的步骤生成了build.xml,修改文件中<project name="MyApp" default="help"> MyApp为自己项目的名称(项目名称如何改,参见文末的更新)。如果你是通过android update命令来生成的,你多半是需要修改你的project name的,我测试的时候,它里是我的第一个activity的名字,而我们需要修改成我们project的名字。
  • 新建批处理文件D:\workspace\MyApp\build.bat,该文件使用ant对android项目自动编译,文件内容如下:(请根据自己项目、系统的实际情况修改路径)
  • SET JAVA_HOME=C:\Program Files\Java\jdk1.7.0_05
    D:
    cd D:\Developer\eoe\HistoryOfToday
    "D:\apache-ant-1.8.4\bin\ant" release
    

 

如果系统环境没问题,build.bat执行后,在目录 D:\workspace\MyApp\bin 中应该可以看到编译好的MyApp-release-unsigned.apk。

注意:如果项目中有引用的第三方jar包类库,要把这些类库放到项目根目录的 "libs" 目录下,否则,ant在编译的时候会出错。

流程详解

1、定义参数

param($ProjectName, $ProjectRootDirectory, $KeystorePath, $StorePass, $KeyPass, $Alias)

$channels = @("360", "aimi8", "anzhi", "appchina", "eoemarket", "gfan", "hiapk", "nduoa", "starandroid")
$defaultChannel = "androidmarket"
$jdkPath = "E:\Program Files\Java\jdk1.7.0_01"
$androidSDKPath = "E:\Program Files\Android\android-sdk"
$signedPath = "$ProjectRootDirectory\bin\signed"
$zipalignedPath = "$ProjectRootDirectory\bin\zipaligned"
  • $ProjectName:项目名称,如:MyApp
  • $ProjectRootDirectory:项目路径,如:D:\workspace\MyApp
  • $KeystorePath:keystore路径,如:D:\workspace\MyApp\keystore
  • $StorePass:store password,如:123456
  • $KeyPass: key password,如:123456
  • $Alias: keystore alias,如:MyApp
  • $channels:定义了除AndroidManifest.xml中定义的默认市场标识外,剩下的所有市场标识
  • $defaultChannel:即上面提到的默认市场标识,为什么要有默认市场标识的原因是,我们的AndroidManifest.xml文件不会常改,我们也不希望每次自动编译、签名完毕后,看到这个文件处于被修改的状态,所以我设计在最后才给默认的市场编译,这样的话,前面修改了n次的AndroidManifest.xml在最后回到未修改的状态
  • $signedPath:即签好名的apk文件存储路径
  • $zipalignedPath:即zipalign优化后文件存储路径,最后要发布的也是这个目录下的apk文件

2、修改 AndroidManifest.xml

    $manifestPath = "$ProjectRootDirectory\AndroidManifest.xml"
    $FILE = [System.IO.File]::ReadAllText($manifestPath)
    $FILE = [REGEX]::replace($FILE, '<meta-data\r?\n?\s+android:name="UMENG_CHANNEL"\r?\n?\s+(.*?)>', '', [Text.regularexpressions.regexoptions]::SingleLine)
    [System.IO.File]::WriteAllText($manifestPath, $FILE) 

$ChannelName 代表每次遍历传入的市场标识,如:anzhi

注意:在这里需要确保我们的渠道那一行是这样的:<meta-data android:name=”UMENG_CHANNEL” android:value=”others” />

否则在配置的时候会匹配不上,那么就修改不成,就有问题了。如果非要与我这个不同,你也可以自己写这个正则匹配。

别问我正则匹配的东西,自行百度,否则我再写篇文章也给你讲不清楚 。

3、调用 build.bat 编译 项目

& "$ProjectRootDirectory\build"

4、为编译好的应用签名

& "$jdkPath\bin\jarsigner" -keystore $KeystorePath -storepass $StorePass -keypass $KeyPass -signedjar "$signedPath\$ProjectName-$ChannelName.apk" -verbose "$ProjectRootDirectory\bin\$ProjectName-release-unsigned.apk" $Alias -digestalg SHA1 -sigalg MD5withRSA
  • 注意最后2个参数:-digestalg SHA1 -sigalg MD5withRSA,如果你当前的环境是 JDK 7,一定要加上这两个参数,否则签名完毕的应用在安装时会有错误:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] [1]
  • 签好名的应用在 $signedPath 定义的路径中

5、zipalign优化签好名的apk

    if (Test-Path -path "$zipalignedPath\$ProjectName-$ChannelName.apk") {
    	Remove-Item "$zipalignedPath\$ProjectName-$ChannelName.apk"
    }
    
    & "$androidSDKPath\tools\zipalign" -v 4 "$signedPath\$ProjectName-$ChannelName.apk" "$zipalignedPath\$ProjectName-$ChannelName.apk"

6、批处理调用powershell脚本,实现自动化编译、签名

假设powershell脚本存储于:D:\workspace\build4DifferentChannels.ps1,新建批处理脚本:D:\workspace\build4DifferentChannels_MyApp.bat:

powershell D:\workspace\build4DifferentChannels.ps1 MyApp "D:\workspace\MyApp" "D:\workspace\MyApp\keystore" 123456 123456 myapp

用批处理调用powershell脚本build4DifferentChannels.ps1,并传入了之前定义的各个参数。以后需要发布应用时,就执行该批处理,自动为各个市场编译、签名应用即可,十分方便。

如果执行改脚本遇到错误:

 File D:\workspace\build4DifferentChannels.ps1 cannot be loaded because the execution of scripts is disabled on this system.</p>

就用管理员权限打开command窗口,执行下面的命令:

powershell
Set-ExecutionPolicy RemoteSigned 


完整脚本下载

============================= 点击下载: build4DifferentChannels_20111209 =============================