Browse Source

Add ability to decompile without debug info

Alexander Gorishnyak 2 years ago
parent
commit
28767aaa9e

+ 2 - 0
dist/all/docs/versions.txt

@@ -9,7 +9,9 @@
 - Added syntax definition downloader.
 - Added syntax definition downloader.
 - Added ability to open resources in an external app.
 - Added ability to open resources in an external app.
 - Added ability to disassemble only main DEX classes.
 - Added ability to disassemble only main DEX classes.
+- Added ability to disassemble without debug info.
 - Added progress indication for APK cloning.
 - Added progress indication for APK cloning.
+- Added Android 13 support.
 - Updated default Apktool to 2.7.0.
 - Updated default Apktool to 2.7.0.
 - Updated Android SDK Build Tools to 33.0.1.
 - Updated Android SDK Build Tools to 33.0.1.
 - Fixed error while saving the currently open resource.
 - Fixed error while saving the currently open resource.

+ 2 - 1
src/apk/package.cpp

@@ -127,6 +127,7 @@ Command *Package::createUnpackCommand()
     withResources = true;
     withResources = true;
     withSources = app->settings->getDecompileSources();
     withSources = app->settings->getDecompileSources();
     withBrokenResources = app->settings->getKeepBrokenResources();
     withBrokenResources = app->settings->getKeepBrokenResources();
+    withNoDebugInfo = app->settings->getDecompileNoDebugInfo();
     withOnlyMainClasses = app->settings->getDecompileOnlyMainClasses();
     withOnlyMainClasses = app->settings->getDecompileOnlyMainClasses();
 
 
     QDir().mkpath(target);
     QDir().mkpath(target);
@@ -135,7 +136,7 @@ Command *Package::createUnpackCommand()
     contentsPath = target;
     contentsPath = target;
     Q_ASSERT(!contentsPath.isEmpty());
     Q_ASSERT(!contentsPath.isEmpty());
 
 
-    auto apktoolDecode = new Apktool::Decode(source, target, frameworks, withResources, withSources, withOnlyMainClasses, withBrokenResources);
+    auto apktoolDecode = new Apktool::Decode(source, target, frameworks, withResources, withSources, withNoDebugInfo, withOnlyMainClasses, withBrokenResources);
     connect(apktoolDecode, &Command::finished, this, [=](bool success) {
     connect(apktoolDecode, &Command::finished, this, [=](bool success) {
         if (success) {
         if (success) {
             filesystemModel.setRootPath(getContentsPath());
             filesystemModel.setRootPath(getContentsPath());

+ 1 - 0
src/apk/package.h

@@ -72,6 +72,7 @@ private:
     bool withSources = false;
     bool withSources = false;
     bool withResources = false;
     bool withResources = false;
     bool withBrokenResources = false;
     bool withBrokenResources = false;
+    bool withNoDebugInfo = false;
     bool withOnlyMainClasses = false;
     bool withOnlyMainClasses = false;
 };
 };
 
 

+ 10 - 0
src/base/settings.cpp

@@ -140,6 +140,11 @@ bool Settings::getDecompileSources() const
     return settings->value("Apktool/Sources", false).toBool();
     return settings->value("Apktool/Sources", false).toBool();
 }
 }
 
 
+bool Settings::getDecompileNoDebugInfo() const
+{
+    return settings->value("Apktool/NoDebugInfo", false).toBool();
+}
+
 bool Settings::getDecompileOnlyMainClasses() const
 bool Settings::getDecompileOnlyMainClasses() const
 {
 {
     return settings->value("Apktool/OnlyMainClasses", false).toBool();
     return settings->value("Apktool/OnlyMainClasses", false).toBool();
@@ -422,6 +427,11 @@ void Settings::setDecompileSources(bool smali)
     settings->setValue("Apktool/Sources", smali);
     settings->setValue("Apktool/Sources", smali);
 }
 }
 
 
+void Settings::setDecompileNoDebugInfo(bool noDebugInfo)
+{
+    settings->setValue("Apktool/NoDebugInfo", noDebugInfo);
+}
+
 void Settings::setDecompileOnlyMainClasses(bool onlyMain)
 void Settings::setDecompileOnlyMainClasses(bool onlyMain)
 {
 {
     settings->setValue("Apktool/OnlyMainClasses", onlyMain);
     settings->setValue("Apktool/OnlyMainClasses", onlyMain);

+ 2 - 0
src/base/settings.h

@@ -35,6 +35,7 @@ public:
     bool getUseAapt2() const;
     bool getUseAapt2() const;
     bool getMakeDebuggable() const;
     bool getMakeDebuggable() const;
     bool getDecompileSources() const;
     bool getDecompileSources() const;
+    bool getDecompileNoDebugInfo() const;
     bool getDecompileOnlyMainClasses() const;
     bool getDecompileOnlyMainClasses() const;
     bool getKeepBrokenResources() const;
     bool getKeepBrokenResources() const;
     QString getDeviceAlias(const QString &serial) const;
     QString getDeviceAlias(const QString &serial) const;
@@ -89,6 +90,7 @@ public:
     void setUseAapt2(bool aapt2);
     void setUseAapt2(bool aapt2);
     void setMakeDebuggable(bool debuggable);
     void setMakeDebuggable(bool debuggable);
     void setDecompileSources(bool smali);
     void setDecompileSources(bool smali);
+    void setDecompileNoDebugInfo(bool noDebugInfo);
     void setDecompileOnlyMainClasses(bool onlyMain);
     void setDecompileOnlyMainClasses(bool onlyMain);
     void setKeepBrokenResources(bool keepBroken);
     void setKeepBrokenResources(bool keepBroken);
     void setDeviceAlias(const QString &serial, const QString &alias);
     void setDeviceAlias(const QString &serial, const QString &alias);

+ 3 - 0
src/tools/apktool.cpp

@@ -23,6 +23,9 @@ void Apktool::Decode::run()
     if (!sources) {
     if (!sources) {
         arguments << "--no-src";
         arguments << "--no-src";
     }
     }
+    if (noDebugInfo) {
+        arguments << "--no-debug-info";
+    }
     if (onlyMainClasses) {
     if (onlyMainClasses) {
         arguments << "--only-main-classes";
         arguments << "--only-main-classes";
     }
     }

+ 3 - 1
src/tools/apktool.h

@@ -9,7 +9,7 @@ namespace Apktool
     {
     {
     public:
     public:
         Decode(const QString &source, const QString &destination, const QString &frameworks,
         Decode(const QString &source, const QString &destination, const QString &frameworks,
-               bool resources, bool sources, bool onlyMainClasses, bool keepBrokenResources,
+               bool resources, bool sources, bool noDebugInfo, bool onlyMainClasses, bool keepBrokenResources,
                QObject *parent = nullptr)
                QObject *parent = nullptr)
             : Command(parent)
             : Command(parent)
             , source(source)
             , source(source)
@@ -17,6 +17,7 @@ namespace Apktool
             , frameworks(frameworks)
             , frameworks(frameworks)
             , resources(resources)
             , resources(resources)
             , sources(sources)
             , sources(sources)
+            , noDebugInfo(noDebugInfo)
             , onlyMainClasses(onlyMainClasses)
             , onlyMainClasses(onlyMainClasses)
             , keepBrokenResources(keepBrokenResources) {}
             , keepBrokenResources(keepBrokenResources) {}
 
 
@@ -29,6 +30,7 @@ namespace Apktool
         const QString frameworks;
         const QString frameworks;
         const bool resources;
         const bool resources;
         const bool sources;
         const bool sources;
+        const bool noDebugInfo;
         const bool onlyMainClasses;
         const bool onlyMainClasses;
         const bool keepBrokenResources;
         const bool keepBrokenResources;
         QString resultOutput;
         QString resultOutput;

+ 4 - 0
src/windows/optionsdialog.cpp

@@ -109,6 +109,7 @@ void OptionsDialog::load()
     checkboxDebuggable->setChecked(app->settings->getMakeDebuggable());
     checkboxDebuggable->setChecked(app->settings->getMakeDebuggable());
     checkboxSources->setChecked(app->settings->getDecompileSources());
     checkboxSources->setChecked(app->settings->getDecompileSources());
     checkboxOnlyMainClasses->setChecked(app->settings->getDecompileOnlyMainClasses());
     checkboxOnlyMainClasses->setChecked(app->settings->getDecompileOnlyMainClasses());
+    checkboxNoDebugInfo->setChecked(app->settings->getDecompileNoDebugInfo());
     checkboxBrokenResources->setChecked(app->settings->getKeepBrokenResources());
     checkboxBrokenResources->setChecked(app->settings->getKeepBrokenResources());
 
 
     // Apksigner
     // Apksigner
@@ -165,6 +166,7 @@ void OptionsDialog::save()
     app->settings->setMakeDebuggable(checkboxDebuggable->isChecked());
     app->settings->setMakeDebuggable(checkboxDebuggable->isChecked());
     app->settings->setDecompileSources(checkboxSources->isChecked());
     app->settings->setDecompileSources(checkboxSources->isChecked());
     app->settings->setDecompileOnlyMainClasses(checkboxOnlyMainClasses->isChecked());
     app->settings->setDecompileOnlyMainClasses(checkboxOnlyMainClasses->isChecked());
+    app->settings->setDecompileNoDebugInfo(checkboxNoDebugInfo->isChecked());
     app->settings->setKeepBrokenResources(checkboxBrokenResources->isChecked());
     app->settings->setKeepBrokenResources(checkboxBrokenResources->isChecked());
 
 
     // Apksigner
     // Apksigner
@@ -325,10 +327,12 @@ void OptionsDialog::initialize()
     //: "Smali" is the name of the tool/format, don't translate it.
     //: "Smali" is the name of the tool/format, don't translate it.
     checkboxSources = new QCheckBox(tr("Decompile source code (smali)"), this);
     checkboxSources = new QCheckBox(tr("Decompile source code (smali)"), this);
     checkboxOnlyMainClasses = new QCheckBox(tr("Decompile only main classes"), this);
     checkboxOnlyMainClasses = new QCheckBox(tr("Decompile only main classes"), this);
+    checkboxNoDebugInfo = new QCheckBox(tr("Decompile without debug info"), this);
     checkboxBrokenResources = new QCheckBox(tr("Decompile broken resources"), this);
     checkboxBrokenResources = new QCheckBox(tr("Decompile broken resources"), this);
     auto layoutUnpacking = new QVBoxLayout(groupUnpacking);
     auto layoutUnpacking = new QVBoxLayout(groupUnpacking);
     layoutUnpacking->addWidget(checkboxSources);
     layoutUnpacking->addWidget(checkboxSources);
     layoutUnpacking->addWidget(checkboxOnlyMainClasses);
     layoutUnpacking->addWidget(checkboxOnlyMainClasses);
+    layoutUnpacking->addWidget(checkboxNoDebugInfo);
     layoutUnpacking->addWidget(checkboxBrokenResources);
     layoutUnpacking->addWidget(checkboxBrokenResources);
 
 
     auto groupPacking = new QGroupBox(tr("Packing"), this);
     auto groupPacking = new QGroupBox(tr("Packing"), this);

+ 1 - 0
src/windows/optionsdialog.h

@@ -66,6 +66,7 @@ private:
     QCheckBox *checkboxAapt2;
     QCheckBox *checkboxAapt2;
     QCheckBox *checkboxDebuggable;
     QCheckBox *checkboxDebuggable;
     QCheckBox *checkboxSources;
     QCheckBox *checkboxSources;
+    QCheckBox *checkboxNoDebugInfo;
     QCheckBox *checkboxOnlyMainClasses;
     QCheckBox *checkboxOnlyMainClasses;
     QCheckBox *checkboxBrokenResources;
     QCheckBox *checkboxBrokenResources;