






















我写Android 刚不久,发现一个Android应用是否有更多人用,不仅取决于应用本身,还取决于应用的推广,在中国,起码就有以下十个市场需要推广:360开放平台、爱米吧、谷歌电子市场、安智市场、应用汇、优亿市场、机锋、安卓市场、N多、安卓星空。
为了衡量每个市场的效果,我使用了友盟的分发渠道分析接口,只需要为不同的市场在 AndroidManifest.xml 里定义不同的 meta-data UMENG_CHANNEL 值,然后为各市场分发各自的apk即可。
这时问题就来了,如果我的应用有更新,如果没有一个自动化的方法,我需要用eclipse手动export、签名…… ,光敲签名时的storepass和keypass就够受的了,更不用说还得每次记得修改签名文件代表不同市场的后缀,比如MyApp_360.apk、MyApp_androidmarket.apk……,非常容易出错,也很浪费时间。
于是我花了1天的时间,用powershell脚本将上面的操作自动化了,感觉很棒,和大家分享一下,希望能够帮到各位。
在阅读这篇文章之前,我假设您已经知道如何给Android 应用签名,了解apache ant,已经集成了友盟分发渠道分析接口,了解PowerShell。
1 SET JAVA_HOME=E:\Program Files\Java\jdk1.7.0_01
2 cd D:\workspace\MyApp
3 D:
4 "E:\Program Files\apache-ant-1.8.2\bin\ant" release
如果系统环境没问题,build.bat执行后,在目录 D:\workspace\MyApp\bin 中应该可以看到编译好的MyApp-release-unsigned.apk。
注意:如果项目中有引用的第三方jar包类库,要把这些类库放到项目根目录的 "libs" 目录下,否则,ant在编译的时候会出错。
1 param($ProjectName, $ProjectRootDirectory, $KeystorePath, $StorePass, $KeyPass, $Alias)
2
3 $channels = @("360", "aimi8", "anzhi", "appchina", "eoemarket", "gfan", "hiapk", "nduoa", "starandroid")
4 $defaultChannel = "androidmarket"
5 $jdkPath = "E:\Program Files\Java\jdk1.7.0_01"
6 $androidSDKPath = "E:\Program Files\Android\android-sdk"
7 $signedPath = "$ProjectRootDirectory\bin\signed"
8 $zipalignedPath = "$ProjectRootDirectory\bin\zipaligned"
1 $manifestPath = "$ProjectRootDirectory\AndroidManifest.xml"
2 $FILE = [System.IO.File]::ReadAllText($manifestPath)
3 $FILE = [REGEX]::replace($FILE, '<meta-data\r?\n?\s+android:name="UMENG_CHANNEL"\r?\n?\s+(.*?)>', '<meta-data
4 android:name="UMENG_CHANNEL"
5 android:value="' + $ChannelName + '" />', [Text.regularexpressions.regexoptions]::SingleLine)
6 [System.IO.File]::WriteAllText($manifestPath, $FILE)
$ChannelName 代表每次遍历传入的市场标识,如:anzhi
1 & "$ProjectRootDirectory\build"
1 & "$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
1 if (Test-Path -path "$zipalignedPath\$ProjectName-$ChannelName.apk") {
2 Remove-Item "$zipalignedPath\$ProjectName-$ChannelName.apk"
3 }
4
5 & "$androidSDKPath\tools\zipalign" -v 4 "$signedPath\$ProjectName-$ChannelName.apk" "$zipalignedPath\$ProjectName-$ChannelName.apk"
假设powershell脚本存储于:D:\workspace\build4DifferentChannels.ps1,新建批处理脚本:D:\workspace\build4DifferentChannels_MyApp.bat:
1 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.
就用管理员权限打开command窗口,执行下面的命令:
1 powershell
2 Set-ExecutionPolicy RemoteSigned
build4DifferentChannels_20111209.zip
[1]:http://code.google.com/p/android/issues/detail?id=19567
[2]:http://www.androidengineer.com/2010/06/using-ant-to-automate-building-android.html
给最近开发的两个应用打一下广告
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。