Skip to content

Commit 3742d70

Browse files
author
EastWood Yang
committed
using manifest-merger
1 parent ebc2e0b commit 3742d70

File tree

3 files changed

+114
-106
lines changed

3 files changed

+114
-106
lines changed

app/build.gradle

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
apply plugin: 'com.android.application'
22

33
//apply from: '../micro.gradle'
4-
apply from: '../micro_reference.gradle'
4+
apply from: '../micro_reference.gradle'
55

66
android {
77
compileSdkVersion 25
@@ -19,8 +19,4 @@ android {
1919
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
2020
}
2121
}
22-
}
23-
24-
dependencies {
25-
2622
}

micro.gradle

Lines changed: 55 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
import com.android.manifmerger.ManifestMerger2
2+
import com.android.manifmerger.MergingReport
3+
import com.android.manifmerger.XmlDocument
4+
import com.android.utils.ILogger
5+
6+
buildscript {
7+
repositories {
8+
jcenter()
9+
}
10+
dependencies {
11+
classpath "com.android.tools.build:manifest-merger:25.3.0"
12+
}
13+
}
14+
115
def aidlSrcDirs = []
216
def assetsSrcDirs = []
317
def javaSrcDirs = []
@@ -6,31 +20,29 @@ def jniLibsSrcDirs = []
620
def manifestSrcFiles = []
721
def resSrcDirs = []
822

9-
def mainMicroAndroidManifestFile;
23+
def logger = new ILogger() {
24+
@Override
25+
void error(Throwable t, String msgFormat, Object... args) {
1026

11-
def filterManifest = { manifest ->
12-
13-
def from = manifest.indexOf("<application>") + "<application>".length()
14-
def end = manifest.indexOf("</application>")
15-
def body = manifest.substring(from, end).trim();
16-
if (body == "") return ""
17-
18-
def packageNamePattern = 'package=\".*\"'
19-
def packageNameMatcher = manifest.substring(0, from) =~ packageNamePattern
20-
packageNameMatcher.matches()
21-
def packageName = packageNameMatcher[0].substring(packageNameMatcher[0].indexOf("\"") + 1, packageNameMatcher[0].length() - 1)
22-
23-
def namePattern = 'android:name=\".*\"'
24-
def nameMatcher = body =~ namePattern
25-
nameMatcher.matches()
26-
nameMatcher.each {
27-
def name = it.substring(it.indexOf("\"") + 1, it.length() - 1);
28-
if (name[0] == ".") {
29-
body = body.replaceAll("\"" + name + "\"", "\"" + packageName + name + "\"")
30-
}
3127
}
32-
return body
33-
}
28+
29+
@Override
30+
void warning(String msgFormat, Object... args) {
31+
32+
}
33+
34+
@Override
35+
void info(String msgFormat, Object... args) {
36+
37+
}
38+
39+
@Override
40+
void verbose(String msgFormat, Object... args) {
41+
42+
}
43+
};
44+
45+
def mainMicroAndroidManifestFile;
3446

3547
def microModuleHandler = { ->
3648

@@ -45,7 +57,7 @@ def microModuleHandler = { ->
4557
if (!microModuleDir.isDirectory()) return
4658

4759
// check [micro.properties] exists or not
48-
File microModulePropertiesFile = new File(microModuleDir.absolutePath + '/micro.properties');
60+
File microModulePropertiesFile = new File(microModuleDir.absolutePath + '\\micro.properties');
4961
if (!microModulePropertiesFile.exists()) return
5062

5163
// read library properties
@@ -61,7 +73,7 @@ def microModuleHandler = { ->
6173
// add aidl.srcDir
6274
def aidlSrcDir = microModuleProperties.getProperty('aidl.srcDir')
6375
if (aidlSrcDir.size() == 0) {
64-
aidlSrcDir = microModuleName + "/src/main/aidl";
76+
aidlSrcDir = microModuleName + "\\src\\main\\aidl";
6577
}
6678
aidlSrcDir = aidlSrcDir.toString()
6779
if (!aidlSrcDirs.contains(aidlSrcDir)) {
@@ -71,7 +83,7 @@ def microModuleHandler = { ->
7183
// add assets.srcDir
7284
def assetsSrcDir = microModuleProperties.getProperty('assets.srcDir')
7385
if (assetsSrcDir.size() == 0) {
74-
assetsSrcDir = microModuleName + "/src/main/assets";
86+
assetsSrcDir = microModuleName + "\\src\\main\\assets";
7587
}
7688
assetsSrcDir = assetsSrcDir.toString()
7789
if (!assetsSrcDirs.contains(assetsSrcDir)) {
@@ -81,7 +93,7 @@ def microModuleHandler = { ->
8193
// add jni.srcDir
8294
def jniSrcDir = microModuleProperties.getProperty('jni.srcDir')
8395
if (jniSrcDir.size() == 0) {
84-
jniSrcDir = microModuleName + "/src/main/jni";
96+
jniSrcDir = microModuleName + "\\src\\main\\jni";
8597
}
8698
jniSrcDir = jniSrcDir.toString()
8799
if (!jniSrcDirs.contains(jniSrcDir)) {
@@ -91,7 +103,7 @@ def microModuleHandler = { ->
91103
// add jniLibs.srcDir
92104
def jniLibsSrcDir = microModuleProperties.getProperty('jniLibs.srcDir')
93105
if (jniLibsSrcDir.size() == 0) {
94-
jniLibsSrcDir = microModuleName + "/src/main/jniLibs";
106+
jniLibsSrcDir = microModuleName + "\\src\\main\\jniLibs";
95107
}
96108
jniLibsSrcDir = jniLibsSrcDir.toString()
97109
if (!jniLibsSrcDirs.contains(jniLibsSrcDir)) {
@@ -101,7 +113,7 @@ def microModuleHandler = { ->
101113
// add java.srcDir
102114
def javaSrcDir = microModuleProperties.getProperty('java.srcDir')
103115
if (javaSrcDir.size() == 0) {
104-
javaSrcDir = microModuleName + "/src/main/java";
116+
javaSrcDir = microModuleName + "\\src\\main\\java";
105117
}
106118
javaSrcDir = javaSrcDir.toString()
107119
if (!javaSrcDirs.contains(javaSrcDir)) {
@@ -111,7 +123,7 @@ def microModuleHandler = { ->
111123
// add res.srcDir
112124
def resSrcDir = microModuleProperties.getProperty('res.srcDir')
113125
if (resSrcDir.size() == 0) {
114-
resSrcDir = microModuleName + "/src/main/res";
126+
resSrcDir = microModuleName + "\\src\\main\\res";
115127
}
116128
resSrcDir = resSrcDir.toString()
117129
if (!resSrcDirs.contains(resSrcDir)) {
@@ -121,7 +133,7 @@ def microModuleHandler = { ->
121133
// add manifest.srcFile
122134
def manifestSrcFile = microModuleProperties.getProperty('manifest.srcFile')
123135
if (manifestSrcFile.size() == 0) {
124-
manifestSrcFile = microModuleName + "/src/AndroidManifest.xml";
136+
manifestSrcFile = microModuleName + "\\src\\AndroidManifest.xml";
125137
}
126138
manifestSrcFile = manifestSrcFile.toString()
127139
if (microModuleName == 'main') {
@@ -132,25 +144,19 @@ def microModuleHandler = { ->
132144

133145
}
134146

135-
def microModuleManifest = ''
147+
File mainManifestFile = new File("$projectDir\\" + mainMicroAndroidManifestFile);
148+
149+
ManifestMerger2.MergeType mergeType = ManifestMerger2.MergeType.APPLICATION
150+
XmlDocument.Type documentType = XmlDocument.Type.MAIN;
151+
ManifestMerger2.Invoker invoker = new ManifestMerger2.Invoker(mainManifestFile, logger, mergeType, documentType);
136152
for (int i = 0; i < manifestSrcFiles.size(); i++) {
137-
def srcFilePath = manifestSrcFiles[i].toString()
138-
def name = srcFilePath.subSequence(0, srcFilePath.indexOf("/"))
139-
File manifestFile = new File("$projectDir" + "/" + srcFilePath)
140-
if (!manifestFile.exists()) continue
141-
def body = filterManifest(manifestFile.getText())
142-
if (body == "") continue
143-
microModuleManifest += " <!-- MICRO MODULE START: " + name + " -->\n " + body + "\n <!-- MICRO MODULE END: " + name + " -->\n\n";
153+
File microManifestFile = new File("$projectDir\\" + manifestSrcFiles[i]);
154+
if (microManifestFile.exists()) {
155+
invoker.addLibraryManifest(microManifestFile)
156+
}
144157
}
145-
146-
def mainMicroAndroidManifest = file(mainMicroAndroidManifestFile).getText().toString().trim()
147-
def applicationPattern = '</\\s{0,}application\\s{0,}>'
148-
def applicationMatcher = mainMicroAndroidManifest =~ applicationPattern
149-
applicationMatcher.matches()
150-
def from = mainMicroAndroidManifest.indexOf(applicationMatcher[0])
151-
def moduleAndroidManifest = mainMicroAndroidManifest.substring(0, from).toString().trim() + "\n\n"
152-
moduleAndroidManifest += microModuleManifest
153-
moduleAndroidManifest += " " + mainMicroAndroidManifest.substring(from, mainMicroAndroidManifest.length()).toString().trim()
158+
def mergingReport = invoker.merge()
159+
def moduleAndroidManifest = mergingReport.getMergedDocument(MergingReport.MergedManifestKind.MERGED)
154160

155161
new File("$buildDir").mkdirs()
156162
def file = new File("$buildDir\\AndroidManifest.xml")
@@ -163,7 +169,7 @@ def microModuleHandler = { ->
163169
android.sourceSets.main.jni.srcDirs = jniSrcDirs
164170
android.sourceSets.main.jniLibs.srcDirs = jniLibsSrcDirs
165171
android.sourceSets.main.res.srcDirs = resSrcDirs
166-
android.sourceSets.main.manifest.srcFile "$buildDir/AndroidManifest.xml"
172+
android.sourceSets.main.manifest.srcFile "$buildDir\\AndroidManifest.xml"
167173
}
168174

169175
task microModuleTask {

0 commit comments

Comments
 (0)