【问题标题】:What's the difference between -keep class com.sample.Foo {*;} and -keep class com.sample.Foo?-keep class com.sample.Foo {*;} 和 -keep class com.sample.Foo 有什么区别?
【发布时间】:2016-10-11 18:02:24
【问题描述】:

我刚刚构建了两个发布版 APK。

其中一个有

-keep class com.sample.Foo

另一个有

-keep class com.sample.Foo {*;}

当我在 http://www.javadecompilers.com/apk 上反编译应用程序时,Foo 对于两个版本都是相同的。

Foo的代码如下:

package com.sample;

import android.util.Log;

public class Foo {

    public int field;

    public Foo() {
        field = 90;
    }

    public int doSth() {
        doPrivate();
        return 2 * field;
    }

    private void doPrivate() {
        Log.d("Proguard", "doPrivate");
    }

    void doDef() {
        Log.d("Proguard", "doDef");
    }
}

这就是我确保Foo 及其方法没有被混淆的方式:

package com.sample;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import java.lang.reflect.Method;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
            Class<?> aClass = Class.forName("com.sample.Foo");
            Object instance = aClass.newInstance();
            Method method = aClass.getMethod("doSth");
            Integer res = (Integer) method.invoke(instance);
            Log.d("Proguard", "doSth res=" + res);
        } catch (Exception e) {
            Log.e("Proguard", "", e);
        }
    }
}

更新 #1

我的 Proguard 配置。

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

【问题讨论】:

  • @T.Neidhart,他们都保留了方法
  • 那么你有额外的规则来负责这个。
  • @T.Neidhart,我的proguard-rules.pro 中有-keep class com.sample.Foo {*;}-keep class com.sample.Foo。除了来自sdk\tools\proguard\proguard-android.txt 的默认规则外,还包括在内。请参阅更新 #1
  • 那么 ProGuard 可能保留了 doSth 和 doPrivate 方法,因为它可以通过反射确定它们的用途,因为您使用硬编码字符串。我猜 doDef 方法被删除了?

标签: android proguard obfuscation


【解决方案1】:

第一个只保留类及其构造函数。

第二个保留类及其构造函数以及类中的任何字段或方法。

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    相关资源
    最近更新 更多