Skip to content

Commit 820d3b7

Browse files
committed
Fix signingInfo above Android Pie
Signed-off-by: tiann <twsxtd@gmail.com>
1 parent 41c3511 commit 820d3b7

4 files changed

Lines changed: 53 additions & 10 deletions

File tree

VirtualApp/lib/src/main/java/com/lody/virtual/helper/compat/BuildCompat.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,27 @@ public static int getPreviewSDKInt() {
2020
}
2121

2222
public static boolean isOreo() {
23+
return isAndroidLevel(Build.VERSION_CODES.O);
24+
}
2325

24-
return (Build.VERSION.SDK_INT == 25 && getPreviewSDKInt() > 0)
25-
|| Build.VERSION.SDK_INT > 25;
26+
public static boolean isPie() {
27+
return isAndroidLevel(Build.VERSION_CODES.P);
2628
}
2729

2830
public static boolean isQ() {
29-
final int SDK = Build.VERSION.SDK_INT;
30-
final int Q = 29;
31-
return SDK == Q - 1 && getPreviewSDKInt() > 0 || Build.VERSION.SDK_INT >= Q;
31+
return isAndroidLevel(29);
3232
}
3333

3434
public static boolean isR() {
35-
return Build.VERSION.SDK_INT >= 30;
35+
return isAndroidLevel(30);
36+
}
37+
38+
private static boolean isAndroidLevelPreview(int level) {
39+
return (Build.VERSION.SDK_INT == level && getPreviewSDKInt() > 0)
40+
|| Build.VERSION.SDK_INT > level;
3641
}
3742

43+
private static boolean isAndroidLevel(int level) {
44+
return Build.VERSION.SDK_INT >= level;
45+
}
3846
}

VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@
1414
import android.content.pm.ServiceInfo;
1515
import android.content.pm.Signature;
1616
import android.os.Build;
17+
import android.os.Bundle;
1718
import android.os.Parcel;
1819
import android.text.TextUtils;
1920

2021
import com.lody.virtual.client.core.VirtualCore;
2122
import com.lody.virtual.client.env.Constants;
2223
import com.lody.virtual.client.fixer.ComponentFixer;
2324
import com.lody.virtual.helper.collection.ArrayMap;
25+
import com.lody.virtual.helper.compat.BuildCompat;
2426
import com.lody.virtual.helper.compat.PackageParserCompat;
2527
import com.lody.virtual.helper.utils.FileUtils;
2628
import com.lody.virtual.helper.utils.VLog;
@@ -121,6 +123,9 @@ public static void readSignature(VPackage pkg) {
121123
p.unmarshall(bytes, 0, bytes.length);
122124
p.setDataPosition(0);
123125
pkg.mSignatures = p.createTypedArray(Signature.CREATOR);
126+
if (BuildCompat.isPie()) {
127+
pkg.signingInfo = p.readParcelable(Bundle.class.getClassLoader());
128+
}
124129
} catch (IOException e) {
125130
e.printStackTrace();
126131
} finally {
@@ -151,6 +156,9 @@ public static void savePackageCache(VPackage pkg) {
151156
p = Parcel.obtain();
152157
try {
153158
p.writeTypedArray(signatures, 0);
159+
if (BuildCompat.isPie()) {
160+
p.writeParcelable(pkg.signingInfo, 0);
161+
}
154162
FileUtils.writeParcelToFile(p, signatureFile);
155163
} catch (IOException e) {
156164
e.printStackTrace();
@@ -212,6 +220,7 @@ private static VPackage buildPackageCache(PackageParser.Package p) {
212220
System.arraycopy(signatures, 0, cache.mSignatures, 0, numberOfSigs);
213221
}
214222
}
223+
cache.signingInfo = mirror.android.content.pm.PackageParser.SigningInfo.ctor.newInstance(signingDetails);
215224
}
216225
cache.mAppMetaData = p.mAppMetaData;
217226
cache.packageName = p.packageName;
@@ -425,13 +434,19 @@ public static PackageInfo generatePackageInfo(VPackage p, int flags, long firstI
425434
}
426435
}
427436
}
428-
if ((flags & PackageManager.GET_SIGNATURES) != 0) {
437+
boolean hasGetSignatureFlag = (flags & PackageManager.GET_SIGNATURES) != 0;
438+
boolean hasGetSigningInfoFlag = BuildCompat.isPie() && (flags & PackageManager.GET_SIGNING_CERTIFICATES) != 0;
439+
440+
if (hasGetSignatureFlag || hasGetSigningInfoFlag) {
429441
int N = (p.mSignatures != null) ? p.mSignatures.length : 0;
430442
if (N > 0) {
431443
pi.signatures = new Signature[N];
432444
System.arraycopy(p.mSignatures, 0, pi.signatures, 0, N);
433445
}
434446
}
447+
if (hasGetSigningInfoFlag) {
448+
pi.signingInfo = p.signingInfo;
449+
}
435450
return pi;
436451
}
437452

VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/VPackage.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@
1414
import android.content.pm.ProviderInfo;
1515
import android.content.pm.ServiceInfo;
1616
import android.content.pm.Signature;
17+
import android.content.pm.SigningInfo;
1718
import android.os.Build;
1819
import android.os.Bundle;
1920
import android.os.Parcel;
2021
import android.os.Parcelable;
2122

23+
import com.lody.virtual.helper.compat.BuildCompat;
24+
2225
import java.util.ArrayList;
2326
import java.util.HashSet;
2427
import java.util.Set;
@@ -80,6 +83,8 @@ public VPackage[] newArray(int size) {
8083
/** Paths of any split APKs, ordered by parsed splitName */
8184
public String[] splitCodePaths;
8285

86+
public SigningInfo signingInfo;
87+
8388
public VPackage() {
8489
}
8590

@@ -139,6 +144,10 @@ protected VPackage(Parcel in) {
139144
this.splitCodePaths = in.createStringArray();
140145

141146
this.usesOptionalLibraries = in.createStringArrayList();
147+
148+
if (BuildCompat.isPie()) {
149+
this.signingInfo = in.readParcelable(Bundle.class.getClassLoader());
150+
}
142151
}
143152

144153
@Override
@@ -252,6 +261,10 @@ public void writeToParcel(Parcel dest, int flags) {
252261
dest.writeStringArray(this.splitCodePaths);
253262

254263
dest.writeStringList(this.usesOptionalLibraries);
264+
265+
if (BuildCompat.isPie()) {
266+
dest.writeParcelable(this.signingInfo, flags);
267+
}
255268
}
256269

257270
public static class ActivityIntentInfo extends IntentInfo {

VirtualApp/lib/src/main/java/mirror/android/content/pm/PackageParser.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616
import java.io.File;
1717
import java.util.List;
1818

19+
import mirror.MethodParams;
20+
import mirror.MethodReflectParams;
1921
import mirror.RefClass;
2022
import mirror.RefConstructor;
21-
import mirror.RefObject;
2223
import mirror.RefMethod;
23-
import mirror.MethodParams;
24-
import mirror.MethodReflectParams;
24+
import mirror.RefObject;
2525
import mirror.RefStaticMethod;
2626

2727
/**
@@ -101,6 +101,13 @@ public static class Component {
101101
public static RefObject<List<IntentFilter>> intents;
102102
}
103103

104+
public static class SigningInfo {
105+
public static Class<?> TYPE = RefClass.load(SigningInfo.class, "android.content.pm.SigningInfo");
106+
107+
@MethodReflectParams("android.content.pm.PackageParser$SigningDetails")
108+
public static RefConstructor<android.content.pm.SigningInfo> ctor;
109+
}
110+
104111
public static class SigningDetails {
105112
public static Class<?> TYPE = RefClass.load(SigningDetails.class, "android.content.pm.PackageParser$SigningDetails");
106113
public static RefObject<Signature[]> signatures;

0 commit comments

Comments
 (0)