Skip to content

Commit 36c883c

Browse files
committed
修复读取到的清单文件不是当前应用的问题
1 parent 02e6f3d commit 36c883c

File tree

6 files changed

+55
-11
lines changed

6 files changed

+55
-11
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ android {
2626
2727
dependencies {
2828
// 权限请求框架:https://github.com/getActivity/XXPermissions
29-
implementation 'com.hjq:xxpermissions:10.0'
29+
implementation 'com.hjq:xxpermissions:10.2'
3030
}
3131
```
3232

@@ -134,8 +134,8 @@ public class XxxActivity extends AppCompatActivity {
134134

135135
| 功能及细节 | [XXPermissions](https://github.com/getActivity/XXPermissions) | [AndPermission](https://github.com/yanzhenjie/AndPermission) | [RxPermissions](https://github.com/tbruyelle/RxPermissions) | [PermissionsDispatcher](https://github.com/permissions-dispatcher/PermissionsDispatcher) | [EasyPermissions](https://github.com/googlesamples/easypermissions) | [PermissionX](https://github.com/guolindev/PermissionX) | [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) |
136136
| :--------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: |
137-
| 对应版本 | 10.0 | 2.0.3 | 0.12 | 4.8.0 | 3.0.0 | 1.4.0 | 1.30.5 |
138-
| 框架体积 | [24 KB](https://bintray.com/getactivity/maven/xxpermissions#files/com/hjq/xxpermissions) | [127 KB](https://mvnrepository.com/artifact/com.yanzhenjie/permission) | [28 KB](https://jitpack.io/#com.github.tbruyelle/rxpermissions) | [91 KB](https://bintray.com/hotchemi/org.permissionsdispatcher/permissionsdispatcher-processor#files/org/permissionsdispatcher/permissionsdispatcher-processor) | [48 KB](https://bintray.com/easygoogle/EasyPermissions/easypermissions#files/pub/devrel/easypermissions) | [32 KB](https://bintray.com/guolindev/maven/permissionx#files/com/permissionx/guolindev/permissionx) | [483 KB](https://bintray.com/blankj/maven/UtilCode#files/com/blankj/utilcode) |
137+
| 对应版本 | 10.2 | 2.0.3 | 0.12 | 4.8.0 | 3.0.0 | 1.4.0 | 1.30.5 |
138+
| 框架体积 | [25 KB](https://bintray.com/getactivity/maven/xxpermissions#files/com/hjq/xxpermissions) | [127 KB](https://mvnrepository.com/artifact/com.yanzhenjie/permission) | [28 KB](https://jitpack.io/#com.github.tbruyelle/rxpermissions) | [91 KB](https://bintray.com/hotchemi/org.permissionsdispatcher/permissionsdispatcher-processor#files/org/permissionsdispatcher/permissionsdispatcher-processor) | [48 KB](https://bintray.com/easygoogle/EasyPermissions/easypermissions#files/pub/devrel/easypermissions) | [32 KB](https://bintray.com/guolindev/maven/permissionx#files/com/permissionx/guolindev/permissionx) | [483 KB](https://bintray.com/blankj/maven/UtilCode#files/com/blankj/utilcode) |
139139
| 安装包权限 ||||||||
140140
| 悬浮窗权限 ||||||||
141141
| 通知栏权限 ||||||||

XXPermissions.apk

-317 KB
Binary file not shown.

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ android {
77
applicationId "com.hjq.permissions.demo"
88
minSdkVersion 14
99
targetSdkVersion 30
10-
versionCode 1000
11-
versionName "10.0"
10+
versionCode 1020
11+
versionName "10.2"
1212
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1313
}
1414

library/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ android {
66

77
defaultConfig {
88
minSdkVersion 11
9-
versionCode 1000
10-
versionName "10.0"
9+
versionCode 1020
10+
versionName "10.2"
1111
}
1212

1313
// 使用 JDK 1.8
@@ -30,7 +30,7 @@ publish {
3030
userOrg = 'getactivity'
3131
groupId = 'com.hjq'
3232
artifactId = 'xxpermissions'
33-
publishVersion = '10.0'
33+
publishVersion = '10.2'
3434
desc = 'Android 6.0 permissions adaptation framework'
3535
website = "https://github.com/getActivity/XXPermissions"
3636
}

library/src/main/java/com/hjq/permissions/PermissionChecker.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,20 @@ static void checkStoragePermission(Context context, List<String> requestPermissi
108108
return;
109109
}
110110

111+
int cookie = PermissionUtils.findApkCookie(context);
112+
if (cookie == -1) {
113+
return;
114+
}
115+
111116
try {
112-
XmlResourceParser parser = context.getAssets().openXmlResourceParser("AndroidManifest.xml");
117+
XmlResourceParser parser = context.getAssets().openXmlResourceParser(cookie, "AndroidManifest.xml");
113118
// 是否读取到文件尾
114119
while (parser.getEventType() != XmlResourceParser.END_DOCUMENT) {
115120
// 当前节点是否为标签头部
116121
if (parser.getEventType() == XmlResourceParser.START_TAG) {
117122
// 获取标签名称
118-
String tagName = parser.getName();
119-
if ("application".equals(tagName)) {
123+
String nodeName = parser.getName();
124+
if ("application".equals(nodeName)) {
120125
String namespace = "http://schemas.android.com/apk/res/android";
121126
int targetSdkVersion = context.getApplicationInfo().targetSdkVersion;
122127

library/src/main/java/com/hjq/permissions/PermissionUtils.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.hjq.permissions;
22

3+
import android.annotation.SuppressLint;
34
import android.app.Activity;
45
import android.app.AppOpsManager;
56
import android.app.NotificationManager;
67
import android.content.Context;
78
import android.content.ContextWrapper;
89
import android.content.pm.PackageManager;
10+
import android.content.res.AssetManager;
911
import android.os.Build;
1012
import android.os.Environment;
1113
import android.provider.Settings;
@@ -436,4 +438,41 @@ static FragmentActivity findFragmentActivity(Context context) {
436438
} while (context != null);
437439
return null;
438440
}
441+
442+
/**
443+
* 获取当前应用 Apk 在 AssetManager 中的 Cookie
444+
*/
445+
@SuppressWarnings("JavaReflectionMemberAccess")
446+
@SuppressLint("PrivateApi")
447+
static int findApkCookie(Context context) {
448+
AssetManager assets = context.getAssets();
449+
String path = context.getApplicationInfo().sourceDir;
450+
int cookie = -1;
451+
try {
452+
try {
453+
// 为什么不直接通过反射 AssetManager.findCookieForPath 方法来判断?因为这个 API 属于反射黑名单,反射执行不了
454+
Method method = assets.getClass().getDeclaredMethod("addOverlayPath", String.class);
455+
cookie = (int) method.invoke(assets, path);
456+
} catch (Exception e) {
457+
// NoSuchMethodException
458+
// IllegalAccessException
459+
// InvocationTargetException
460+
e.printStackTrace();
461+
Method method = assets.getClass().getDeclaredMethod("getApkPaths");
462+
String[] apkPaths = (String[]) method.invoke(assets);
463+
for (int i = 0; i < apkPaths.length; i++) {
464+
if (apkPaths[i].equals(path)) {
465+
cookie = i + 1;
466+
break;
467+
}
468+
}
469+
}
470+
} catch (Exception e) {
471+
// NoSuchMethodException
472+
// IllegalAccessException
473+
// InvocationTargetException
474+
e.printStackTrace();
475+
}
476+
return cookie;
477+
}
439478
}

0 commit comments

Comments
 (0)