Как добавить новый класс в приложение, декомпилированное с помощью apktool?
Я новичок в apktool, так что прости мою неопытность. Мне нужно научиться декомпилировать apk, вставить какой-то код, собрать его и установить.
До сих пор я достиг цели декомпиляции, построения декомпилированного кода (и подписанного) и установки сгенерированного apk на устройство. Приложение работает правильно таким образом.
Что мне нужно сделать сейчас, так это понять, как добавить в него свой собственный код. В частности, мне нужно включить в метод onCreate основного действия (непосредственно перед закрытием метода) следующий код:
new MyClass(parameters);
и затем создайте новый класс Java в той же папке основного действия, которое реализует MyClass. Для этого первым делом я предположил сначала создать новое пустое приложение в Android Studio, собрать его и декодировать apk, чтобы получить smali-версию исходного кода. Затем я добавил MyClass в пустое приложение в Android Studio, собрал его и расшифровал недавно сгенерированный apk, который теперь включает дополнительный код и файлы, представленные MyClass.
Затем я скопировал дополнительный код и файлы, относящиеся к MyClass, и вставил его в исходный код smali калькулятора внутри метода onCreate его основного файла smali активности (прямо перед return-void
.end method
из onCreate) Соответственно, я изменил все пути из пустого приложения, чтобы отразить путь приложения калькулятора, т. е. я изменил все
Lcom/example/brok85/emptyapp/MyClass
в
Lcom/google/android/calculator/app/MyClass
во всех файлах, включая файлы MyClass smali. Затем я пересобрал приложение калькулятора, подписал его и установил на устройстве (носите эмулятор ОС). Однако приложение вылетает при запуске. Глядя на logcat, у меня есть следующее исключение:
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/calculator/app/MyClass;
at com.google.android.calculator.app.CalculatorActivity.onCreate(SourceFile:139)
Почему я получаю эту ошибку? Почему до сих пор указывает Lcom/google/android/calculator/app/MyClass
вместо com.google.android.calculator.app.MyClass
?
Любая помощь могла бы быть полезна.
Ниже приведена другая полезная информация, в том числе полная трассировка стека исключения.
Информация
- Версия Apktool (
apktool -version
) - 2.3.1 - Операционная система (Mac, Linux, Windows) - Mac
- APK От? (Playstore, ROM, Other) - Другое
StackTrace/Logcat
/com.google.android.calculator E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.google.android.calculator, PID: 5129
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/calculator/app/MyClass;
at com.google.android.calculator.app.CalculatorActivity.onCreate(SourceFile:139)
at android.app.Activity.performCreate(Activity.java:6975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.calculator.app.MyClass" on path: DexPathList[[zip file "/system/framework/com.google.android.wearable.jar", zip file "/data/app/com.google.android.calculator-TMlvBd9OU5fNf9_vXXnIHw==/base.apk"],nativeLibraryDirectories=[/data/app/com.google.android.calculator-TMlvBd9OU5fNf9_vXXnIHw==/lib/x86, /system/lib, /system/vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at com.google.android.calculator.app.CalculatorActivity.onCreate(SourceFile:139)
at android.app.Activity.performCreate(Activity.java:6975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Каркасы
АПК является приложение калькулятор Android. Я использую его, чтобы узнать, как декомпилировать, добавлять код и перекомпилировать.
Вопросы задавать до подачи
- Ты пытался
apktool d
,apktool b
ничего не меняя? да - Если вы пытаетесь установить модифицированный APK, вы подали в отставку? да
- Вы используете последнюю версию apktool? да