根据Running Sample中的步骤,加入混淆后总是报找不到类
- Dominant language
- C++
- Stars
- 7k
- Forks
- 1.6k
- PR merge metrics
- No merged PRs in 30d
Description
AndFix项目维护者们,你们好。本人在使用AndFix过程中遇到了一些问题。实在是水平有限,不知道如何处理,虽然知道你们也很忙,但只能厚着脸皮来请教你们了,如能解答,那真是谢谢了。
问题:加入混淆后,总是报找不到类。
硬件环境:红米Note2
软件环境:Android 5.0.2
开发工具:Android Studio 1.5
实施步骤如下:
首先完全按照运行示例操作,没有任何问题。
出现问题的操作步骤如下:
(1)根据要求加入混淆以及issues中[Proguard 的配置文件错了](https://github.com/alibaba/AndFix/issues/79),
混淆配置如下:
`<
-keep class \* extends java.lang.annotation.Annotation
-keepclasseswithmembernames class \* {
native ;
}
-keep class com.alipay.euler.andfix.annotation.MethodReplace { *; }
-keep class com.alipay.euler.*\* {*;}
-printmapping build/outputs/mapping/debug/mapping.txt
-applymapping mapping1.txt
> `
其中mapping1.txt是生成app1.apk,即运行示例中的1.apk文件的mapping.txt。
安装后,正常运行。
(2)根据运行示例步骤,把''中的两次A类方法的调用换成Fix后,加入了该mapping.txt文件后,生成了app2.apk文件。然后使用apkpatch-1.0.3工具成功生成了apatch文件,重新命名为out.apatch,并且push到SD卡根目录下,退出程序后,再次进入Logcat输出如下:
11-26 14:41:27.823 25089-25089/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.euler.andfix, PID: 25089
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/euler/a/c;
at com.euler.andfix.MainActivity_CF.onCreate(Unknown Source)
at android.app.Activity.performCreate(Activity.java:5977)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2415)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2524)
at android.app.ActivityThread.access$800(ActivityThread.java:167)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1419)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5546)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.euler.a.c" on path: DexPathList[[zip file "/data/app/com.euler.andfix-1/base.apk"],nativeLibraryDirectories=[/data/app/com.euler.andfix-1/lib/arm, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at com.euler.andfix.MainActivity_CF.onCreate(Unknown Source)?
at android.app.Activity.performCreate(Activity.java:5977)?
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111)?
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2415)?
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2524)?
at android.app.ActivityThread.access$800(ActivityThread.java:167)?
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1419)?
at android.os.Handler.dispatchMessage(Handler.java:111)?
at android.os.Looper.loop(Looper.java:194)?
at android.app.ActivityThread.main(ActivityThread.java:5546)?
at java.lang.reflect.Method.invoke(Native Method)?
at java.lang.reflect.Method.invoke(Method.java:372)?
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964)?
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)?
Suppressed: java.lang.ClassNotFoundException: com.euler.a.c
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 15 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
**生成app1.apk文件时产生的mapping1.txt文件内容如下**:
com.alipay.euler.andfix.AndFix -> com.alipay.euler.andfix.AndFix:
java.lang.String TAG -> TAG
void () ->
boolean setup(boolean,int) -> setup
void replaceMethod(java.lang.reflect.Method,java.lang.reflect.Method) -> replaceMethod
void setFieldFlag(java.lang.reflect.Field) -> setFieldFlag
void addReplaceMethod(java.lang.reflect.Method,java.lang.reflect.Method) -> addReplaceMethod
java.lang.Class initTargetClass(java.lang.Class) -> initTargetClass
void initFields(java.lang.Class) -> initFields
boolean setup() -> setup
void () ->
com.alipay.euler.andfix.AndFixManager -> com.alipay.euler.andfix.AndFixManager:
java.lang.String TAG -> TAG
java.lang.String DIR -> DIR
android.content.Context mContext -> mContext
java.util.Map mFixedClass -> mFixedClass
boolean mSupport -> mSupport
com.alipay.euler.andfix.security.SecurityChecker mSecurityChecker -> mSecurityChecker
java.io.File mOptDir -> mOptDir
void (android.content.Context) ->
void removeOptFile(java.io.File) -> removeOptFile
void fix(java.lang.String) -> fix
void fix(java.io.File,java.lang.ClassLoader,java.util.List) -> fix
void fixClass(java.lang.Class,java.lang.ClassLoader) -> fixClass
void replaceMethod(java.lang.ClassLoader,java.lang.String,java.lang.String,java.lang.reflect.Method) -> replaceMethod
boolean isEmpty(java.lang.String) -> isEmpty
void () ->
com.alipay.euler.andfix.AndFixManager$1 -> com.alipay.euler.andfix.AndFixManager$1:
dalvik.system.DexFile val$dexFile -> val$dexFile
com.alipay.euler.andfix.AndFixManager this$0 -> this$0
void (com.alipay.euler.andfix.AndFixManager,java.lang.ClassLoader,dalvik.system.DexFile) ->
java.lang.Class findClass(java.lang.String) -> findClass
com.alipay.euler.andfix.BuildConfig -> com.alipay.euler.andfix.BuildConfig:
boolean DEBUG -> DEBUG
java.lang.String APPLICATION_ID -> APPLICATION_ID
java.lang.String BUILD_TYPE -> BUILD_TYPE
java.lang.String FLAVOR -> FLAVOR
int VERSION_CODE -> VERSION_CODE
java.lang.String VERSION_NAME -> VERSION_NAME
void () ->
com.alipay.euler.andfix.Compat -> com.alipay.euler.andfix.Compat:
boolean isChecked -> isChecked
boolean isSupport -> isSupport
void () ->
boolean isSupport() -> isSupport
boolean isYunOS() -> isYunOS
boolean isSupportSDKVersion() -> isSupportSDKVersion
boolean inBlackList() -> inBlackList
void () ->
com.alipay.euler.andfix.annotation.MethodReplace -> com.alipay.euler.andfix.annotation.MethodReplace:
java.lang.String clazz() -> clazz
java.lang.String method() -> method
com.alipay.euler.andfix.patch.Patch -> com.alipay.euler.andfix.patch.Patch:
java.lang.String ENTRY_NAME -> ENTRY_NAME
java.lang.String CLASSES -> CLASSES
java.lang.String PATCH_CLASSES -> PATCH_CLASSES
java.lang.String CREATED_TIME -> CREATED_TIME
java.lang.String PATCH_NAME -> PATCH_NAME
java.io.File mFile -> mFile
java.lang.String mName -> mName
java.util.Date mTime -> mTime
java.util.Map mClassesMap -> mClassesMap
void (java.io.File) ->
void init() -> init
java.lang.String getName() -> getName
java.io.File getFile() -> getFile
java.util.Set getPatchNames() -> getPatchNames
java.util.List getClasses(java.lang.String) -> getClasses
java.util.Date getTime() -> getTime
int compareTo(com.alipay.euler.andfix.patch.Patch) -> compareTo
int compareTo(java.lang.Object) -> compareTo
com.alipay.euler.andfix.patch.PatchManager -> com.alipay.euler.andfix.patch.PatchManager:
java.lang.String TAG -> TAG
java.lang.String SUFFIX -> SUFFIX
java.lang.String DIR -> DIR
java.lang.String SP_NAME -> SP_NAME
java.lang.String SP_VERSION -> SP_VERSION
android.content.Context mContext -> mContext
com.alipay.euler.andfix.AndFixManager mAndFixManager -> mAndFixManager
java.io.File mPatchDir -> mPatchDir
java.util.SortedSet mPatchs -> mPatchs
java.util.Map mLoaders -> mLoaders
void (android.content.Context) ->
void init(java.lang.String) -> init
void initPatchs() -> initPatchs
com.alipay.euler.andfix.patch.Patch addPatch(java.io.File) -> addPatch
void cleanPatch() -> cleanPatch
void addPatch(java.lang.String) -> addPatch
void removeAllPatch() -> removeAllPatch
void loadPatch(java.lang.String,java.lang.ClassLoader) -> loadPatch
void loadPatch() -> loadPatch
void loadPatch(com.alipay.euler.andfix.patch.Patch) -> loadPatch
com.alipay.euler.andfix.security.SecurityChecker -> com.alipay.euler.andfix.security.SecurityChecker:
java.lang.String TAG -> TAG
java.lang.String SP_NAME -> SP_NAME
java.lang.String SP_MD5 -> SP_MD5
java.lang.String CLASSES_DEX -> CLASSES_DEX
javax.security.auth.x500.X500Principal DEBUG_DN -> DEBUG_DN
android.content.Context mContext -> mContext
java.security.PublicKey mPublicKey -> mPublicKey
boolean mDebuggable -> mDebuggable
void (android.content.Context) ->
boolean verifyOpt(java.io.File) -> verifyOpt
void saveOptSig(java.io.File) -> saveOptSig
boolean verifyApk(java.io.File) -> verifyApk
void loadDigestes(java.util.jar.JarFile,java.util.jar.JarEntry) -> loadDigestes
boolean check(java.io.File,java.security.cert.Certificate[]) -> check
java.lang.String getFileMD5(java.io.File) -> getFileMD5
void saveFingerprint(java.lang.String,java.lang.String) -> saveFingerprint
java.lang.String getFingerprint(java.lang.String) -> getFingerprint
void init(android.content.Context) -> init
void () ->
com.alipay.euler.andfix.util.FileUtil -> com.alipay.euler.andfix.util.FileUtil:
void () ->
void copyFile(java.io.File,java.io.File) -> copyFile
boolean deleteFile(java.io.File) -> deleteFile
com.euler.andfix.MainActivity -> com.euler.andfix.MainActivity:
void () ->
void onCreate(android.os.Bundle) -> onCreate
void onDestroy() -> onDestroy
com.euler.andfix.MainApplication -> com.euler.andfix.MainApplication:
com.alipay.euler.andfix.patch.PatchManager mPatchManager -> a
void () ->
void onCreate() -> onCreate
com.euler.test.A -> com.euler.a.a:
com.euler.test.O o -> a
int i -> b
void () ->
java.lang.String a$16915f7f() -> a
int b$16da0604() -> b
int getI() -> c
void () ->
com.euler.test.O -> com.euler.a.b:
java.lang.String s -> a
void (java.lang.String) ->
java.lang.String toString() -> toString
**生成app2.apk时产生的mapping.txt文件内容如下:**
com.alipay.euler.andfix.AndFix -> com.alipay.euler.andfix.AndFix:
java.lang.String TAG -> TAG
void () ->
boolean setup(boolean,int) -> setup
void replaceMethod(java.lang.reflect.Method,java.lang.reflect.Method) -> replaceMethod
void setFieldFlag(java.lang.reflect.Field) -> setFieldFlag
void addReplaceMethod(java.lang.reflect.Method,java.lang.reflect.Method) -> addReplaceMethod
java.lang.Class initTargetClass(java.lang.Class) -> initTargetClass
void initFields(java.lang.Class) -> initFields
boolean setup() -> setup
void () ->
com.alipay.euler.andfix.AndFixManager -> com.alipay.euler.andfix.AndFixManager:
java.lang.String TAG -> TAG
java.lang.String DIR -> DIR
android.content.Context mContext -> mContext
java.util.Map mFixedClass -> mFixedClass
boolean mSupport -> mSupport
com.alipay.euler.andfix.security.SecurityChecker mSecurityChecker -> mSecurityChecker
java.io.File mOptDir -> mOptDir
void (android.content.Context) ->
void removeOptFile(java.io.File) -> removeOptFile
void fix(java.lang.String) -> fix
void fix(java.io.File,java.lang.ClassLoader,java.util.List) -> fix
void fixClass(java.lang.Class,java.lang.ClassLoader) -> fixClass
void replaceMethod(java.lang.ClassLoader,java.lang.String,java.lang.String,java.lang.reflect.Method) -> replaceMethod
boolean isEmpty(java.lang.String) -> isEmpty
void () ->
com.alipay.euler.andfix.AndFixManager$1 -> com.alipay.euler.andfix.AndFixManager$1:
dalvik.system.DexFile val$dexFile -> val$dexFile
com.alipay.euler.andfix.AndFixManager this$0 -> this$0
void (com.alipay.euler.andfix.AndFixManager,java.lang.ClassLoader,dalvik.system.DexFile) ->
java.lang.Class findClass(java.lang.String) -> findClass
com.alipay.euler.andfix.BuildConfig -> com.alipay.euler.andfix.BuildConfig:
boolean DEBUG -> DEBUG
java.lang.String APPLICATION_ID -> APPLICATION_ID
java.lang.String BUILD_TYPE -> BUILD_TYPE
java.lang.String FLAVOR -> FLAVOR
int VERSION_CODE -> VERSION_CODE
java.lang.String VERSION_NAME -> VERSION_NAME
void () ->
com.alipay.euler.andfix.Compat -> com.alipay.euler.andfix.Compat:
boolean isChecked -> isChecked
boolean isSupport -> isSupport
void () ->
boolean isSupport() -> isSupport
boolean isYunOS() -> isYunOS
boolean isSupportSDKVersion() -> isSupportSDKVersion
boolean inBlackList() -> inBlackList
void () ->
com.alipay.euler.andfix.annotation.MethodReplace -> com.alipay.euler.andfix.annotation.MethodReplace:
java.lang.String clazz() -> clazz
java.lang.String method() -> method
com.alipay.euler.andfix.patch.Patch -> com.alipay.euler.andfix.patch.Patch:
java.lang.String ENTRY_NAME -> ENTRY_NAME
java.lang.String CLASSES -> CLASSES
java.lang.String PATCH_CLASSES -> PATCH_CLASSES
java.lang.String CREATED_TIME -> CREATED_TIME
java.lang.String PATCH_NAME -> PATCH_NAME
java.io.File mFile -> mFile
java.lang.String mName -> mName
java.util.Date mTime -> mTime
java.util.Map mClassesMap -> mClassesMap
void (java.io.File) ->
void init() -> init
java.lang.String getName() -> getName
java.io.File getFile() -> getFile
java.util.Set getPatchNames() -> getPatchNames
java.util.List getClasses(java.lang.String) -> getClasses
java.util.Date getTime() -> getTime
int compareTo(com.alipay.euler.andfix.patch.Patch) -> compareTo
int compareTo(java.lang.Object) -> compareTo
com.alipay.euler.andfix.patch.PatchManager -> com.alipay.euler.andfix.patch.PatchManager:
java.lang.String TAG -> TAG
java.lang.String SUFFIX -> SUFFIX
java.lang.String DIR -> DIR
java.lang.String SP_NAME -> SP_NAME
java.lang.String SP_VERSION -> SP_VERSION
android.content.Context mContext -> mContext
com.alipay.euler.andfix.AndFixManager mAndFixManager -> mAndFixManager
java.io.File mPatchDir -> mPatchDir
java.util.SortedSet mPatchs -> mPatchs
java.util.Map mLoaders -> mLoaders
void (android.content.Context) ->
void init(java.lang.String) -> init
void initPatchs() -> initPatchs
com.alipay.euler.andfix.patch.Patch addPatch(java.io.File) -> addPatch
void cleanPatch() -> cleanPatch
void addPatch(java.lang.String) -> addPatch
void removeAllPatch() -> removeAllPatch
void loadPatch(java.lang.String,java.lang.ClassLoader) -> loadPatch
void loadPatch() -> loadPatch
void loadPatch(com.alipay.euler.andfix.patch.Patch) -> loadPatch
com.alipay.euler.andfix.security.SecurityChecker -> com.alipay.euler.andfix.security.SecurityChecker:
java.lang.String TAG -> TAG
java.lang.String SP_NAME -> SP_NAME
java.lang.String SP_MD5 -> SP_MD5
java.lang.String CLASSES_DEX -> CLASSES_DEX
javax.security.auth.x500.X500Principal DEBUG_DN -> DEBUG_DN
android.content.Context mContext -> mContext
java.security.PublicKey mPublicKey -> mPublicKey
boolean mDebuggable -> mDebuggable
void (android.content.Context) ->
boolean verifyOpt(java.io.File) -> verifyOpt
void saveOptSig(java.io.File) -> saveOptSig
boolean verifyApk(java.io.File) -> verifyApk
void loadDigestes(java.util.jar.JarFile,java.util.jar.JarEntry) -> loadDigestes
boolean check(java.io.File,java.security.cert.Certificate[]) -> check
java.lang.String getFileMD5(java.io.File) -> getFileMD5
void saveFingerprint(java.lang.String,java.lang.String) -> saveFingerprint
java.lang.String getFingerprint(java.lang.String) -> getFingerprint
void init(android.content.Context) -> init
void () ->
com.alipay.euler.andfix.util.FileUtil -> com.alipay.euler.andfix.util.FileUtil:
void () ->
void copyFile(java.io.File,java.io.File) -> copyFile
boolean deleteFile(java.io.File) -> deleteFile
com.euler.andfix.MainActivity -> com.euler.andfix.MainActivity:
void () ->
void onCreate(android.os.Bundle) -> onCreate
void onDestroy() -> onDestroy
com.euler.andfix.MainApplication -> com.euler.andfix.MainApplication:
com.alipay.euler.andfix.patch.PatchManager mPatchManager -> a
void () ->
void onCreate() -> onCreate
com.euler.test.A -> com.euler.a.a:
int i -> b
void () ->
int getI() -> c
void () ->
com.euler.test.Fix -> com.euler.a.c:
java.lang.String s -> a
com.euler.test.O o -> b
int i -> c
void () ->
java.lang.String a(java.lang.String) -> a
int b$16da0604(java.lang.String) -> b
void () ->
com.euler.test.O -> com.euler.a.b:
java.lang.String s -> a
void (java.lang.String) ->
java.lang.String toString() -> toString
Contributor guide
No contributing guide indexed for this repository
Research direction
Start by reproducing the Running Sample with the reported ProGuard configuration and compare the app1.apk mapping1.txt, app2.apk, generated out.apatch, and the Logcat NoClassDefFoundError. Inspect MainActivity and the patch-generation workflow; done means the obfuscated sample applies the patch and launches without the missing-class failure.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, java
- Domain
- build-system, mobile
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 35/100