Skip to content

Commit aabfac6

Browse files
committed
1、适配android13:getPackageInfo flags int -> long
2、读取meta-data时数据类型转换错误
1 parent 770356b commit aabfac6

File tree

4 files changed

+46
-14
lines changed

4 files changed

+46
-14
lines changed

FairyPlugin/src/main/java/com/limpoxe/fairy/content/PluginDescriptor.java

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.content.Context;
55
import android.content.Intent;
66
import android.content.pm.PackageInfo;
7+
import android.content.pm.PackageManager;
78
import android.content.res.Resources;
89
import android.os.Bundle;
910

@@ -75,7 +76,7 @@ public class PluginDescriptor implements Serializable {
7576

7677
private transient Bundle metaData;
7778

78-
private HashMap<String, String> metaDataString = new HashMap<String, String>();
79+
private HashMap<String, Object> metaDataObject = new HashMap<String, Object>();
7980
private HashMap<String, Integer> metaDataResource = new HashMap<String, Integer>();
8081
private HashMap<String, String> metaDataTobeInflate = new HashMap<String, String>();
8182

@@ -134,7 +135,7 @@ public class PluginDescriptor implements Serializable {
134135

135136
private ArrayList<String> muliDexList;
136137

137-
private transient HashMap<Integer, PackageInfo> packageInfoHashMap;
138+
private transient HashMap<Object, PackageInfo> packageInfoHashMap;
138139

139140
//=============getter and setter======================
140141

@@ -256,11 +257,20 @@ public static void inflateMetaData(PluginDescriptor descriptor, Resources plugin
256257
//todo cailiming bugfix metadata需要按manifest中的节点分开存储,不能合并成一个大bundle
257258
descriptor.setMetaData(metaData);
258259

259-
Iterator<Map.Entry<String, String>> strItr = descriptor.getMetaDataString().entrySet().iterator();
260+
Iterator<String> strItr = descriptor.getMetaDataObject().keySet().iterator();
260261
while(strItr.hasNext()) {
261-
Map.Entry<String, String> entry = strItr.next();
262-
LogUtil.d(entry.getKey(), entry.getValue());
263-
metaData.putString(entry.getKey(), entry.getValue());
262+
String key = strItr.next();
263+
Object value = descriptor.getMetaDataObject().get(key);
264+
LogUtil.d(key, value);
265+
if (value instanceof Boolean) {
266+
metaData.putBoolean(key, (Boolean) value);
267+
} else if (value instanceof Float) {
268+
metaData.putFloat(key, (Float) value);
269+
} else if (value instanceof Integer) {
270+
metaData.putInt(key, (Integer) value);
271+
} else if (value instanceof String) {
272+
metaData.putString(key, (String) value);
273+
}
264274
}
265275

266276
Iterator<Map.Entry<String, Integer>> resItr = descriptor.getMetaDataResource().entrySet().iterator();
@@ -327,12 +337,12 @@ public void setMetaData(Bundle metaData) {
327337
this.metaData = metaData;
328338
}
329339

330-
public HashMap<String, String> getMetaDataString() {
331-
return metaDataString;
340+
public HashMap<String, Object> getMetaDataObject() {
341+
return metaDataObject;
332342
}
333343

334-
public void setMetaDataString(HashMap<String, String> metaDataString) {
335-
this.metaDataString = metaDataString;
344+
public void setMetaDataObject(HashMap<String, Object> metaDataObj) {
345+
this.metaDataObject = metaDataObj;
336346
}
337347

338348
public HashMap<String, Integer> getMetaDataResource() {
@@ -710,13 +720,17 @@ private static ArrayList<String> findClassNameByIntent(Intent intent, HashMap<St
710720
return null;
711721
}
712722

713-
public PackageInfo getPackageInfo(Integer flags) {
723+
public PackageInfo getPackageInfo(Object flags) {
714724
if (packageInfoHashMap == null) {
715725
packageInfoHashMap = new HashMap<>();
716726
}
717727
PackageInfo packageInfo = packageInfoHashMap.get(flags);
718728
if (packageInfo == null) {
719-
packageInfo = FairyGlobal.getHostApplication().getPackageManager().getPackageArchiveInfo(getInstalledPath(), flags);
729+
if (flags instanceof Integer) {
730+
packageInfo = FairyGlobal.getHostApplication().getPackageManager().getPackageArchiveInfo(getInstalledPath(), (int)flags);
731+
} else {
732+
packageInfo = FairyGlobal.getHostApplication().getPackageManager().getPackageArchiveInfo(getInstalledPath(), PackageManager.PackageInfoFlags.of((long)flags));
733+
}
720734
if (packageInfo != null && packageInfo.applicationInfo != null) {
721735
packageInfo.applicationInfo.sourceDir = getInstalledPath();
722736
packageInfo.applicationInfo.publicSourceDir = getInstalledPath();

FairyPlugin/src/main/java/com/limpoxe/fairy/core/proxy/systemservice/AndroidAppIPackageManager.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public Object beforeInvoke(Object target, Method method, Object[] args) {
9797
if (!packageName.equals(FairyGlobal.getHostApplication().getPackageName())) {
9898
PluginDescriptor pluginDescriptor = PluginManagerHelper.getPluginDescriptorByPluginId(packageName);
9999
if (pluginDescriptor != null) {
100-
PackageInfo packageInfo = pluginDescriptor.getPackageInfo((int) args[1]);
100+
PackageInfo packageInfo = pluginDescriptor.getPackageInfo(args[1]);
101101
return packageInfo;
102102
}
103103
}
@@ -398,13 +398,15 @@ public Object beforeInvoke(Object target, Method method, Object[] args) {
398398
providerInfo.name = info.getName();
399399
providerInfo.packageName = getPackageName(pluginDescriptor);
400400
providerInfo.icon = pluginDescriptor.getApplicationIcon();
401+
//todo
401402
providerInfo.metaData = pluginDescriptor.getMetaData();
402403
providerInfo.enabled = true;
403404
providerInfo.exported = info.isExported();
404405
providerInfo.applicationInfo = getApplicationInfo(pluginDescriptor);
405406
providerInfo.authority = info.getAuthority();
406407
return providerInfo;
407408
}
409+
LogUtil.d("null authorities", args[0]);
408410
return null;
409411
}
410412
}

FairyPlugin/src/main/java/com/limpoxe/fairy/manager/PluginManifestParser.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,22 @@ public static PluginDescriptor parseManifest(String pluginPath) {
146146
//等插件初始化的时候再处理这类meta信息
147147
desciptor.getMetaDataTobeInflate().put(name, ResourceUtil.covent2Hex(value));
148148
} else if (value != null) {
149-
desciptor.getMetaDataString().put(name, ResourceUtil.covent2Hex(value));
149+
//meta-data支持的数据类型:Boolean、Float、Integer、String
150+
if ("true".equals(value) || "false".equals(value)) {
151+
desciptor.getMetaDataObject().put(name, Boolean.parseBoolean(value));
152+
} else if (value.contains(".")) {
153+
try {
154+
desciptor.getMetaDataObject().put(name, Float.parseFloat(value));
155+
} catch (Exception e) {
156+
desciptor.getMetaDataObject().put(name, ResourceUtil.covent2Hex(value));
157+
}
158+
} else {
159+
try {
160+
desciptor.getMetaDataObject().put(name, Integer.parseInt(value));
161+
} catch (Exception e) {
162+
desciptor.getMetaDataObject().put(name, ResourceUtil.covent2Hex(value));
163+
}
164+
}
150165
} else if (resource != null && resource.startsWith("@")) {
151166
desciptor.getMetaDataResource().put(name, ResourceUtil.parseResId(ResourceUtil.covent2Hex(resource)));
152167
}

FairyPlugin/src/main/java/com/limpoxe/fairy/util/FileUtil.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ public static boolean copySo2(File sourceDir, String soName, String dest, ArrayL
9898
LogUtil.d("try supported abi:", abi);
9999
File sourceSoFile = new File(sourceDir, "lib" + File.separator + abi + File.separator + soName);
100100
if (sourceSoFile.exists()) {
101+
LogUtil.d("安装 " + sourceSoFile + " 到 " + dest + File.separator + soName);
101102
isSuccess = copyFile(sourceSoFile.getAbsolutePath(), dest + File.separator + soName);
102103
break;
103104
}

0 commit comments

Comments
 (0)