【问题标题】:Using ProGuard WITHOUT Android Studio在没有 Android Studio 的情况下使用 ProGuard
【发布时间】:2020-11-23 02:34:48
【问题描述】:

我想知道如何从命令行运行 ProGuard。

我使用 Cordova 和 Ionic 框架构建了一个混合应用程序。向我提出的建议之一是使用 ProGuard 来混淆 java 代码并删除 Log 调用。

我目前没有使用 Android Studio 或 Eclipse,我只是在 Ionic Framework 和 Angular 1.X 中构建了项目,并带有我需要在设备上实现功能的 Cordova 插件。我让 Jenkins 通过命令行构建我的版本。

我尝试按照此处列出的步骤进行操作: https://developer.android.com/studio/build/shrink-code.html#keep-code 和这里: Disable LogCat Output COMPLETELY in release Android app?

以及梳理各种问题/答案以找到适用的位。

我的 build.gradle 保存在 ./vendor 目录中并复制以覆盖 Ionic 自动生成的/默认的 build.gradle。 它具有启用 ProGuard 的功能:

    buildTypes {
        debug {
            debuggable true
            minifyEnabled false
        }

        release {
            signingConfig signingConfigs.release
            debuggable false
            minifyEnabled true
            runProguard true
            proguardFile 'customProGuard.txt'
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 
                'proguard-android.txt'
        }
    }

我还在我的 project.properties 文件中尝试了这一行的各种版本: proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txtproguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt

它似乎没有做任何事情。我以为我的 apk 文件大小在某一时刻发生了变化,但是当我查看 JD-GUI 中的类时,我仍然可以清楚地辨别出一些东西。所以我不认为它正在运行。任何帮助将不胜感激。

Jenkins 运行以下命令:

cp -R vendor/build.gradle platforms/android/build.gradle
ionic resources
ionic prepare android
ionic build android --release
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore $KEYSTORE platforms/android/build/outputs/apk/android-release-unsigned.apk
-keypass $KEY_PASSWORD -storepass $KEYSTORE_PASSWORD $ALIAS && \ ./zipalign -v 4 platforms/android/build/outputs/apk/android-release-unsigned.apk "build/appNameHere.apk"

虽然 'ionic build android --release' 最终会调用 ./platforms/android/cordova/lib/builders/GradleBuilder.js,其中有几行引用 build.gradle,但我认为最重要的是 var buildGradle = fs.readFileSync(path.join(this.root, 'build.gradle'), 'utf8');它在其中读取文件以与 GradleBuilder.build 一起使用:

GradleBuilder.prototype.build = function(opts) {
    var wrapper = path.join(this.root, 'gradlew');
    var args = this.getArgs(opts.buildType == 'debug' ? 'debug' : 'release', opts);
    return Q().then(function() {
        return spawn(wrapper, args, {stdio: 'inherit'});
    });
};

【问题讨论】:

  • 能否请您提供 Jenkins 正在执行的 gradle 命令以及一些输出?
  • @StefanCrain:我添加了 Jenkins 使用的命令,以及我认为它与 Gradle 的关系。就输出而言,我不确定什么是相关的? JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home :preBuild :preReleaseBuild :checkReleaseManifest :CordovaLib:compileLint :CordovaLib:copyReleaseLint UP-TO-DATE :CordovaLib:mergeReleaseProguardFiles UP-TO-DATE 等等...BUILD SUCCESSFUL Total time: 12.435 secs Built the following apk(s): 最终jar signed. Verifying alignment of build/appNameHere.apk (4)... 50 META-INF/MANIFEST.MF (OK - compressed)
  • 你可以使用cordova-plugin-proguard alfilatov.com/posts/…

标签: android cordova ionic-framework proguard cordova-plugin-proguard


【解决方案1】:

经过多次反复试验,结果证明我需要将此代码块放在我的 build.gradle 文件的不同段中。

    release {
        signingConfig signingConfigs.release
        debuggable false
        minifyEnabled true
        proguardFile 'customProGuard.txt'
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 
            'proguard-android.txt'
    }

事实上,它从未被触及。通过将它放在 android { } 块中,而不是放在任何其他函数或 if 语句中,它始终如预期地运行和表现。

不幸的是,由于 Ionic 使用反射的方式,我无法从中获得太多的混淆使用 (Apache Jira Bug)。不过,ProGuard 仍可用于按照上面链接的文章删除控制台日志。

【讨论】:

    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 2020-06-13
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2017-01-07
    相关资源
    最近更新 更多