MakeAndroidCode.cs 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. using System;
  2. using System.Web;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Data;
  6. using System.IO;
  7. using System.IO.Compression;
  8. using Infrastructure;
  9. using Customer.Source;
  10. using Common;
  11. using System.Text.RegularExpressions;
  12. namespace Util.MakeApp
  13. {
  14. public class MakeAndroidCode
  15. {
  16. #region 生成文件
  17. /// <summary>
  18. /// 生成安卓代码
  19. /// </summary>
  20. /// <param name="AppId">APP项目ID</param>
  21. public static void MakerFile(string fileName, AppProject project, AppProjectVersion ver, List<AppModule> smodules, List<AppModuleAndroidCode> codes, List<AppProjectModule> modules, List<AppProjectParam> paramList, List<AppModuleFile> fileList, List<AppProjectPage> pages, List<AppProjectBottom> bottoms)
  22. {
  23. MakeAppCodePub.ProcessSet(ver.id);
  24. string AppPackage = project.packageName; //包名
  25. string PackagePath = AppPackage.Replace(".", "/"); //包名
  26. string AppIcon = project.appIcon; //应用桌面图标
  27. string AppName = project.appName; //应用名称
  28. string AppStartBg = project.appStartBg; //启动图
  29. string AppStartListPhoto = project.appStartListPhoto; //启动介绍轮播图
  30. string ApiHost = project.apiHost; //API主机头
  31. string ApiKind = project.appKind; //APP分类
  32. string AppStatic = ver.staticFile; //APP静态资源
  33. string InitPage = project.initPage; //APP首次加载界面
  34. //复制文件
  35. string sourceDir = Function.getPath("/AppTemplate/android/OmegaMainBase/"); //模版目录
  36. string destinationDir = Function.getPath("androidcode/" + project.id + "/"); //生成目录
  37. CopyFolder(sourceDir, destinationDir);
  38. MakeAppCodePub.ProcessSet(ver.id);
  39. //替换包名
  40. ReplaceAppPackage(destinationDir, AppPackage);
  41. MakeAppCodePub.ProcessSet(ver.id);
  42. //权限
  43. string androidMainPath = destinationDir + "app/src/main/";
  44. string androidMainFestContent = Function.ReadInstanceByFull(androidMainPath + "AndroidManifest.xml");
  45. androidMainFestContent = androidMainFestContent.Replace("<application", " <!-- 权限列表 -->\n\n<application");
  46. androidMainFestContent = androidMainFestContent.Replace("</application>", " <!-- 参数配置 -->\n\n</application>");
  47. string androidMainFestList = "";
  48. string ManifetsParamCodeList = "";
  49. //引入库
  50. string appGradlePath = destinationDir + "app/";
  51. string appGradleContent = Function.ReadInstanceByFull(appGradlePath + "build.gradle");
  52. appGradleContent = Function.ReplaceLast(appGradleContent, "}", " //APP引入库\n}");
  53. string appGradleList = "";
  54. //启动页方法
  55. string splashActivityPath = androidMainPath + "java/" + AppPackage.Replace(".", "/") + "/activity/";
  56. string splashActivityFunctionContent = Function.ReadInstanceByFull(splashActivityPath + "SplashActivity.java");
  57. splashActivityFunctionContent = Function.ReplaceLast(splashActivityFunctionContent, "}", " /** 初始化方法 */\n}");
  58. splashActivityFunctionContent = splashActivityFunctionContent.Replace("private void sdkInit() {", "private void sdkInit() {\n /** 初始化代码 */");
  59. string splashActivityFunctionList = "";
  60. string splashActivityCodeList = "";
  61. //主界面方法
  62. string mainActivityPath = androidMainPath + "java/" + AppPackage.Replace(".", "/") + "/function/";
  63. string mainActivityFunctionContent = Function.ReadInstanceByFull(mainActivityPath + "WebFragmentFunction.java");
  64. var importIndex = mainActivityFunctionContent.LastIndexOf("import");
  65. var importTagIndex = mainActivityFunctionContent.Substring(importIndex).IndexOf(";") + importIndex;
  66. mainActivityFunctionContent = mainActivityFunctionContent.Substring(0, importTagIndex) + ";\n//引用包" + mainActivityFunctionContent.Substring(importTagIndex + 1);
  67. mainActivityFunctionContent = Function.ReplaceLast(mainActivityFunctionContent, "}", " /** 接口方法 */\n}");
  68. string mainActivityFunctionList = "";
  69. string fragmentImportList = "";
  70. //内页面方法
  71. string webActivityPath = androidMainPath + "java/" + AppPackage.Replace(".", "/") + "/function/";
  72. string webActivityFunctionContent = Function.ReadInstanceByFull(webActivityPath + "WebFunction.java");
  73. importIndex = webActivityFunctionContent.LastIndexOf("import");
  74. importTagIndex = webActivityFunctionContent.Substring(importIndex).IndexOf(";") + importIndex;
  75. webActivityFunctionContent = webActivityFunctionContent.Substring(0, importTagIndex) + ";\n//引用包" + webActivityFunctionContent.Substring(importTagIndex + 1);
  76. webActivityFunctionContent = Function.ReplaceLast(webActivityFunctionContent, "}", " /** 接口方法 */\n}");
  77. string webActivityFunctionList = "";
  78. string webImportList = "";
  79. //主界面回调方法
  80. string mActivityPath = androidMainPath + "java/" + AppPackage.Replace(".", "/") + "/activity/";
  81. string mActivityFunctionContent = Function.ReadInstanceByFull(mActivityPath + "MainActivity.java");
  82. importIndex = mActivityFunctionContent.LastIndexOf("import");
  83. importTagIndex = mActivityFunctionContent.Substring(importIndex).IndexOf(";") + importIndex;
  84. mActivityFunctionContent = mActivityFunctionContent.Substring(0, importTagIndex) + ";\n//引用包" + mActivityFunctionContent.Substring(importTagIndex + 1);
  85. mActivityFunctionContent = Function.ReplaceLast(mActivityFunctionContent, "}", " /** 回调方法 */\n}");
  86. string mActivityFunctionList = "";
  87. string mainActivityImportList = "";
  88. //回调方法
  89. string publicActivityPath = androidMainPath + "java/" + AppPackage.Replace(".", "/") + "/activity/";
  90. string publicActivityFunctionContent = Function.ReadInstanceByFull(publicActivityPath + "PublicWebActivity.java");
  91. importIndex = publicActivityFunctionContent.LastIndexOf("import");
  92. importTagIndex = publicActivityFunctionContent.Substring(importIndex).IndexOf(";") + importIndex;
  93. publicActivityFunctionContent = publicActivityFunctionContent.Substring(0, importTagIndex) + ";\n//引用包" + publicActivityFunctionContent.Substring(importTagIndex + 1);
  94. publicActivityFunctionContent = Function.ReplaceLast(publicActivityFunctionContent, "}", " /** 回调方法 */\n}");
  95. string publicActivityFunctionList = "";
  96. string publicWebActivityImportList = "";
  97. //初始化变量
  98. string initActivityPath = androidMainPath + "java/" + AppPackage.Replace(".", "/") + "/app/";
  99. string initActivityFunctionContent = Function.ReadInstanceByFull(initActivityPath + "MainApplication.java");
  100. importIndex = initActivityFunctionContent.LastIndexOf("import");
  101. importTagIndex = initActivityFunctionContent.Substring(importIndex).IndexOf(";") + importIndex;
  102. initActivityFunctionContent = initActivityFunctionContent.Substring(0, importTagIndex) + ";\n//引用包" + initActivityFunctionContent.Substring(importTagIndex + 1);
  103. initActivityFunctionContent = initActivityFunctionContent.Replace("private void sdkInit() {", "private void sdkInit() {\n /** 初始化变量 */");
  104. initActivityFunctionContent = initActivityFunctionContent.Replace("public static class MainApp {", "public static class MainApp {\n /** 全局变量 */");
  105. string initActivityFunctionList = "";
  106. string mainApplicationImportList = "";
  107. string mainApplicationStaticList = "";
  108. MakeAppCodePub.ProcessSet(ver.id);
  109. //替换基础信息
  110. string baseInfo = Function.ReadInstanceByFull(androidMainPath + "res/values/strings.xml");
  111. baseInfo = Regex.Replace(baseInfo, "<string name=\"application_name\" translatable=\"false\">.*?</string>", "<string name=\"application_name\" translatable=\"false\">" + AppName + "</string>");
  112. baseInfo = Regex.Replace(baseInfo, "<string name=\"authorities\" translatable=\"false\">.*?</string>", "<string name=\"authorities\" translatable=\"false\">" + AppPackage + "</string>");
  113. baseInfo = Regex.Replace(baseInfo, "<string name=\"server_url\" translatable=\"false\">.*?</string>", "<string name=\"server_url\" translatable=\"false\">" + ApiHost + "</string>");
  114. string AppVersion = ver.version.ToString();
  115. string VersionCode = ver.versionCode;
  116. string VersionName = ver.versionName;
  117. baseInfo = Regex.Replace(baseInfo, "<string name=\"app_kind\" translatable=\"false\">.*?</string>", "<string name=\"app_kind\" translatable=\"false\">" + ApiKind + "/" + AppVersion + "</string>");
  118. baseInfo = Regex.Replace(baseInfo, "<string name=\"auto_url\" translatable=\"false\">.*?</string>", "<string name=\"auto_url\" translatable=\"false\">" + InitPage + "</string>");
  119. baseInfo = baseInfo.Replace("</resources>", " <!-- 参数配置 -->\n</resources>");
  120. string StringsParamCodeList = "";
  121. //替换样式信息
  122. string styleInfo = Function.ReadInstanceByFull(androidMainPath + "res/values/styles.xml");
  123. styleInfo = styleInfo.Replace("</resources>", " <!-- 样式配置 -->\n</resources>");
  124. string StyleParamCodeList = "";
  125. MakeAppCodePub.ProcessSet(ver.id);
  126. //读取项目所有关联模块
  127. List<int> moduleIds = modules.Select(m => m.moduleId).ToList();
  128. //读取模块配置参数
  129. Dictionary<string, string> paramDic = new Dictionary<string, string>();
  130. foreach(var param in paramList)
  131. {
  132. if(!paramDic.ContainsKey(param.paramName)) paramDic.Add(param.paramName, param.paramValue);
  133. }
  134. foreach(AppProjectModule module in modules)
  135. {
  136. AppModule smodule = smodules.FirstOrDefault(m => m.id == module.moduleId);
  137. if(smodule != null)
  138. {
  139. List<AppModuleFile> files = fileList.Where(m => m.moduleId == module.moduleId && m.appType == "Android").ToList();
  140. foreach(AppModuleFile file in files)
  141. {
  142. string SourceFilePath = file.sourcePath;
  143. string ToPath = file.makePath;
  144. ToPath = ToPath.Replace("{PackagePath}", PackagePath);
  145. // File.Copy(Function.getPath("/AppTemplate/android/fw" + SourceFilePath), destinationDir.TrimEnd('/') + ToPath);
  146. Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + "/AppModule/Android" + SourceFilePath, destinationDir.TrimEnd('/') + ToPath);
  147. //替换文件内容
  148. if (!ToPath.EndsWith(".aar"))
  149. {
  150. ReplaceFileContent(destinationDir.TrimEnd('/') + ToPath, "${PackageName}", AppPackage);
  151. }
  152. }
  153. AppModuleAndroidCode code = codes.FirstOrDefault(m => m.moduleId == module.moduleId) ?? new AppModuleAndroidCode();
  154. string MainActivityCode = Function.CheckNull(code.mainActivityCode);
  155. string PublicWebCode = Function.CheckNull(code.publicWebCode);
  156. string MainCallBackCode = Function.CheckNull(code.mainCallBackCode);
  157. string CallBackCode = Function.CheckNull(code.callBackCode);
  158. string RightCode = Function.CheckNull(code.rightCode);
  159. string InitCode = Function.CheckNull(code.initCode);
  160. string GradleImportCode = Function.CheckNull(code.gradleImportCode);
  161. string WebImportCode = Function.CheckNull(code.webImportCode);
  162. string FragmentImportCode = Function.CheckNull(code.fragmentImportCode);
  163. string MainActivityImportCode = Function.CheckNull(code.mainActivityImportCode);
  164. string PublicWebActivityImportCode = Function.CheckNull(code.publicWebActivityImportCode);
  165. string MainApplicationImportCode = Function.CheckNull(code.mainApplicationImportCode);
  166. string StringsParamCode = Function.CheckNull(code.stringsParamCode);
  167. string ManifetsParamCode = Function.CheckNull(code.manifetsParamCode);
  168. string MainApplicationStaticParam = Function.CheckNull(code.mainApplicationStaticParam);
  169. string StartPageMethodCode = Function.CheckNull(code.startPageMethodCode);
  170. string startPageInitCode = Function.CheckNull(code.startPageInitCode);
  171. string StyleParamCode = Function.CheckNull(code.stylesParamCode);
  172. //替换对应模块参数
  173. if(module.moduleId == 1)
  174. {
  175. MatchCollection matches = Regex.Matches(RightCode, "\\$\\{.*?\\}");
  176. foreach(Match match in matches)
  177. {
  178. string paramName = match.Value.Replace("${", "").Replace("}", "");
  179. if(paramDic.ContainsKey(paramName)) RightCode = RightCode.Replace(match.Value, paramDic[paramName]);
  180. }
  181. }
  182. //权限
  183. if(!string.IsNullOrEmpty(RightCode))
  184. {
  185. string[] RightCodes = RightCode.Split('\n');
  186. foreach(string sub in RightCodes)
  187. {
  188. if(!androidMainFestList.Contains(sub.Trim())) androidMainFestList += " " + sub + "\n";
  189. }
  190. }
  191. //Strings.xml参数配置
  192. if(!string.IsNullOrEmpty(StringsParamCode))
  193. {
  194. string[] RightCodes = StringsParamCode.Split('\n');
  195. foreach(string sub in RightCodes)
  196. {
  197. string subLine = sub;
  198. MatchCollection matches = Regex.Matches(subLine, "\\$\\{.*?\\}");
  199. foreach(Match match in matches)
  200. {
  201. string paramName = match.Value.Replace("${", "").Replace("}", "");
  202. if(paramDic.ContainsKey(paramName)) subLine = subLine.Replace(match.Value, paramDic[paramName]);
  203. }
  204. if(!StringsParamCodeList.Contains(subLine.Trim())) StringsParamCodeList += "\n" + subLine;
  205. }
  206. }
  207. //Style.xml参数配置
  208. if(!string.IsNullOrEmpty(StyleParamCode))
  209. {
  210. string[] RightCodes = StyleParamCode.Split('\n');
  211. foreach(string sub in RightCodes)
  212. {
  213. string subLine = sub;
  214. MatchCollection matches = Regex.Matches(subLine, "\\$\\{.*?\\}");
  215. foreach(Match match in matches)
  216. {
  217. string paramName = match.Value.Replace("${", "").Replace("}", "");
  218. if(paramDic.ContainsKey(paramName)) subLine = subLine.Replace(match.Value, paramDic[paramName]);
  219. }
  220. if(!StyleParamCodeList.Contains(subLine.Trim())) StyleParamCodeList += "\n" + subLine;
  221. }
  222. }
  223. //Manifets.xml参数配置
  224. if(!string.IsNullOrEmpty(ManifetsParamCode))
  225. {
  226. ManifetsParamCode = ManifetsParamCode.Replace("${package}", AppPackage).Replace("}", "");
  227. if(!ManifetsParamCodeList.Contains(ManifetsParamCode)) ManifetsParamCodeList += "\n" + ManifetsParamCode;
  228. }
  229. //引入库
  230. if(!string.IsNullOrEmpty(GradleImportCode))
  231. {
  232. string[] GradleImportCodes = GradleImportCode.Split('\n');
  233. foreach(string sub in GradleImportCodes)
  234. {
  235. if(!appGradleList.Contains(sub)) appGradleList += " " + sub + "\n";
  236. }
  237. }
  238. //主界面方法
  239. if(!webActivityFunctionList.Contains(PublicWebCode) && !string.IsNullOrEmpty(PublicWebCode)) webActivityFunctionList += " " + PublicWebCode.Replace("\n", " \n") + "\n";
  240. //内页面方法
  241. if(!mainActivityFunctionList.Contains(MainActivityCode) && !string.IsNullOrEmpty(MainActivityCode)) mainActivityFunctionList += " " + MainActivityCode.Replace("\n", " \n") + "\n";
  242. //主界面回调方法
  243. if(!mActivityFunctionList.Contains(MainCallBackCode) && !string.IsNullOrEmpty(MainCallBackCode)) mActivityFunctionList += " " + MainCallBackCode.Replace("\n", " \n") + "\n";
  244. //回调方法
  245. if(!publicActivityFunctionList.Contains(CallBackCode) && !string.IsNullOrEmpty(CallBackCode)) publicActivityFunctionList += " " + CallBackCode.Replace("\n", " \n") + "\n";
  246. //初始化变量
  247. if(!initActivityFunctionList.Contains(InitCode) && !string.IsNullOrEmpty(InitCode)) initActivityFunctionList += " " + InitCode.Replace("\n", " \n") + "\n";
  248. //全局变量
  249. if(!mainApplicationStaticList.Contains(MainApplicationStaticParam) && !string.IsNullOrEmpty(MainApplicationStaticParam)) mainApplicationStaticList += MainApplicationStaticParam.Replace("\n", " \n") + "\n";
  250. //启动页初始化方法
  251. if(!splashActivityFunctionList.Contains(StartPageMethodCode) && !string.IsNullOrEmpty(StartPageMethodCode)) splashActivityFunctionList += StartPageMethodCode.Replace("\n", " \n") + "\n";
  252. //启动页初始化代码
  253. if(!splashActivityCodeList.Contains(startPageInitCode) && !string.IsNullOrEmpty(startPageInitCode)) splashActivityCodeList += startPageInitCode.Replace("\n", " \n") + "\n";
  254. //import包
  255. if(!string.IsNullOrEmpty(FragmentImportCode))
  256. {
  257. string[] FragmentImportCodes = FragmentImportCode.Split('\n');
  258. foreach(string sub in FragmentImportCodes)
  259. {
  260. string checkString = sub.Replace("${package}", AppPackage);
  261. if(!fragmentImportList.Contains(checkString) && !mainActivityFunctionContent.Contains(checkString)) fragmentImportList += checkString + "\n";
  262. }
  263. }
  264. if(!string.IsNullOrEmpty(WebImportCode))
  265. {
  266. string[] WebImportCodes = WebImportCode.Split('\n');
  267. foreach(string sub in WebImportCodes)
  268. {
  269. string checkString = sub.Replace("${package}", AppPackage);
  270. if(!webImportList.Contains(checkString) && !webActivityFunctionContent.Contains(checkString)) webImportList += checkString + "\n";
  271. }
  272. }
  273. if(!string.IsNullOrEmpty(MainActivityImportCode))
  274. {
  275. string[] MainActivityImportCodes = MainActivityImportCode.Split('\n');
  276. foreach(string sub in MainActivityImportCodes)
  277. {
  278. string checkString = sub.Replace("${package}", AppPackage);
  279. if(!mainActivityImportList.Contains(checkString) && !mActivityFunctionContent.Contains(checkString)) mainActivityImportList += checkString + "\n";
  280. }
  281. }
  282. if(!string.IsNullOrEmpty(PublicWebActivityImportCode))
  283. {
  284. string[] PublicWebActivityImportCodes = PublicWebActivityImportCode.Split('\n');
  285. foreach(string sub in PublicWebActivityImportCodes)
  286. {
  287. string checkString = sub.Replace("${package}", AppPackage);
  288. if(!publicWebActivityImportList.Contains(checkString) && !publicActivityFunctionContent.Contains(checkString)) publicWebActivityImportList += checkString + "\n";
  289. }
  290. }
  291. if(!string.IsNullOrEmpty(MainApplicationImportCode))
  292. {
  293. string[] MainApplicationImportCodes = MainApplicationImportCode.Split('\n');
  294. foreach(string sub in MainApplicationImportCodes)
  295. {
  296. string checkString = sub.Replace("${package}", AppPackage);
  297. if(!mainApplicationImportList.Contains(checkString) && !initActivityFunctionContent.Contains(checkString)) mainApplicationImportList += checkString + "\n";
  298. }
  299. }
  300. }
  301. }
  302. MakeAppCodePub.ProcessSet(ver.id);
  303. //加入权限文件
  304. // if (!string.IsNullOrEmpty(androidMainFestList))
  305. // {
  306. // Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + "/AppModule/Android/Java/PermissionDescription.java", destinationDir.TrimEnd('/') + "/app/src/main/java/" + PackagePath + "/tool/PermissionDescription.java");
  307. // //替换文件内容
  308. // ReplaceFileContent(destinationDir.TrimEnd('/') + "/app/src/main/java/" + PackagePath + "/tool/PermissionDescription.java", "${PackageName}", AppPackage);
  309. // 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");
  310. // appGradleList += " //权限申请\n implementation 'com.github.getActivity:XXPermissions:20.0';\n";
  311. // }
  312. androidMainFestContent = androidMainFestContent.Replace("<!-- 权限列表 -->", androidMainFestList);
  313. androidMainFestContent = androidMainFestContent.Replace("<!-- 参数配置 -->", ManifetsParamCodeList);
  314. appGradleContent = appGradleContent.Replace("//APP引入库", appGradleList);
  315. appGradleContent = Regex.Replace(appGradleContent, "versionCode.*?\n", "versionCode " + VersionCode + "\n");
  316. appGradleContent = Regex.Replace(appGradleContent, "versionName \".*?\"\n", "versionName \"" + VersionName + "\"\n");
  317. mainActivityFunctionContent = mainActivityFunctionContent.Replace("/** 接口方法 */", mainActivityFunctionList);
  318. webActivityFunctionContent = webActivityFunctionContent.Replace("/** 接口方法 */", webActivityFunctionList);
  319. mActivityFunctionContent = mActivityFunctionContent.Replace("/** 回调方法 */", mActivityFunctionList);
  320. publicActivityFunctionContent = publicActivityFunctionContent.Replace("/** 回调方法 */", publicActivityFunctionList);
  321. initActivityFunctionContent = initActivityFunctionContent.Replace("/** 初始化变量 */", initActivityFunctionList);
  322. initActivityFunctionContent = initActivityFunctionContent.Replace("/** 全局变量 */", mainApplicationStaticList);
  323. mainActivityFunctionContent = mainActivityFunctionContent.Replace("//引用包", fragmentImportList);
  324. webActivityFunctionContent = webActivityFunctionContent.Replace("//引用包", webImportList);
  325. mActivityFunctionContent = mActivityFunctionContent.Replace("//引用包", mainActivityImportList);
  326. publicActivityFunctionContent = publicActivityFunctionContent.Replace("//引用包", publicWebActivityImportList);
  327. initActivityFunctionContent = initActivityFunctionContent.Replace("//引用包", mainApplicationImportList);
  328. baseInfo = baseInfo.Replace("<!-- 参数配置 -->", StringsParamCodeList);
  329. styleInfo = styleInfo.Replace("<!-- 样式配置 -->", StyleParamCodeList);
  330. Function.WritePageFullPath(androidMainPath, "AndroidManifest.xml", androidMainFestContent);
  331. Function.WritePageFullPath(androidMainPath + "res/values/", "strings.xml", baseInfo);
  332. Function.WritePageFullPath(androidMainPath + "res/values/", "styles.xml", styleInfo);
  333. Function.WritePageFullPath(appGradlePath, "build.gradle", appGradleContent);
  334. Function.WritePageFullPath(mainActivityPath, "WebFragmentFunction.java", mainActivityFunctionContent);
  335. Function.WritePageFullPath(webActivityPath, "WebFunction.java", webActivityFunctionContent);
  336. Function.WritePageFullPath(mActivityPath, "MainActivity.java", mActivityFunctionContent);
  337. Function.WritePageFullPath(publicActivityPath, "PublicWebActivity.java", publicActivityFunctionContent);
  338. Function.WritePageFullPath(initActivityPath, "MainApplication.java", initActivityFunctionContent);
  339. string toPath = androidMainPath + "assets/sources/";
  340. //底部导航图标下载
  341. foreach(var bottom in bottoms)
  342. {
  343. if(!string.IsNullOrEmpty(bottom.selectIcon))
  344. {
  345. Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + bottom.selectIcon, toPath + "static/bottom/" + bottom.selectIcon.Substring(bottom.selectIcon.LastIndexOf("/") + 1));
  346. }
  347. if(!string.IsNullOrEmpty(bottom.normalIcon))
  348. {
  349. Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + bottom.normalIcon, toPath + "static/bottom/" + bottom.normalIcon.Substring(bottom.normalIcon.LastIndexOf("/") + 1));
  350. }
  351. if(!string.IsNullOrEmpty(bottom.pagDefaultIcon))
  352. {
  353. Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + bottom.pagDefaultIcon, toPath + "static/bottom/" + bottom.pagDefaultIcon.Substring(bottom.pagDefaultIcon.LastIndexOf("/") + 1));
  354. }
  355. if(!string.IsNullOrEmpty(bottom.pagLocalPath))
  356. {
  357. Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + bottom.pagLocalPath, toPath + "static/bottom/" + bottom.pagLocalPath.Substring(bottom.pagLocalPath.LastIndexOf("/") + 1));
  358. }
  359. }
  360. MakeAppCodePub.ProcessSet(ver.id);
  361. //页面图标下载
  362. foreach(var page in pages)
  363. {
  364. if (page.leftBtn != null)
  365. {
  366. foreach (var btn in page.leftBtn)
  367. {
  368. if (!string.IsNullOrEmpty(btn.btnIcon))
  369. {
  370. Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + btn.btnIcon, toPath + "static/page/" + btn.btnIcon.Substring(btn.btnIcon.LastIndexOf("/") + 1));
  371. }
  372. }
  373. }
  374. if (page.rightBtn != null)
  375. {
  376. foreach (var btn in page.rightBtn)
  377. {
  378. if(!string.IsNullOrEmpty(btn.btnIcon))
  379. {
  380. Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + btn.btnIcon, toPath + "static/page/" + btn.btnIcon.Substring(btn.btnIcon.LastIndexOf("/") + 1));
  381. }
  382. }
  383. }
  384. }
  385. MakeAppCodePub.ProcessSet(ver.id);
  386. //解压static静态资源
  387. // string staticFilePath = Function.getPath(AppStatic);
  388. Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + AppStatic, toPath + "static.zip");
  389. ZipFile.ExtractToDirectory(toPath + "static.zip", toPath, true);
  390. File.Delete(toPath + "static.zip");
  391. //生成app加密的配置文件
  392. Dictionary<string, string> appFileDic = MakeAppCodePub.getAppFile(ver, pages, bottoms, toPath);
  393. if(appFileDic.ContainsKey("AppInfoList")) Function.WritePageFullPath(androidMainPath + "assets/", "AppInfoList.txt", appFileDic["AppInfoList"]);
  394. if(appFileDic.ContainsKey("SystemSet")) Function.WritePageFullPath(androidMainPath + "assets/", "SystemSet.txt", appFileDic["SystemSet"]);
  395. if(appFileDic.ContainsKey("PageInfoList")) Function.WritePageFullPath(androidMainPath + "assets/", "PageInfoList.txt", appFileDic["PageInfoList"]);
  396. if(appFileDic.ContainsKey("GotoPages")) Function.WritePageFullPath(androidMainPath + "assets/", "GotoPages.txt", appFileDic["GotoPages"]);
  397. if(appFileDic.ContainsKey("LibFile")) Function.WritePageFullPath(androidMainPath + "assets/", "LibFile.txt", appFileDic["LibFile"]);
  398. //删除html文件
  399. List<string> htmlFiles = FileHelper.GetSystemFilesFromFullPath(toPath);
  400. foreach(string file in htmlFiles)
  401. {
  402. if(file.EndsWith(".html")) {
  403. File.Delete(file);
  404. }
  405. }
  406. MakeAppCodePub.ProcessSet(ver.id);
  407. //解压icon图标
  408. //解压icon图标
  409. // string iconPath = Function.getPath(AppIcon);
  410. string toIconPath = androidMainPath + "res/";
  411. string savePath = toPath + AppIcon.Substring(AppIcon.LastIndexOf("/") + 1);
  412. Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + AppIcon, savePath);
  413. ZipFile.ExtractToDirectory(savePath, toIconPath, true);
  414. File.Delete(savePath);
  415. //解压启动图
  416. // string startBgPath = Function.getPath(AppStartBg);
  417. string toStartBgPath = androidMainPath + "res/";
  418. savePath = toPath + AppStartBg.Substring(AppStartBg.LastIndexOf("/") + 1);
  419. Function.DownloadNetFile(App.OptionsSetting.OssConfigs.Host + AppStartBg, savePath);
  420. ZipFile.ExtractToDirectory(savePath, toStartBgPath, true);
  421. File.Delete(savePath);
  422. //删除 icon 的 xml 文件
  423. File.Delete(toIconPath + "drawable/ic_launcher_background.xml");
  424. ZipFile.CreateFromDirectory(Function.getPath("androidcode/" + project.id + "/"), Function.getPath("androidcode/" + fileName));
  425. OssHelper.Instance.Upload(Function.getPath("androidcode/" + fileName));
  426. File.Delete(Function.getPath("androidcode/" + fileName));
  427. Directory.Delete(Function.getPath("androidcode/" + project.id + "/"), true);
  428. MakeAppCodePub.ProcessSet(ver.id);
  429. }
  430. public static void CopyFolder(string sourceDir, string destinationDir, bool move = false)
  431. {
  432. // 如果目标文件夹不存在,则创建
  433. if (!Directory.Exists(destinationDir))
  434. {
  435. Directory.CreateDirectory(destinationDir);
  436. }
  437. // 获取源文件夹中的所有文件并复制到目标文件夹
  438. foreach (string file in Directory.GetFiles(sourceDir, "*.*", SearchOption.AllDirectories))
  439. {
  440. string destFile = file.Replace(sourceDir, destinationDir);
  441. string destDir = Path.GetDirectoryName(destFile);
  442. // 如果目标文件夹不存在,则创建
  443. if (!Directory.Exists(destDir))
  444. {
  445. Directory.CreateDirectory(destDir);
  446. }
  447. if(move)
  448. {
  449. File.Move(file, destFile, true); // 如果目标文件已存在,则覆盖
  450. }
  451. else
  452. {
  453. File.Copy(file, destFile, true); // 如果目标文件已存在,则覆盖
  454. }
  455. }
  456. // 获取源文件夹中的所有子文件夹并递归复制
  457. foreach (string dir in Directory.GetDirectories(sourceDir, "*.*", SearchOption.AllDirectories))
  458. {
  459. string destDir = dir.Replace(sourceDir, destinationDir);
  460. if (!Directory.Exists(destDir))
  461. {
  462. Directory.CreateDirectory(destDir);
  463. }
  464. }
  465. }
  466. #endregion
  467. #region 替换包名
  468. public static void ReplaceAppPackage(string destinationDir, string AppPackage)
  469. {
  470. string[] paths = new string[] { "main", "androidTest", "test"};
  471. foreach(string path in paths)
  472. {
  473. string fromPath = destinationDir + "app/src/" + path + "/java/com/omega/omegamainbase/";
  474. string toPath = destinationDir + "app/src/" + path + "/java/" + AppPackage.Replace(".", "/") + "/";
  475. CopyFolder(fromPath, toPath, true);
  476. if (Directory.Exists(destinationDir + "app/src/" + path + "/java/com/omega/"))
  477. {
  478. Directory.Delete(destinationDir + "app/src/" + path + "/java/com/omega/", true);
  479. }
  480. string[] fileList = Directory.GetFiles(destinationDir, "*.*", SearchOption.AllDirectories);
  481. foreach (string file in fileList)
  482. {
  483. bool op = true;
  484. if((file.Contains(".gradle/") && !file.EndsWith(".gradle")) || file.Contains(".idea/"))
  485. {
  486. op = false;
  487. }
  488. if(!file.EndsWith(".java") && !file.EndsWith(".xml") && !file.EndsWith(".gradle"))
  489. {
  490. op = false;
  491. }
  492. if(op)
  493. {
  494. string content = Function.ReadInstanceByFull(file);
  495. content = content.Replace("com.omega.omegamainbase", AppPackage);
  496. content = content.Replace("${PackageName}", AppPackage);
  497. Function.WritePageFullPath(file.Substring(0, file.LastIndexOf("/")), file.Substring(file.LastIndexOf("/")), content);
  498. }
  499. }
  500. }
  501. }
  502. public static string ReplaceFileContent(string filePath, string oldStr, string newStr)
  503. {
  504. string content = Function.ReadInstanceByFull(filePath);
  505. content = content.Replace(oldStr, newStr);
  506. Function.WritePageFullPath(filePath.Substring(0, filePath.LastIndexOf("/")), filePath.Substring(filePath.LastIndexOf("/")), content);
  507. return content;
  508. }
  509. public static string ReplaceFileContent(string filePath, Dictionary<string, string> replaceDict)
  510. {
  511. string content = Function.ReadInstanceByFull(filePath);
  512. foreach(var item in replaceDict)
  513. {
  514. content = content.Replace(item.Key, item.Value);
  515. }
  516. Function.WritePageFullPath(filePath.Substring(0, filePath.LastIndexOf("/")), filePath.Substring(filePath.LastIndexOf("/")), content);
  517. return content;
  518. }
  519. #endregion
  520. }
  521. }