本文源链接:http://blog.csdn.net/qq393830887/article/details/56025923
工具
- Java环境
- Apktool(这玩意有些坑爹,不是官网最新的就好,找到一个好用的版本号能少非常多坑)
Apktool
Jarsigner
反编译
var argList = ProcessHelper.CreateArgumentsContainer();
argList.Add("java -jar");
argList.Add(ApkToolPath);
argList.Add("d");
argList.Add(pathToBuildProject);
argList.Add("-o");
argList.Add(GetDecodeApkFolder(pathToBuildProject));
var p = ProcessHelper.Start(ProcessHelper.CreateStartInfo());
ProcessHelper.WriteLine(p, ProcessHelper.CreateArguments(argList));
var result = p.StandardOutput.ReadToEnd();
var error = p.StandardError.ReadToEnd();
p.WaitForExit();
p.Close();
Debug.Log(result);
Debug.Log(error);
- 反编译之后的图如上(unknown是没有的)
- 反编译之后能够做一些改动。通常会改动AndroidMainifest.xml
- 牛逼一点的。能够改动smali,比如前面提及到的Unity半屏输入
重编译
var unsignedApk = GetUnSignedApkPath(pathToBuildProject);
FileHelper.DeleteFile(unsignedApk);
var argList = ProcessHelper.CreateArgumentsContainer();
argList.Add("java -jar");
argList.Add(ApkToolPath);
argList.Add("b");
argList.Add(GetDecodeApkFolder(pathToBuildProject));
argList.Add("-o");
argList.Add(unsignedApk);
var cmd = string.Join(" ", argList.ToArray());
var p = ProcessHelper.Start(ProcessHelper.CreateStartInfo());
ProcessHelper.WriteLine(p, ProcessHelper.CreateArguments(argList));
var result = p.StandardOutput.ReadToEnd();
var error = p.StandardError.ReadToEnd();
p.WaitForExit();
p.Close();
Debug.Log(result);
Debug.LogError(error);
重签名
var unsignedApk = GetUnSignedApkPath(pathToBuildProject);
var finalApk = GetFinalApkPath(pathToBuildProject);
FileHelper.DeleteFile(finalApk);
var argList = ProcessHelper.CreateArgumentsContainer();
argList.Add("jarsigner");
argList.Add("-keystore 路径");
argList.Add("-storepass password");
argList.Add("-signedjar");
argList.Add(finalApk);
argList.Add(unsignedApk);
argList.Add("别名");
var p = ProcessHelper.Start(ProcessHelper.CreateStartInfo());
ProcessHelper.WriteLine(p, ProcessHelper.CreateArguments(argList));
var result = p.StandardOutput.ReadToEnd();
var error = p.StandardError.ReadToEnd();
p.WaitForExit();
p.Close();
Debug.Log(result);
Debug.LogError(error);
- 一个Keystore能够相应多个Key
- 假设Key的password不一样,还得另外输入Key的password