using System;
using System.Web;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.IO;
using System.IO.Compression;
using Infrastructure;
using Customer.Source;
using Common;
using System.Text.RegularExpressions;
namespace Util.MakeApp
{
public class MakeAndroidCode
{
#region 生成文件
///
/// 生成安卓代码
///
/// APP项目ID
public static void MakerFile(string fileName, AppProject project, AppProjectVersion ver, List smodules, List codes, List modules, List paramList, List fileList, List pages, List bottoms)
{
MakeAppCodePub.ProcessSet(ver.id);
string AppPackage = project.packageName; //包名
string PackagePath = AppPackage.Replace(".", "/"); //包名
string AppIcon = project.appIcon; //应用桌面图标
string AppName = project.appName; //应用名称
string AppStartBg = project.appStartBg; //启动图
string AppStartListPhoto = project.appStartListPhoto; //启动介绍轮播图
string ApiHost = project.apiHost; //API主机头
string ApiKind = project.appKind; //APP分类
string AppStatic = ver.staticFile; //APP静态资源
string InitPage = project.initPage; //APP首次加载界面
//复制文件
string sourceDir = Function.getPath("/AppTemplate/android/OmegaMainBase/"); //模版目录
string destinationDir = Function.getPath("androidcode/" + project.id + "/"); //生成目录
CopyFolder(sourceDir, destinationDir);
MakeAppCodePub.ProcessSet(ver.id);
//替换包名
ReplaceAppPackage(destinationDir, AppPackage);
MakeAppCodePub.ProcessSet(ver.id);
//权限
string androidMainPath = destinationDir + "app/src/main/";
string androidMainFestContent = Function.ReadInstanceByFull(androidMainPath + "AndroidManifest.xml");
androidMainFestContent = androidMainFestContent.Replace("\n\n", " \n\n");
string androidMainFestList = "";
string ManifetsParamCodeList = "";
//引入库
string appGradlePath = destinationDir + "app/";
string appGradleContent = Function.ReadInstanceByFull(appGradlePath + "build.gradle");
appGradleContent = Function.ReplaceLast(appGradleContent, "}", " //APP引入库\n}");
string appGradleList = "";
//启动页方法
string splashActivityPath = androidMainPath + "java/" + AppPackage.Replace(".", "/") + "/activity/";
string splashActivityFunctionContent = Function.ReadInstanceByFull(splashActivityPath + "SplashActivity.java");
splashActivityFunctionContent = Function.ReplaceLast(splashActivityFunctionContent, "}", " /** 初始化方法 */\n}");
splashActivityFunctionContent = splashActivityFunctionContent.Replace("private void sdkInit() {", "private void sdkInit() {\n /** 初始化代码 */");
string splashActivityFunctionList = "";
string splashActivityCodeList = "";
//主界面方法
string mainActivityPath = androidMainPath + "java/" + AppPackage.Replace(".", "/") + "/function/";
string mainActivityFunctionContent = Function.ReadInstanceByFull(mainActivityPath + "WebFragmentFunction.java");
var importIndex = mainActivityFunctionContent.LastIndexOf("import");
var importTagIndex = mainActivityFunctionContent.Substring(importIndex).IndexOf(";") + importIndex;
mainActivityFunctionContent = mainActivityFunctionContent.Substring(0, importTagIndex) + ";\n//引用包" + mainActivityFunctionContent.Substring(importTagIndex + 1);
mainActivityFunctionContent = Function.ReplaceLast(mainActivityFunctionContent, "}", " /** 接口方法 */\n}");
string mainActivityFunctionList = "";
string fragmentImportList = "";
//内页面方法
string webActivityPath = androidMainPath + "java/" + AppPackage.Replace(".", "/") + "/function/";
string webActivityFunctionContent = Function.ReadInstanceByFull(webActivityPath + "WebFunction.java");
importIndex = webActivityFunctionContent.LastIndexOf("import");
importTagIndex = webActivityFunctionContent.Substring(importIndex).IndexOf(";") + importIndex;
webActivityFunctionContent = webActivityFunctionContent.Substring(0, importTagIndex) + ";\n//引用包" + webActivityFunctionContent.Substring(importTagIndex + 1);
webActivityFunctionContent = Function.ReplaceLast(webActivityFunctionContent, "}", " /** 接口方法 */\n}");
string webActivityFunctionList = "";
string webImportList = "";
//主界面回调方法
string mActivityPath = androidMainPath + "java/" + AppPackage.Replace(".", "/") + "/activity/";
string mActivityFunctionContent = Function.ReadInstanceByFull(mActivityPath + "MainActivity.java");
importIndex = mActivityFunctionContent.LastIndexOf("import");
importTagIndex = mActivityFunctionContent.Substring(importIndex).IndexOf(";") + importIndex;
mActivityFunctionContent = mActivityFunctionContent.Substring(0, importTagIndex) + ";\n//引用包" + mActivityFunctionContent.Substring(importTagIndex + 1);
mActivityFunctionContent = Function.ReplaceLast(mActivityFunctionContent, "}", " /** 回调方法 */\n}");
string mActivityFunctionList = "";
string mainActivityImportList = "";
//回调方法
string publicActivityPath = androidMainPath + "java/" + AppPackage.Replace(".", "/") + "/activity/";
string publicActivityFunctionContent = Function.ReadInstanceByFull(publicActivityPath + "PublicWebActivity.java");
importIndex = publicActivityFunctionContent.LastIndexOf("import");
importTagIndex = publicActivityFunctionContent.Substring(importIndex).IndexOf(";") + importIndex;
publicActivityFunctionContent = publicActivityFunctionContent.Substring(0, importTagIndex) + ";\n//引用包" + publicActivityFunctionContent.Substring(importTagIndex + 1);
publicActivityFunctionContent = Function.ReplaceLast(publicActivityFunctionContent, "}", " /** 回调方法 */\n}");
string publicActivityFunctionList = "";
string publicWebActivityImportList = "";
//初始化变量
string initActivityPath = androidMainPath + "java/" + AppPackage.Replace(".", "/") + "/app/";
string initActivityFunctionContent = Function.ReadInstanceByFull(initActivityPath + "MainApplication.java");
importIndex = initActivityFunctionContent.LastIndexOf("import");
importTagIndex = initActivityFunctionContent.Substring(importIndex).IndexOf(";") + importIndex;
initActivityFunctionContent = initActivityFunctionContent.Substring(0, importTagIndex) + ";\n//引用包" + initActivityFunctionContent.Substring(importTagIndex + 1);
initActivityFunctionContent = initActivityFunctionContent.Replace("private void sdkInit() {", "private void sdkInit() {\n /** 初始化变量 */");
initActivityFunctionContent = initActivityFunctionContent.Replace("public static class MainApp {", "public static class MainApp {\n /** 全局变量 */");
string initActivityFunctionList = "";
string mainApplicationImportList = "";
string mainApplicationStaticList = "";
MakeAppCodePub.ProcessSet(ver.id);
//替换基础信息
string baseInfo = Function.ReadInstanceByFull(androidMainPath + "res/values/strings.xml");
baseInfo = Regex.Replace(baseInfo, ".*?", "" + AppName + "");
baseInfo = Regex.Replace(baseInfo, ".*?", "" + AppPackage + "");
baseInfo = Regex.Replace(baseInfo, ".*?", "" + ApiHost + "");
string AppVersion = ver.version.ToString();
string VersionCode = ver.versionCode;
string VersionName = ver.versionName;
baseInfo = Regex.Replace(baseInfo, ".*?", "" + ApiKind + "/" + AppVersion + "");
baseInfo = Regex.Replace(baseInfo, ".*?", "" + InitPage + "");
baseInfo = baseInfo.Replace("", " \n");
string StringsParamCodeList = "";
//替换样式信息
string styleInfo = Function.ReadInstanceByFull(androidMainPath + "res/values/styles.xml");
styleInfo = styleInfo.Replace("", " \n");
string StyleParamCodeList = "";
MakeAppCodePub.ProcessSet(ver.id);
//读取项目所有关联模块
List moduleIds = modules.Select(m => m.moduleId).ToList();
//读取模块配置参数
Dictionary paramDic = new Dictionary();
foreach(var param in paramList)
{
if(!paramDic.ContainsKey(param.paramName)) paramDic.Add(param.paramName, param.paramValue);
}
foreach(AppProjectModule module in modules)
{
AppModule smodule = smodules.FirstOrDefault(m => m.id == module.moduleId);
if(smodule != null)
{
List files = fileList.Where(m => m.moduleId == module.moduleId && m.appType == "Android").ToList();
foreach(AppModuleFile file in files)
{
string SourceFilePath = file.sourcePath;
string ToPath = file.makePath;
ToPath = ToPath.Replace("{PackagePath}", PackagePath);
// File.Copy(Function.getPath("/AppTemplate/android/fw" + SourceFilePath), destinationDir.TrimEnd('/') + ToPath);
Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + "/AppModule/Android" + SourceFilePath, destinationDir.TrimEnd('/') + ToPath);
//替换文件内容
if (!ToPath.EndsWith(".aar"))
{
ReplaceFileContent(destinationDir.TrimEnd('/') + ToPath, "${PackageName}", AppPackage);
}
}
AppModuleAndroidCode code = codes.FirstOrDefault(m => m.moduleId == module.moduleId) ?? new AppModuleAndroidCode();
string MainActivityCode = Function.CheckNull(code.mainActivityCode);
string PublicWebCode = Function.CheckNull(code.publicWebCode);
string MainCallBackCode = Function.CheckNull(code.mainCallBackCode);
string CallBackCode = Function.CheckNull(code.callBackCode);
string RightCode = Function.CheckNull(code.rightCode);
string InitCode = Function.CheckNull(code.initCode);
string GradleImportCode = Function.CheckNull(code.gradleImportCode);
string WebImportCode = Function.CheckNull(code.webImportCode);
string FragmentImportCode = Function.CheckNull(code.fragmentImportCode);
string MainActivityImportCode = Function.CheckNull(code.mainActivityImportCode);
string PublicWebActivityImportCode = Function.CheckNull(code.publicWebActivityImportCode);
string MainApplicationImportCode = Function.CheckNull(code.mainApplicationImportCode);
string StringsParamCode = Function.CheckNull(code.stringsParamCode);
string ManifetsParamCode = Function.CheckNull(code.manifetsParamCode);
string MainApplicationStaticParam = Function.CheckNull(code.mainApplicationStaticParam);
string StartPageMethodCode = Function.CheckNull(code.startPageMethodCode);
string startPageInitCode = Function.CheckNull(code.startPageInitCode);
string StyleParamCode = Function.CheckNull(code.stylesParamCode);
//替换对应模块参数
if(module.moduleId == 1)
{
MatchCollection matches = Regex.Matches(RightCode, "\\$\\{.*?\\}");
foreach(Match match in matches)
{
string paramName = match.Value.Replace("${", "").Replace("}", "");
if(paramDic.ContainsKey(paramName)) RightCode = RightCode.Replace(match.Value, paramDic[paramName]);
}
}
//权限
if(!string.IsNullOrEmpty(RightCode))
{
string[] RightCodes = RightCode.Split('\n');
foreach(string sub in RightCodes)
{
if(!androidMainFestList.Contains(sub.Trim())) androidMainFestList += " " + sub + "\n";
}
}
//Strings.xml参数配置
if(!string.IsNullOrEmpty(StringsParamCode))
{
string[] RightCodes = StringsParamCode.Split('\n');
foreach(string sub in RightCodes)
{
string subLine = sub;
MatchCollection matches = Regex.Matches(subLine, "\\$\\{.*?\\}");
foreach(Match match in matches)
{
string paramName = match.Value.Replace("${", "").Replace("}", "");
if(paramDic.ContainsKey(paramName)) subLine = subLine.Replace(match.Value, paramDic[paramName]);
}
if(!StringsParamCodeList.Contains(subLine.Trim())) StringsParamCodeList += "\n" + subLine;
}
}
//Style.xml参数配置
if(!string.IsNullOrEmpty(StyleParamCode))
{
string[] RightCodes = StyleParamCode.Split('\n');
foreach(string sub in RightCodes)
{
string subLine = sub;
MatchCollection matches = Regex.Matches(subLine, "\\$\\{.*?\\}");
foreach(Match match in matches)
{
string paramName = match.Value.Replace("${", "").Replace("}", "");
if(paramDic.ContainsKey(paramName)) subLine = subLine.Replace(match.Value, paramDic[paramName]);
}
if(!StyleParamCodeList.Contains(subLine.Trim())) StyleParamCodeList += "\n" + subLine;
}
}
//Manifets.xml参数配置
if(!string.IsNullOrEmpty(ManifetsParamCode))
{
ManifetsParamCode = ManifetsParamCode.Replace("${package}", AppPackage).Replace("}", "");
if(!ManifetsParamCodeList.Contains(ManifetsParamCode)) ManifetsParamCodeList += "\n" + ManifetsParamCode;
}
//引入库
if(!string.IsNullOrEmpty(GradleImportCode))
{
string[] GradleImportCodes = GradleImportCode.Split('\n');
foreach(string sub in GradleImportCodes)
{
if(!appGradleList.Contains(sub)) appGradleList += " " + sub + "\n";
}
}
//主界面方法
if(!webActivityFunctionList.Contains(PublicWebCode) && !string.IsNullOrEmpty(PublicWebCode)) webActivityFunctionList += " " + PublicWebCode.Replace("\n", " \n") + "\n";
//内页面方法
if(!mainActivityFunctionList.Contains(MainActivityCode) && !string.IsNullOrEmpty(MainActivityCode)) mainActivityFunctionList += " " + MainActivityCode.Replace("\n", " \n") + "\n";
//主界面回调方法
if(!mActivityFunctionList.Contains(MainCallBackCode) && !string.IsNullOrEmpty(MainCallBackCode)) mActivityFunctionList += " " + MainCallBackCode.Replace("\n", " \n") + "\n";
//回调方法
if(!publicActivityFunctionList.Contains(CallBackCode) && !string.IsNullOrEmpty(CallBackCode)) publicActivityFunctionList += " " + CallBackCode.Replace("\n", " \n") + "\n";
//初始化变量
if(!initActivityFunctionList.Contains(InitCode) && !string.IsNullOrEmpty(InitCode)) initActivityFunctionList += " " + InitCode.Replace("\n", " \n") + "\n";
//全局变量
if(!mainApplicationStaticList.Contains(MainApplicationStaticParam) && !string.IsNullOrEmpty(MainApplicationStaticParam)) mainApplicationStaticList += MainApplicationStaticParam.Replace("\n", " \n") + "\n";
//启动页初始化方法
if(!splashActivityFunctionList.Contains(StartPageMethodCode) && !string.IsNullOrEmpty(StartPageMethodCode)) splashActivityFunctionList += StartPageMethodCode.Replace("\n", " \n") + "\n";
//启动页初始化代码
if(!splashActivityCodeList.Contains(startPageInitCode) && !string.IsNullOrEmpty(startPageInitCode)) splashActivityCodeList += startPageInitCode.Replace("\n", " \n") + "\n";
//import包
if(!string.IsNullOrEmpty(FragmentImportCode))
{
string[] FragmentImportCodes = FragmentImportCode.Split('\n');
foreach(string sub in FragmentImportCodes)
{
string checkString = sub.Replace("${package}", AppPackage);
if(!fragmentImportList.Contains(checkString) && !mainActivityFunctionContent.Contains(checkString)) fragmentImportList += checkString + "\n";
}
}
if(!string.IsNullOrEmpty(WebImportCode))
{
string[] WebImportCodes = WebImportCode.Split('\n');
foreach(string sub in WebImportCodes)
{
string checkString = sub.Replace("${package}", AppPackage);
if(!webImportList.Contains(checkString) && !webActivityFunctionContent.Contains(checkString)) webImportList += checkString + "\n";
}
}
if(!string.IsNullOrEmpty(MainActivityImportCode))
{
string[] MainActivityImportCodes = MainActivityImportCode.Split('\n');
foreach(string sub in MainActivityImportCodes)
{
string checkString = sub.Replace("${package}", AppPackage);
if(!mainActivityImportList.Contains(checkString) && !mActivityFunctionContent.Contains(checkString)) mainActivityImportList += checkString + "\n";
}
}
if(!string.IsNullOrEmpty(PublicWebActivityImportCode))
{
string[] PublicWebActivityImportCodes = PublicWebActivityImportCode.Split('\n');
foreach(string sub in PublicWebActivityImportCodes)
{
string checkString = sub.Replace("${package}", AppPackage);
if(!publicWebActivityImportList.Contains(checkString) && !publicActivityFunctionContent.Contains(checkString)) publicWebActivityImportList += checkString + "\n";
}
}
if(!string.IsNullOrEmpty(MainApplicationImportCode))
{
string[] MainApplicationImportCodes = MainApplicationImportCode.Split('\n');
foreach(string sub in MainApplicationImportCodes)
{
string checkString = sub.Replace("${package}", AppPackage);
if(!mainApplicationImportList.Contains(checkString) && !initActivityFunctionContent.Contains(checkString)) mainApplicationImportList += checkString + "\n";
}
}
}
}
MakeAppCodePub.ProcessSet(ver.id);
//加入权限文件
// if (!string.IsNullOrEmpty(androidMainFestList))
// {
// Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + "/AppModule/Android/Java/PermissionDescription.java", destinationDir.TrimEnd('/') + "/app/src/main/java/" + PackagePath + "/tool/PermissionDescription.java");
// //替换文件内容
// ReplaceFileContent(destinationDir.TrimEnd('/') + "/app/src/main/java/" + PackagePath + "/tool/PermissionDescription.java", "${PackageName}", AppPackage);
// Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + "/AppModule/Android/xml/permission_description_popup_bg.xml", destinationDir.TrimEnd('/') + "/app/src/main/res/drawable/permission_description_popup_bg.xml");
// appGradleList += " //权限申请\n implementation 'com.github.getActivity:XXPermissions:20.0';\n";
// }
androidMainFestContent = androidMainFestContent.Replace("", androidMainFestList);
androidMainFestContent = androidMainFestContent.Replace("", ManifetsParamCodeList);
appGradleContent = appGradleContent.Replace("//APP引入库", appGradleList);
appGradleContent = Regex.Replace(appGradleContent, "versionCode.*?\n", "versionCode " + VersionCode + "\n");
appGradleContent = Regex.Replace(appGradleContent, "versionName \".*?\"\n", "versionName \"" + VersionName + "\"\n");
mainActivityFunctionContent = mainActivityFunctionContent.Replace("/** 接口方法 */", mainActivityFunctionList);
webActivityFunctionContent = webActivityFunctionContent.Replace("/** 接口方法 */", webActivityFunctionList);
mActivityFunctionContent = mActivityFunctionContent.Replace("/** 回调方法 */", mActivityFunctionList);
publicActivityFunctionContent = publicActivityFunctionContent.Replace("/** 回调方法 */", publicActivityFunctionList);
initActivityFunctionContent = initActivityFunctionContent.Replace("/** 初始化变量 */", initActivityFunctionList);
initActivityFunctionContent = initActivityFunctionContent.Replace("/** 全局变量 */", mainApplicationStaticList);
mainActivityFunctionContent = mainActivityFunctionContent.Replace("//引用包", fragmentImportList);
webActivityFunctionContent = webActivityFunctionContent.Replace("//引用包", webImportList);
mActivityFunctionContent = mActivityFunctionContent.Replace("//引用包", mainActivityImportList);
publicActivityFunctionContent = publicActivityFunctionContent.Replace("//引用包", publicWebActivityImportList);
initActivityFunctionContent = initActivityFunctionContent.Replace("//引用包", mainApplicationImportList);
baseInfo = baseInfo.Replace("", StringsParamCodeList);
styleInfo = styleInfo.Replace("", StyleParamCodeList);
Function.WritePageFullPath(androidMainPath, "AndroidManifest.xml", androidMainFestContent);
Function.WritePageFullPath(androidMainPath + "res/values/", "strings.xml", baseInfo);
Function.WritePageFullPath(androidMainPath + "res/values/", "styles.xml", styleInfo);
Function.WritePageFullPath(appGradlePath, "build.gradle", appGradleContent);
Function.WritePageFullPath(mainActivityPath, "WebFragmentFunction.java", mainActivityFunctionContent);
Function.WritePageFullPath(webActivityPath, "WebFunction.java", webActivityFunctionContent);
Function.WritePageFullPath(mActivityPath, "MainActivity.java", mActivityFunctionContent);
Function.WritePageFullPath(publicActivityPath, "PublicWebActivity.java", publicActivityFunctionContent);
Function.WritePageFullPath(initActivityPath, "MainApplication.java", initActivityFunctionContent);
string toPath = androidMainPath + "assets/sources/";
//底部导航图标下载
foreach(var bottom in bottoms)
{
if(!string.IsNullOrEmpty(bottom.selectIcon))
{
Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + bottom.selectIcon, toPath + "static/bottom/" + bottom.selectIcon.Substring(bottom.selectIcon.LastIndexOf("/") + 1));
}
if(!string.IsNullOrEmpty(bottom.normalIcon))
{
Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + bottom.normalIcon, toPath + "static/bottom/" + bottom.normalIcon.Substring(bottom.normalIcon.LastIndexOf("/") + 1));
}
if(!string.IsNullOrEmpty(bottom.pagDefaultIcon))
{
Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + bottom.pagDefaultIcon, toPath + "static/bottom/" + bottom.pagDefaultIcon.Substring(bottom.pagDefaultIcon.LastIndexOf("/") + 1));
}
if(!string.IsNullOrEmpty(bottom.pagLocalPath))
{
Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + bottom.pagLocalPath, toPath + "static/bottom/" + bottom.pagLocalPath.Substring(bottom.pagLocalPath.LastIndexOf("/") + 1));
}
}
MakeAppCodePub.ProcessSet(ver.id);
//页面图标下载
foreach(var page in pages)
{
if (page.leftBtn != null)
{
foreach (var btn in page.leftBtn)
{
if (!string.IsNullOrEmpty(btn.btnIcon))
{
Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + btn.btnIcon, toPath + "static/page/" + btn.btnIcon.Substring(btn.btnIcon.LastIndexOf("/") + 1));
}
}
}
if (page.rightBtn != null)
{
foreach (var btn in page.rightBtn)
{
if(!string.IsNullOrEmpty(btn.btnIcon))
{
Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + btn.btnIcon, toPath + "static/page/" + btn.btnIcon.Substring(btn.btnIcon.LastIndexOf("/") + 1));
}
}
}
}
MakeAppCodePub.ProcessSet(ver.id);
//解压static静态资源
// string staticFilePath = Function.getPath(AppStatic);
Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + AppStatic, toPath + "static.zip");
ZipFile.ExtractToDirectory(toPath + "static.zip", toPath, true);
File.Delete(toPath + "static.zip");
//生成app加密的配置文件
Dictionary appFileDic = MakeAppCodePub.getAppFile(ver, pages, bottoms, toPath);
if(appFileDic.ContainsKey("AppInfoList")) Function.WritePageFullPath(androidMainPath + "assets/", "AppInfoList.txt", appFileDic["AppInfoList"]);
if(appFileDic.ContainsKey("SystemSet")) Function.WritePageFullPath(androidMainPath + "assets/", "SystemSet.txt", appFileDic["SystemSet"]);
if(appFileDic.ContainsKey("PageInfoList")) Function.WritePageFullPath(androidMainPath + "assets/", "PageInfoList.txt", appFileDic["PageInfoList"]);
if(appFileDic.ContainsKey("GotoPages")) Function.WritePageFullPath(androidMainPath + "assets/", "GotoPages.txt", appFileDic["GotoPages"]);
if(appFileDic.ContainsKey("LibFile")) Function.WritePageFullPath(androidMainPath + "assets/", "LibFile.txt", appFileDic["LibFile"]);
//删除html文件
List htmlFiles = FileHelper.GetSystemFilesFromFullPath(toPath);
foreach(string file in htmlFiles)
{
if(file.EndsWith(".html")) {
File.Delete(file);
}
}
MakeAppCodePub.ProcessSet(ver.id);
//解压icon图标
//解压icon图标
// string iconPath = Function.getPath(AppIcon);
string toIconPath = androidMainPath + "res/";
string savePath = toPath + AppIcon.Substring(AppIcon.LastIndexOf("/") + 1);
Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + AppIcon, savePath);
ZipFile.ExtractToDirectory(savePath, toIconPath, true);
File.Delete(savePath);
//解压启动图
// string startBgPath = Function.getPath(AppStartBg);
string toStartBgPath = androidMainPath + "res/";
savePath = toPath + AppStartBg.Substring(AppStartBg.LastIndexOf("/") + 1);
Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + AppStartBg, savePath);
ZipFile.ExtractToDirectory(savePath, toStartBgPath, true);
File.Delete(savePath);
//删除 icon 的 xml 文件
File.Delete(toIconPath + "drawable/ic_launcher_background.xml");
ZipFile.CreateFromDirectory(Function.getPath("androidcode/" + project.id + "/"), Function.getPath("androidcode/" + fileName));
OssHelper.Instance.Upload(Function.getPath("androidcode/" + fileName));
File.Delete(Function.getPath("androidcode/" + fileName));
Directory.Delete(Function.getPath("androidcode/" + project.id + "/"), true);
MakeAppCodePub.ProcessSet(ver.id);
}
public static void CopyFolder(string sourceDir, string destinationDir, bool move = false)
{
// 如果目标文件夹不存在,则创建
if (!Directory.Exists(destinationDir))
{
Directory.CreateDirectory(destinationDir);
}
// 获取源文件夹中的所有文件并复制到目标文件夹
foreach (string file in Directory.GetFiles(sourceDir, "*.*", SearchOption.AllDirectories))
{
string destFile = file.Replace(sourceDir, destinationDir);
string destDir = Path.GetDirectoryName(destFile);
// 如果目标文件夹不存在,则创建
if (!Directory.Exists(destDir))
{
Directory.CreateDirectory(destDir);
}
if(move)
{
File.Move(file, destFile, true); // 如果目标文件已存在,则覆盖
}
else
{
File.Copy(file, destFile, true); // 如果目标文件已存在,则覆盖
}
}
// 获取源文件夹中的所有子文件夹并递归复制
foreach (string dir in Directory.GetDirectories(sourceDir, "*.*", SearchOption.AllDirectories))
{
string destDir = dir.Replace(sourceDir, destinationDir);
if (!Directory.Exists(destDir))
{
Directory.CreateDirectory(destDir);
}
}
}
#endregion
#region 替换包名
public static void ReplaceAppPackage(string destinationDir, string AppPackage)
{
string[] paths = new string[] { "main", "androidTest", "test"};
foreach(string path in paths)
{
string fromPath = destinationDir + "app/src/" + path + "/java/com/omega/omegamainbase/";
string toPath = destinationDir + "app/src/" + path + "/java/" + AppPackage.Replace(".", "/") + "/";
CopyFolder(fromPath, toPath, true);
if (Directory.Exists(destinationDir + "app/src/" + path + "/java/com/omega/"))
{
Directory.Delete(destinationDir + "app/src/" + path + "/java/com/omega/", true);
}
string[] fileList = Directory.GetFiles(destinationDir, "*.*", SearchOption.AllDirectories);
foreach (string file in fileList)
{
bool op = true;
if((file.Contains(".gradle/") && !file.EndsWith(".gradle")) || file.Contains(".idea/"))
{
op = false;
}
if(!file.EndsWith(".java") && !file.EndsWith(".xml") && !file.EndsWith(".gradle"))
{
op = false;
}
if(op)
{
string content = Function.ReadInstanceByFull(file);
content = content.Replace("com.omega.omegamainbase", AppPackage);
content = content.Replace("${PackageName}", AppPackage);
Function.WritePageFullPath(file.Substring(0, file.LastIndexOf("/")), file.Substring(file.LastIndexOf("/")), content);
}
}
}
}
public static string ReplaceFileContent(string filePath, string oldStr, string newStr)
{
string content = Function.ReadInstanceByFull(filePath);
content = content.Replace(oldStr, newStr);
Function.WritePageFullPath(filePath.Substring(0, filePath.LastIndexOf("/")), filePath.Substring(filePath.LastIndexOf("/")), content);
return content;
}
public static string ReplaceFileContent(string filePath, Dictionary replaceDict)
{
string content = Function.ReadInstanceByFull(filePath);
foreach(var item in replaceDict)
{
content = content.Replace(item.Key, item.Value);
}
Function.WritePageFullPath(filePath.Substring(0, filePath.LastIndexOf("/")), filePath.Substring(filePath.LastIndexOf("/")), content);
return content;
}
#endregion
}
}