程序员Unity3D游戏开发

apk 版本号和渠道修改工具

2016-06-12  本文已影响1598人  2b75747cf703
@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);
        }
    }
}

使用方法:

Paste_Image.png
上一篇 下一篇

猜你喜欢

热点阅读