remove hidden access flags (#600)

* remove hidden access flags

cherry-pick f6dc51e578

* move removeHiddenAccess to Dex2Asm
This commit is contained in:
Bob Pan 2023-09-01 20:09:35 +08:00 committed by GitHub
parent 5f70fefdc0
commit 476e64c6e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 4 deletions

View File

@ -44,6 +44,10 @@ public interface DexConstants {
int ACC_CONSTRUCTOR = 0x10000;// constructor method (class or instance initializer)
int ACC_DECLARED_SYNCHRONIZED = 0x20000;
int ACC_VISIBILITY_FLAGS = ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED;
int ACC_DEX_HIDDEN_BIT = 0x00000020; // field, method (not native)
int ACC_DEX_HIDDEN_BIT_NATIVE = 0x00000200; // method (native)
String ANNOTATION_DEFAULT_TYPE = "Ldalvik/annotation/AnnotationDefault;";
String ANNOTATION_SIGNATURE_TYPE = "Ldalvik/annotation/Signature;";
String ANNOTATION_THROWS_TYPE = "Ldalvik/annotation/Throws;";

View File

@ -58,6 +58,20 @@ import java.util.Set;
import java.util.Stack;
public class Dex2Asm {
private static boolean isPowerOfTwo(int i) {
return (i & (i - 1)) == 0;
}
private static int removeHiddenAccess(int accessFlags) {
// Refer to art/libdexfile/dex/hidden_api_access_flags.h
if (!isPowerOfTwo(accessFlags & DexConstants.ACC_VISIBILITY_FLAGS)) {
accessFlags ^= DexConstants.ACC_VISIBILITY_FLAGS;
}
accessFlags &= ~((accessFlags & DexConstants.ACC_NATIVE) != 0 ?
DexConstants.ACC_DEX_HIDDEN_BIT_NATIVE : DexConstants.ACC_DEX_HIDDEN_BIT);
return accessFlags;
}
public static class ClzCtx {
public String classDescriptor;
public String hexDecodeMethodNamePrefix;
@ -319,7 +333,9 @@ public class Dex2Asm {
+ " by changing its signature to null");
signature = null;
}
int access = methodNode.access;
// HiddenApiAccessFlags is valid for .dex but not for .class
int access = removeHiddenAccess(methodNode.access);
// clear ACC_DECLARED_SYNCHRONIZED and ACC_CONSTRUCTOR from method flags
final int cleanFlag = ~((DexConstants.ACC_DECLARED_SYNCHRONIZED | DexConstants.ACC_CONSTRUCTOR));
access &= cleanFlag;
@ -615,10 +631,11 @@ public class Dex2Asm {
signature = null;
}
// HiddenApiAccessFlags is valid for .dex but not for .class
int access = removeHiddenAccess(fieldNode.access);
final int fieldCleanFlag = ~((DexConstants.ACC_DECLARED_SYNCHRONIZED | Opcodes.ACC_SYNTHETIC));
FieldVisitor fv = cv.visitField(fieldNode.access & fieldCleanFlag, fieldNode.field.getName(),
fieldNode.field.getType(), signature, value);
FieldVisitor fv = cv.visitField(access & fieldCleanFlag, fieldNode.field.getName(),
fieldNode.field.getType(), signature, value);
if (fv == null) {
return;