@echo off
setlocal enabledelayedexpansion
set apk=%1
set output=!apk:~0, -4!
java -jar apktool.jar d -f !apk! -o !output!
for /f "delims=" %%i in ('AndroidManifestModifier !output!\AndroidManifest.xml %*') do (
if not defined error set error=1
echo %%i
)
if not defined error (
set apk_unsigned=!output!_unsigned.apk
java -jar apktool.jar b !output! -o !apk_unsigned!
RMDIR /S /Q !output!
set apk_signed=!output!_signed.apk
java -jar signapk\signapk.jar signapk\sinyeeandroid.x509.pem signapk\sinyeeandroid.pk8 !apk_unsigned! !apk_signed!
DEL !apk_unsigned!
set apk_align=!output!_align.apk
zipalign -f 4 !apk_signed! !apk_align!
DEL !apk_signed!
)
其中AndroidManifestModifier是C#写的控制台程序,代码如下
using System;
using System.IO;
using System.Text.RegularExpressions;
namespace AndroidManifestModifier
{
class Program
{
static void Main(string[] args)
{
if(args.Length == 0)
{
Console.WriteLine("请提供参数");
return;
}
var manifestPath = args[0];
if (manifestPath.ToLower().EndsWith("AndroidManifest.xml"))
{
Console.WriteLine("第一个参数必须为manifestPath");
return;
}
bool success = false;
for (int i=1; i<args.Length; i++)
{
var arg = args[i].ToLower();
if (!arg.StartsWith("-"))
continue;
switch (arg)
{
case "-version":
if (i + 1 == args.Length || args[i + 1].StartsWith("-"))
{
Console.WriteLine("未指定版本号");
return;
}
var version = args[i + 1];
Version result;
if(!Version.TryParse(version, out result))
{
Console.WriteLine("版本号解析失败");
return;
}
SetVersionName(manifestPath, version);
SetVersionCode(manifestPath, int.Parse(version.Replace(".", "")));
success = true;
break;
case "-channel":
if(i + 1 == args.Length || args[i + 1].StartsWith("-"))
{
Console.WriteLine("未指定渠道号");
return;
}
var channel = args[i + 1];
SetManifestChannel(manifestPath, channel);
SetManifestChannel(manifestPath, channel, "TD_CHANNEL_ID");
success = true;
break;
default:
Console.WriteLine("不支持的标记 " + args[i]);
break;
}
}
if(!success)
Console.WriteLine("未指定版本号或者渠道号 -version versionName -channel channelName");
}
private static void SetManifestChannel(string manifestPath, string channel, string channelKey = "UMENG_CHANNEL")
{
if (!File.Exists(manifestPath))
return;
string pattern = "<meta-data\\s+android:name=\"" + channelKey + "\"\\s+android:value=\"[^\"]+\"";
string input = File.ReadAllText(manifestPath);
if (!Regex.IsMatch(input, pattern))
return;
string content = Regex.Replace(input, pattern, "<meta-data android:name=\"" + channelKey + "\" android:value=\"" + channel + "\"");
File.WriteAllText(manifestPath, content);
}
private static void SetVersionCode(string manifestPath, int version)
{
if (!File.Exists(manifestPath))
return;
string pattern = "platformBuildVersionCode=\"[0-9]+\"";
string input = File.ReadAllText(manifestPath);
if (!Regex.IsMatch(input, pattern))
{
pattern = "android:versionCode=\"[0-9]+\"";
if (!Regex.IsMatch(input, pattern))
return;
}
string content = Regex.Replace(input, pattern, "android:versionCode=\"" + version + "\"");
File.WriteAllText(manifestPath, content);
}
private static void SetVersionName(string manifestPath, string version)
{
if (!File.Exists(manifestPath))
return;
string pattern = "platformBuildVersionName=\"\\S+\"";
string input = File.ReadAllText(manifestPath);
if (!Regex.IsMatch(input, pattern))
{
pattern = "android:versionName=\"\\S+\"";
if (!Regex.IsMatch(input, pattern))
return;
}
string content = Regex.Replace(input, pattern, "android:versionName=\"" + version + "\"");
File.WriteAllText(manifestPath, content);
}
}
}
使用方法:

网友评论