Android APK 多渠道快速编译
2013-02-05 16:28
369 查看
对于Android开发者而言,最麻烦的就是屏幕适配和需要打包多个渠道的包!
下面提供一个快速打包的方法。
1.不需要把渠道号放在manifest文件中
如果我们使用的渠道号没有必要非放在manifest文件中,我们可以选择放在工程的assets文件夹下,因为这个文件夹被编译之后是没有改变的。
例如:
1)我们把渠道号放在/assets/channel/channel.txt文件中。
2)然后生成生成一个没有签名的包(可以使用eclipse生成,也可以使用ant编译出一个未签名的apk)
3)使用rar压缩来进行解压、修改渠道号、压缩、签名。
rd unsignedAPK\ /s /q
rd signedAPK\ /s /q
md signedAPK\
md unsignedAPK\
for /f "tokens=1-2 delims=','" %%i IN (chid_list.txt)do winrar x Test.apk Test_temp\&&del Test_temp\assets\channel\channel.txt&&echo %%i>>Test_temp\assets\channel\channel.txt&&winrar a -afzip -ep1 -r0 %%j.apk Test_temp\*.*&&rd Test_temp\ /s /q&© %%j.apk unsignedAPK\&&del %%j.apk&
4000
;&jarsigner -verbose -keystore sign -storepass pass -signedjar signedAPK\%%j.apk unsignedAPK\%%j.apk biween
rd unsignedAPK\ /s /q
pause
上面是一个批处理文件,其中Test.apk 是你的未签名的包,chidlist.txt是你需要打包的渠道号列表(格式是:2401,Test2.4.1_2401,逗号前面的是渠道号,后面的是签名后生成的文件名),sign 是你的证书文件,pass 是证书的密码。
试试效果吧,只要把上面的准备工作完成,点击批处理,基本几百个包5分钟之内就能打完。
注:批处理依赖WinRAR,需要先装Winrar
2.对于必须要在manifest里面加渠道号的
有些情况下必须要把渠道号放在manifest里面,比如个人开发者需要加入广告,而广告提供方提供的库是从manifest里面读取渠道号的。
这种情况下就没有什么好办法了,只能ant编译,但也可以做一些优化。
具体的ant环境搭建就不再多说了,需要用到一个for循环的库。
具体的实现方案就是执行一遍编译把所需要的class,资源,等等都编译出来,然后你会发现在/bin/里面也会有一个manifest,这个是ant编译的时候直接从工程里拷过来的,我们要做的就是修改这个manifest里的渠道号,然后重新编译资源包,再签名等等。
下面是ant编译的脚本:
<property name="market_channels_names" value="2361:EOE" /><!-- 这是1个渠道号,用:分开的,如果多个都以这种形式用逗号分开 -->
<!-- 版本号 -->
<property name="app_version" value="2.4.1 />
<!-- 签名信息 -->
<property name="key.store" value="证书" />
<property name="key.alias" value="alias名称" />
<property name="key.store.password" value="密码" />
<property name="key.alias.password" value="alias密码" />
<!-- 编码 -->
<property name="encoding" value="UTF-8" />
<property name="out.channel.dir" value="out_channel" />
<!-- 导入编译文件 -->
<import file="build_ext.xml" />
<!-- 把各种资源打包成apk -->
<target name="rebuild"
depends="-set-release-mode, -release-obfuscation-check, -build-apk, -post-package, -release-prompt-for-password, -release-nosign, -release-sign, -post-build"
description="Builds the application in release mode.">
</target>
<!-- -build-setup -->
<target name="-build-apk" depends="-build-setup,-package-resources">
<!-- only package apk if *not* a library project -->
<do-only-if-not-library elseText="Library project: do not package apk..." >
<if condition="${build.is.instrumented}">
<then>
<package-helper>
<extra-jars>
<!-- Injected from external file -->
<jarfile path="${emma.dir}/emma_device.jar" />
</extra-jars>
</package-helper>
</then>
<else>
<package-helper />
</else>
</if>
</do-only-if-not-library>
</target>
<target name="make" >
<!-- 删除并创建输出文件夹(打包签名好的文件) -->
<delete dir="${out.channel.dir}"/>
<mkdir dir="${out.channel.dir}" />
<!-- 清空已编译的文件,再编译 -->
<!-- -->
<antcall target="clean" />
<antcall target="release" />
<foreach target="modify_manifest_channels" list="${market_channels_names}" param="nameandchannel" delimiter="," />
</target>
<!-- 修改channel, Umeng channel, Adview channel, channel值为2361对应脚本中的${channelname},Umeng channel, Adview channel值为EOE对应脚本中的${channelkey} -->
<target name="modify_manifest_channels" >
<!-- 获取渠道名字 -->
<propertyregex override="true" property="channelname" input="${nameandchannel}" regexp="(.*):" select="\1" />
<!-- 获取渠道号码 -->
<propertyregex override="true" property="channelkey" input="${nameandchannel}" regexp=":(.*)" select="\1" />
<replaceregexp flags="g" byline="false">
<regexp pattern="android:value="(.*)" android:name="CHANNEL"" />
<substitution expression="android:value="${channelname}" android:name="CHANNEL"" />
<fileset dir="${out.absolute.dir}" includes="AndroidManifest.xml" />
</replaceregexp>
<replaceregexp flags="g" byline="false">
<regexp pattern="android:value="(.*)" android:name="UMENG_CHANNEL"" />
<substitution expression="android:value="${channelkey}" android:name="UMENG_CHANNEL"" />
<fileset dir="${out.absolute.dir}" includes="AndroidManifest.xml" />
</replaceregexp>
<replaceregexp flags="g" byline="false">
<regexp pattern="android:name="AdView_CHANNEL" android:value="(.*)"" />
<substitution expression="android:name="AdView_CHANNEL" android:value="${channelkey}"" />
<fileset dir="${out.absolute.dir}" includes="AndroidManifest.xml" />
</replaceregexp>
<property
name="out.release.file"
location="${out.absolute.dir}/${ant.project.name}_${channelname}_${app_version}.apk" />
<!-- 各版本输出位置 -->
<property
name="out.final.file"
location="${out.absolute.dir}/${ant.project.name}_${channelname}_${app_version}.apk" />
<antcall target="rebuild" />
<!-- 复制打包完的文件到渠道文件夹 -->
<copy file="${out.final.file}" tofile="${out.channel.dir}/${ant.project.name}_${channelname}_${app_version}.apk"/>
<!-- 删除复制完成的文件 -->
<delete file="${out.final.file}"/>
<!-- -->
<delete file="${out.absolute.dir}/${ant.project.name}-release-unsigned.apk" />
<delete file="${out.absolute.dir}/${ant.project.name}-release-unaligned.apk" />
</target>
通过上面的方法能够提高一些打包的速度,但是也不是很快。
现在好点的打包方法介绍完了,如果哪位有更好的办法,欢迎分享出来!
下面提供一个快速打包的方法。
1.不需要把渠道号放在manifest文件中
如果我们使用的渠道号没有必要非放在manifest文件中,我们可以选择放在工程的assets文件夹下,因为这个文件夹被编译之后是没有改变的。
例如:
1)我们把渠道号放在/assets/channel/channel.txt文件中。
2)然后生成生成一个没有签名的包(可以使用eclipse生成,也可以使用ant编译出一个未签名的apk)
3)使用rar压缩来进行解压、修改渠道号、压缩、签名。
rd unsignedAPK\ /s /q
rd signedAPK\ /s /q
md signedAPK\
md unsignedAPK\
for /f "tokens=1-2 delims=','" %%i IN (chid_list.txt)do winrar x Test.apk Test_temp\&&del Test_temp\assets\channel\channel.txt&&echo %%i>>Test_temp\assets\channel\channel.txt&&winrar a -afzip -ep1 -r0 %%j.apk Test_temp\*.*&&rd Test_temp\ /s /q&© %%j.apk unsignedAPK\&&del %%j.apk&
4000
;&jarsigner -verbose -keystore sign -storepass pass -signedjar signedAPK\%%j.apk unsignedAPK\%%j.apk biween
rd unsignedAPK\ /s /q
pause
上面是一个批处理文件,其中Test.apk 是你的未签名的包,chidlist.txt是你需要打包的渠道号列表(格式是:2401,Test2.4.1_2401,逗号前面的是渠道号,后面的是签名后生成的文件名),sign 是你的证书文件,pass 是证书的密码。
试试效果吧,只要把上面的准备工作完成,点击批处理,基本几百个包5分钟之内就能打完。
注:批处理依赖WinRAR,需要先装Winrar
2.对于必须要在manifest里面加渠道号的
有些情况下必须要把渠道号放在manifest里面,比如个人开发者需要加入广告,而广告提供方提供的库是从manifest里面读取渠道号的。
这种情况下就没有什么好办法了,只能ant编译,但也可以做一些优化。
具体的ant环境搭建就不再多说了,需要用到一个for循环的库。
具体的实现方案就是执行一遍编译把所需要的class,资源,等等都编译出来,然后你会发现在/bin/里面也会有一个manifest,这个是ant编译的时候直接从工程里拷过来的,我们要做的就是修改这个manifest里的渠道号,然后重新编译资源包,再签名等等。
下面是ant编译的脚本:
<property name="market_channels_names" value="2361:EOE" /><!-- 这是1个渠道号,用:分开的,如果多个都以这种形式用逗号分开 -->
<!-- 版本号 -->
<property name="app_version" value="2.4.1 />
<!-- 签名信息 -->
<property name="key.store" value="证书" />
<property name="key.alias" value="alias名称" />
<property name="key.store.password" value="密码" />
<property name="key.alias.password" value="alias密码" />
<!-- 编码 -->
<property name="encoding" value="UTF-8" />
<property name="out.channel.dir" value="out_channel" />
<!-- 导入编译文件 -->
<import file="build_ext.xml" />
<!-- 把各种资源打包成apk -->
<target name="rebuild"
depends="-set-release-mode, -release-obfuscation-check, -build-apk, -post-package, -release-prompt-for-password, -release-nosign, -release-sign, -post-build"
description="Builds the application in release mode.">
</target>
<!-- -build-setup -->
<target name="-build-apk" depends="-build-setup,-package-resources">
<!-- only package apk if *not* a library project -->
<do-only-if-not-library elseText="Library project: do not package apk..." >
<if condition="${build.is.instrumented}">
<then>
<package-helper>
<extra-jars>
<!-- Injected from external file -->
<jarfile path="${emma.dir}/emma_device.jar" />
</extra-jars>
</package-helper>
</then>
<else>
<package-helper />
</else>
</if>
</do-only-if-not-library>
</target>
<target name="make" >
<!-- 删除并创建输出文件夹(打包签名好的文件) -->
<delete dir="${out.channel.dir}"/>
<mkdir dir="${out.channel.dir}" />
<!-- 清空已编译的文件,再编译 -->
<!-- -->
<antcall target="clean" />
<antcall target="release" />
<foreach target="modify_manifest_channels" list="${market_channels_names}" param="nameandchannel" delimiter="," />
</target>
<!-- 修改channel, Umeng channel, Adview channel, channel值为2361对应脚本中的${channelname},Umeng channel, Adview channel值为EOE对应脚本中的${channelkey} -->
<target name="modify_manifest_channels" >
<!-- 获取渠道名字 -->
<propertyregex override="true" property="channelname" input="${nameandchannel}" regexp="(.*):" select="\1" />
<!-- 获取渠道号码 -->
<propertyregex override="true" property="channelkey" input="${nameandchannel}" regexp=":(.*)" select="\1" />
<replaceregexp flags="g" byline="false">
<regexp pattern="android:value="(.*)" android:name="CHANNEL"" />
<substitution expression="android:value="${channelname}" android:name="CHANNEL"" />
<fileset dir="${out.absolute.dir}" includes="AndroidManifest.xml" />
</replaceregexp>
<replaceregexp flags="g" byline="false">
<regexp pattern="android:value="(.*)" android:name="UMENG_CHANNEL"" />
<substitution expression="android:value="${channelkey}" android:name="UMENG_CHANNEL"" />
<fileset dir="${out.absolute.dir}" includes="AndroidManifest.xml" />
</replaceregexp>
<replaceregexp flags="g" byline="false">
<regexp pattern="android:name="AdView_CHANNEL" android:value="(.*)"" />
<substitution expression="android:name="AdView_CHANNEL" android:value="${channelkey}"" />
<fileset dir="${out.absolute.dir}" includes="AndroidManifest.xml" />
</replaceregexp>
<property
name="out.release.file"
location="${out.absolute.dir}/${ant.project.name}_${channelname}_${app_version}.apk" />
<!-- 各版本输出位置 -->
<property
name="out.final.file"
location="${out.absolute.dir}/${ant.project.name}_${channelname}_${app_version}.apk" />
<antcall target="rebuild" />
<!-- 复制打包完的文件到渠道文件夹 -->
<copy file="${out.final.file}" tofile="${out.channel.dir}/${ant.project.name}_${channelname}_${app_version}.apk"/>
<!-- 删除复制完成的文件 -->
<delete file="${out.final.file}"/>
<!-- -->
<delete file="${out.absolute.dir}/${ant.project.name}-release-unsigned.apk" />
<delete file="${out.absolute.dir}/${ant.project.name}-release-unaligned.apk" />
</target>
通过上面的方法能够提高一些打包的速度,但是也不是很快。
现在好点的打包方法介绍完了,如果哪位有更好的办法,欢迎分享出来!
相关文章推荐
- Dex2jar 与 JD-GUI快速反编译Android apk文件
- windows下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件
- linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件
- Android 自动编译、打包生成apk文件 4 - 多渠道批量打包
- Android 自动编译、打包生成apk文件 4 - 多渠道批量打包
- Android apk如何防止反编译和如何快速有效的反编译别人的Apk
- linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件
- windows下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件
- windows下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件
- Android 自动编译、打包生成apk文件 4 - 多渠道批量打包
- Android如何防止apk程序被反编译
- Android 项目编译过程【Android脚本自动发布APK提测】
- Cocos-X创建JS工程,编译Android .apk包,加载nanolink.so文件,创建一个实时对战游戏
- Android如何防止apk程序被反编译
- 浅析Android如何编译生成apk
- 工(程师)欲善其事,必先利其(编译)器——《Android Studio实战——快速、高效地构建Android应用》
- 自己对androidAPK文件反编译的一点总结
- 【Android 应用开发】 Android APK 反编译 混淆 重编译
- 怎把第三方apk编译进Android系统
- Android使用gradle快速生成渠道apk包。