Android 构建时不考虑 proguard-rules

Android build not considering proguard-rules

在我基于 LibGdx 的 android 应用程序中,我使用 build.gradle 文件和下面提到的 progaurd 文件。我在 android 项目文件夹中有 progaurd-rules.pro 文件,如下所示。

问题:

  1. 我已经在 Play 商店发布了我的 apk。虽然我有 progaurd-rules.pro,但当我的应用程序崩溃时,我没有得到出现问题的文件的行号。请告诉我两件事

    一个。我需要将 progaurd-rules.pro 内容复制到 progaurd-project.txt 吗?

    b。我可以在 android- build.gradle 中添加 progaurd-rules.txt 吗?

    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt', 'proguard-rules.pro'
    

2。什么是proguard-android.txt、proguard-project.txt和proguard-rules.pro。我可以加入 proguard-project.txt 和 proguard-rules.pro 吗?

android- build.gradle

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
    }
}

progaurd-rules.pro

-keep class com.google.firebase.provider.FirebaseInitProvider
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

progaurd-project.txt

-verbose

-dontwarn android.support.**
-dontwarn com.badlogic.gdx.backends.android.AndroidFragmentApplication
-dontwarn com.badlogic.gdx.utils.GdxBuild
-dontwarn com.badlogic.gdx.physics.box2d.utils.Box2DBuild
-dontwarn com.badlogic.gdx.jnigen.BuildTarget*
-dontwarn com.badlogic.gdx.graphics.g2d.freetype.FreetypeBuild

-keep class com.badlogic.gdx.controllers.android.AndroidControllers

-keepclassmembers class com.badlogic.gdx.backends.android.AndroidInput* {

<init>(com.badlogic.gdx.Application, android.content.Context,    
java.lang.Object,        

com.badlogic.gdx.backends.android.AndroidApplicationConfiguration);
}

-keepclassmembers class com.badlogic.gdx.physics.box2d.World {
   boolean contactFilter(long, long);
   void    beginContact(long);
   void    endContact(long);
   void    preSolve(long, long);
   void    postSolve(long, long);
   boolean reportFixture(long);
   float   reportRayFixture(long, float, float, float, float, float);
}

progaurd-android.txt

com/google/firebase/provider/FirebaseInitProvider.class

Proguard 通过删除未使用的代码并使用语义模糊的名称重命名 类、字段和方法来混淆您的代码,从而使代码库更小、更高效。结果是一个更小的 .apk 文件更难逆向工程。 Proguard 已集成到 Android 构建系统中。

当您的应用程序崩溃时,如果您想获取出现问题的文件的行号。为此,您需要集成 crashlytics,如 Fabric 或市场上任何其他可用的。我正在举一个 Fabric 的例子。

加入你的build.gradle

buildscript {
  repositories {
    maven { url 'https://maven.fabric.io/public' }
  }

  dependencies {
    // These docs use an open ended version so that our plugin
    // can be updated quickly in response to Android tooling updates

    // We recommend changing it to the latest version from our changelog:
    // https://docs.fabric.io/android/changelog.html#fabric-gradle-plugin
    classpath 'io.fabric.tools:gradle:1.+'
  }
}

apply plugin: 'io.fabric'

repositories {
  maven { url 'https://maven.fabric.io/public' }
}


  compile('com.crashlytics.sdk.android:crashlytics:2.7.1@aar') {
    transitive = true;
  }

在清单文件中添加您的 API 密钥

 <meta-data
      android:name="io.fabric.ApiKey"
      android:value="<FABRIC_API_KEY>"
  /> 

在 MainActivity 中初始化您的套件

 Fabric.with(this, new Crashlytics());

要让 Play 商店开发者控制台对您的堆栈跟踪进行去混淆处理,您需要将文件 android\build\outputs\mapping\android\release\mapping.txt 上传到 Android Vitals -> 反混淆文件 控制台中应用程序菜单的部分。每次构建项目时都会新生成此文件,因此每次上传新版本的应用程序后都需要执行此操作,并且必须在更改任何代码并重新构建之前执行此操作。任何现有的堆栈跟踪都不会为您去混淆;只有上传映射文件后报告的那些。要手动反混淆您已有的那些,您可以 use the retrace tool,前提是您在上传发布版本后没有进行过其他构建。希望您使用的是版本控制,这样就不会成为问题。

请注意,第二个“android”上方可能是其他内容,具体取决于您如何设置 build.gradle

对于您的问题 1,您的 (a) 部分或 (b) 部分都是可行的解决方案。