友盟打包工具(Java+shell)

一共4个文件


[table]
| my.keystore.properties | 打签名的配置,合并到ant里也可以 |
| SetUMengChannel.java | 编译成SetUMengChannel.jar |
| build_channel.xml | ant配置 |
| build_channel.sh | 打签名的批处理 |
[/table]

-1. 基于android-sdk_r18-macosx,其他环境我没测过
0. 用java而不用python和perl,是因为,不管在哪个平台开发Android,你一定有java用。(笑
1. 先设置环境变量,放脚本里面或者放配置文件都可以
export ANDROID_SDK=...
2. 编译SetUMengChannel.jar,放到合适的位置
3. sh build_channel.sh <渠道字符串>

文件名: my.keystore.properties
签名文件的配置

key.store=...
key.alias=...
key.store.password=...
key.alias.password=...


文件名: build_channel.xml
ant配置文件
从Android SDK 的tools/build.xml 借鉴了一些代码
主要目的:
1. 指定签名文件的参数 my.keystore.properties
2. 定制安装包apk的文件名,这里会输出的文件名形如
HelloWorld_0.8.6_build75_google.apk


<?xml version="1.0" encoding="UTF-8"?>
<project
name="HelloWorld"
default="help" >

<loadproperties srcFile="my.keystore.properties" />

<property environment="env" />

<condition
property="umeng.channel"
value="${env.UMENG_CHANNEL}" >
<and>
<not><isset property="${env.UMENG_CHANNEL}" /></not>
<not><isset property="umeng.channel" /></not>
</and>
</condition>

<condition
property="sdk.dir"
value="${env.ANDROID_SDK}" >
<and>
<not><isset property="${env.ANDROID_SDK}" /></not>
<not><isset property="sdk.dir" /></not>
</and>
</condition>

<import file="build.xml" />

<!-- Custom tasks -->
<taskdef name="xpath"
classname="com.android.ant.XPathTask"
classpathref="android.antlibs" />

<target name="release-channel"
depends="-set-release-mode, -release-obfuscation-check, -package, -post-package, -release-prompt-for-password, -release-channel-sign, -post-build"
description="Builds the application in release-channel mode.">
</target>

<!-- custom output file name -->
<target name="-release-channel-sign" if="has.keystore" >
<!-- only create apk if *not* a library project -->
<do-only-if-not-library elseText="Library project: do not create apk..." >
<sequential>
<property name="out.unaligned.file" location="${out.absolute.dir}/${ant.project.name}-release-unaligned.apk" />

<echo>umeng.channel=${umeng.channel}</echo>

<xpath input="AndroidManifest.xml" expression="/manifest/@android:versionName"
output="version.name" default="0.0.0.0"/>
<echo>version.name=${version.name}</echo>

<xpath input="AndroidManifest.xml" expression="/manifest/@android:versionCode"
output="version.code" default="0"/>
<echo>version.code=${version.code}</echo>

<echo>Signing final apk...</echo>
<property name="version.name" value="${version.name}" />
<property name="version.code" value="${version.code}" />

<!-- 在这里定义安装包的文件名规则 -->
<property name="out.channel.file" location="${out.absolute.dir}/${ant.project.name}_${version.name}_build${version.code}_${umeng.channel}.apk" />

<!-- Signs the APK -->
<echo>Signing final apk...</echo>
<signjar
jar="${out.packaged.file}"
signedjar="${out.unaligned.file}"
keystore="${key.store}"
storepass="${key.store.password}"
alias="${key.alias}"
keypass="${key.alias.password}"
verbose="${verbose}" />

<!-- Zip aligns the APK -->
<zipalign-helper
in.package="${out.unaligned.file}"
out.package="${out.channel.file}" />
<echo>Release Package: ${out.channel.file}</echo>
</sequential>
</do-only-if-not-library>
<record-build-info />
</target>

</project>



文件名: SetUMengChannel.java
编译成 SetUMengChannel.jar 使用
使用java是因为,如果你能build apk,就一定能用java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* 通过正则表达式修改AndroidManifest.xml中的渠道号
* @param args
*/
public class SetUMengChannel {

/**
* 懒得检查参数了,有需要的请自己加
* args[0] AndroidManifest.xml 的文件位置
* args[1] 渠道号的字符串
*/
public static void main(String[] args) {
String channel = args[1];

StringBuilder sb = new StringBuilder();
try {
File file = new File(args[0]);
file = new File(file.getAbsolutePath());
BufferedReader bufReader = new BufferedReader(
new InputStreamReader(new FileInputStream(file)));
String str = bufReader.readLine();
if (str != null) {
sb.append(str);
}

while ((str = bufReader.readLine()) != null) {
sb.append('\n');
sb.append(str);
}

bufReader.close();
} catch (IOException e) {
e.printStackTrace();
}

String metaChannel = String
.format("<meta-data android:name=\"UMENG_CHANNEL\" android:value=\"%s\"/>",
channel);

String replaced = sb
.toString()
.replaceAll(
"<meta-data\\s+android:name=\"UMENG_CHANNEL\"\\s+android:value=\".*?\"\\s*/>",
metaChannel);

System.out.println(replaced);
}
}



文件名: build_channel.sh
shell 脚本,要改成bat神马的也很容易


#! /bin/sh

# 从命令行获取渠道号
export UMENG_CHANNEL=$1

# 先重置 AndroidManifset.xml
# 你也可以使用 svn, copy 神马的
git checkout -f AndroidManifest.xml

# 修改AndroidManifset.xml
sh set_channel.sh ${UMENG_CHANNEL} > AndroidManifest.channel.xml
mv AndroidManifest.channel.xml AndroidManifest.xml

# 编译并加上签名
ant -f build_channel.xml release-channel

# 重置 AndroidManifset.xml
git checkout -f AndroidManifest.xml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
友盟渠道打包工具主要是提供基本的通过工程源码打包的功能。 常见错误见这里目前不支持的Apk特性见这里(可能会导致发布的SDK产生严重bug)。 Google 现在已经发布了最新的构建系统(New Building System) , 在 Android Studio 中已经支持了最新的 构建系统,如果开发者已经迁移,可以使用新的系统方面的生成渠道包,这是取代渠道打包工具的最佳方式。 1. 工程结构 工程结构图 : - CommonTools 共用的工具类,包括对 `Apktool` , `Jarsigner` , `zipalign` 的封装 - UIControls_35   共用的UI类,对大部分控件的样式都是在这里设置的 - UmengMarket  Marekt 组件,现在还没有实现 - UmengPackage 打包组件 - UmengTools 工程主要UI,管理 UmengMarket, UmengPackage, UmengTools 三个组件 - UmengWidget 小工具组件,目前仅有解包分析的功能 打包工具组件: - Source - Builder - ApkBuilder.cs     通过 APK 打包的 Builder 实现                    - Builder.cs            抽象 Builder 类,提供打包的主要逻辑                    - SourceBuilder.cs通过源码打包的 Builder 实现 (目前代码还没有实现)          - Worker.cs 打包过程对外接口 3. 打包流程 V2.0 版本仅实现了通过 .apk 打包的方式,本质上对  apk 文件进行反编译,修改 AndroidManifest.xml 文件后,再重新打包,我们使用的工具是开源的拆包工具 Apktool 将  apktool  添加到当前 process 的环境变量 执行 apktool d --no-src -f xxxx.apk temp 拆解apk 替换或者添加 AndroidManifest.xml 中的 友盟channel 执行apktool b temp  unsigned.apk 重新打包apk 执行 SignApk.jar 生成签名后的 apk 文件 执行 zipAlign 生成对齐优化后的 apk 文件 回到 3 替换新的渠道 完成打包 使用  JarSigner.jar 给 Apk 签名, SignApk.jar  文件是我们修改过的 apk 签名工具,实现了和 ADT 中一样的签名方式,使用如下: Usage: signapk file.{keystore} keystore_password key_entry key_password input.apk output.apk

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值