java - 反射不适用于 Android 发布的 apk。即使禁用了 proguard/minify

标签 java android reflection proguard

目前,我面临一个奇怪的问题,即我的应用程序的发布 apk 抛出 NoSuchFieldExceptions。它在调试 apk 上运行良好。

我试图获取的字段是 android.widget 打包的。 我还努力启用 proguard 并在 proguard.pro 文件中设置配置

无论如何,这里都是异常(exception)。

java.lang.IllegalAccessException:类java.lang.Class无法访问类java.lang.Class的字段android.widget.ProgressBar com.trinitcore.localtrade.LoginActivity.o

Gradle 文件

    apply plugin: 'com.android.application'

android {
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LGPL2.1'
    }
    compileSdkVersion 25
    buildToolsVersion "25.0.0"
    defaultConfig {
        applicationId "com.trinitcore.localtrade"
        minSdkVersion  15 //15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        targetCompatibility 1.7
        sourceCompatibility 1.7
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile('com.mikepenz:materialdrawer:5.4.0@aar') {
        transitive = true
    }
    compile 'com.android.support:appcompat-v7:+'
    compile 'com.android.support:design:+'
    compile 'com.quinny898.library.persistentsearch:library:1.1.0-SNAPSHOT'
    compile 'com.github.paolorotolo:appintro:4.0.0'
    compile 'com.mikepenz:materialize:0.9.0@aar'
    compile 'com.mikepenz:iconics-core:2.7.2@aar'
    compile 'com.mikepenz:fastadapter:1.6.1@aar'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.google.android.gms:play-services:9.6.0'
    compile 'com.android.support:support-v4:+'
    compile 'com.android.support:cardview-v7:+'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'de.hdodenhof:circleimageview:2.1.0'
    compile "com.mikepenz:iconics-core:2.8.1@aar"
    compile 'com.mikepenz:google-material-typeface:2.2.0.3.original@aar'
    compile 'com.mikepenz:material-design-iconic-typeface:2.2.0.2@aar'
    compile 'com.mikepenz:fontawesome-typeface:4.7.0.0@aar'
    compile 'com.mikepenz:octicons-typeface:3.2.0.2@aar'
    compile 'com.mikepenz:meteocons-typeface:1.1.0.2@aar'
    compile 'com.mikepenz:community-material-typeface:1.7.22.1@aar'
    compile 'com.mikepenz:weather-icons-typeface:2.0.10.2@aar'
    compile 'com.mikepenz:typeicons-typeface:2.0.7.2@aar'
    compile 'com.mikepenz:entypo-typeface:1.0.0.2@aar'
    compile 'com.mikepenz:devicon-typeface:2.0.0.2@aar'
    compile 'com.mikepenz:foundation-icons-typeface:3.0.0.2@aar'
    compile 'com.mikepenz:ionicons-typeface:2.0.1.2@aar'
    compile 'com.facebook.android:facebook-android-sdk:[4,5)'
    compile 'com.lusfold.spinnerloading:library:1.0.0'
    compile 'com.github.medyo:fancybuttons:1.8.3'
    compile 'jp.wasabeef:blurry:2.1.0'
    compile ('org.apache.httpcomponents:httpmime:4.3'){
        exclude group: 'org.apache.httpcomponents', module: 'httpclient'
    }
    compile ('org.apache.httpcomponents:httpcore:4.4.1'){
        exclude group: 'org.apache.httpcomponents', module: 'httpclient'

    }
    testCompile 'junit:junit:4.12'
}

最佳答案

IllegalAccessException 意味着它可以看到变量/方法,但无法访问它,因为它是私有(private)的(或者因为它是 protected ,并且这不是同一个包)。这不是反射不起作用的情况,这是一个常见的错误,没有反射就无法编译。

您可以使用反射在运行时更改变量/方法的可见性,然后访问它,但不建议这样做。最好添加一个执行您需要的操作的公共(public)方法,以防止以类未编写接受的方式更改数据的可能性。

关于java - 反射不适用于 Android 发布的 apk。即使禁用了 proguard/minify,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41525867/

相关文章:

c# - Activator.CreateInstance 的目的与示例?

Java-类<?延伸 Collection >

java - 如何使用 qtj 和 java 从一组图像创建电影?

java - 我的应用程序正在模拟器上运行并完全正常工作,但在物理设备上崩溃

android - EditText 提示不会消失

android - Ionic 模拟 Android 错误 - 退出代码 2

android - 使用Robolectric而不进行多义处理?

java - 按类动态检索监听器实例

java - 通用链表 - 如何添加不同的对象

java - 如何通过 Package.getPackage(...) 访问包?