-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Description
2025-12-18 12:03:08.170 28888-28888 AndroidRuntime com.example.shadow E FATAL EXCEPTION: main
Process: com.example.shadow:plugin, PID: 28888
java.lang.IllegalArgumentException: Unknown URI: content://com.example.shadow.contentprovider.authority.dynamic/com.example.shadow.provider.CustomContentProvider/downloads
com.example.shadow.contentprovider.authority.dynamic是宿主定义的坑位Provider authority
<provider
android:authorities="${applicationId}.contentprovider.authority.dynamic"
android:name="com.tencent.shadow.core.runtime.container.PluginContainerContentProvider"
android:grantUriPermissions="true"
android:process=":plugin" />
com.example.shadow.provider.CustomContentProvider是插件的authority
<provider
android:name="com.example.shadow.provider.CustomContentProvider"
android:authorities="${applicationId}.provider.CustomContentProvider"
android:enabled="true"
android:exported="false"/>
貌似被拼接一起了
崩溃发生在下面第一句:
cursor = DownloadProvider.getInstance(context).query(DownloadConstants.Database.CONTENT_URI,
null, selection, null, sortOrder);
if (cursor != null) {
while (cursor.moveToNext()) {
try {
InnerDownloadInfo info = readFromDatabase(cursor);
downloadInfos.add(info);
} catch (Exception e) {
e.printStackTrace();
}
}
}
query的实现,uri 打印出来是:content://com.example.shadow.contentprovider.authority.dynamic/com.example.shadow.provider.CustomContentProvider/downloads
所以match == -1 崩溃
public Cursor query(Uri uri, String[] projection, String where,
String[] whereArgs, String sortOrder) {
SQLiteDatabase db = databaseHelper.getReadableDatabase();
int match = uriMatcher.match(uri);
if (match == -1) {
throw new IllegalArgumentException("Unknown URI: " + uri);
}
CONTENT_URI的定义:
DownloadConstants.Database.CONTENT_URI=Uri.parse("content://" + AUTHORITY
+ "/" + DOWNLOAD_TABLE);
public static final String AUTHORITY = BuildConfig.APPLICATION_ID + ".provider.CustomContentProvider";
直接看下面的测试:
我在shadow 的demo 打印了下日志进行测试,发现也是会自动添加com.tencent.shadow.sample.host.contentprovider.authority.dynamic,这个是符合预期的吗?
如果符合预期,那么原本插件的逻辑用到Uri.parse的地方就可能发生上述不匹配的问题
插件原来的逻辑
uriMatcher.addURI(BuildConfig.APPLICATION_ID + ".provider.CustomContentProvider",
"downloads", 1);
uriMather.match(uri)// 带有 com.tencent.shadow.sample.host.contentprovider.authority.dynamic 的uri 不匹配
而且如果插件APP本身依赖的三方SDK 如果也有类似情况的话,也会有问题?