友盟パッケージツール(Java+shell)
全部で4つのファイル
my.keystore.properties
署名の設定をして、antに統合してもいいです
SetUMengChannel.java
SetUMengChannelにコンパイルする.jar
build_channel.xml
ant構成
build_channel.sh
署名付きバッチ
-1.android-sdkに基づくr 18-macosx、その他の環境は私が測定したことがありません
0.pythonやperlを使わずにjavaを使うのは、どのプラットフォームでAndroidを開発してもjavaを使うに違いないからです.(笑)
1.環境変数を設定してから、スクリプトに入れてもプロファイルに入れてもいい
export ANDROID_SDK=...
2.SetUMengChannelをコンパイルする.JAr、適当な位置に置く
3. sh build_channel.sh<チャネル文字列>
ファイル名:my.keystore.properties
署名ファイルの構成
ファイル名:build_channel.xml
antプロファイル
Android SDKのtools/build.xmlはいくつかのコードを参考にしています
主な目的:
1.署名ファイルのパラメータmyを指定します.keystore.properties
2.カスタムインストールパッケージapkのファイル名.ここで出力されるファイル名は次のようになります.
HelloWorld_0.8.6_build75_google.apk
ファイル名:SetUMengChannel.java
SetUMengChannelにコンパイルする.JAr使用
Javaを使うのは、build apkができれば必ずjavaが使えるからです.
ファイル名:build_channel.sh
shellスクリプトは、bat神馬に変更するのも簡単です
my.keystore.properties
署名の設定をして、antに統合してもいいです
SetUMengChannel.java
SetUMengChannelにコンパイルする.jar
build_channel.xml
ant構成
build_channel.sh
署名付きバッチ
-1.android-sdkに基づくr 18-macosx、その他の環境は私が測定したことがありません
0.pythonやperlを使わずにjavaを使うのは、どのプラットフォームで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('
');
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