mupdf 库的 Proguard 问题

Posted

技术标签:

【中文标题】mupdf 库的 Proguard 问题【英文标题】:Proguard issue for mupdf library 【发布时间】:2014-05-12 01:27:30 【问题描述】:

在我尝试构建发布版本之前,我的应用程序运行良好。我收到以下错误消息:

java.lang.NoSuchFieldError: no field with name='globals' signature='J' 在 Lcom/artifex/mupdfdemo/MuPDFCore 类中;

显然问题出在我的 mupdf 库中。我在没有使用 proguard 的情况下将此库构建为 aar 文件。这是我的 mupdf 库的 build.gradle:

apply plugin: 'android-library'

android 
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig 
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    
    buildTypes 
        release 
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        
    

如你所见,runProguard 是假的。

然后是我的应用程序的 build.gradle 文件:

apply plugin: 'android'

android 
    compileSdkVersion 19
    buildToolsVersion '19.0.0'

    defaultConfig 
        minSdkVersion 9
        targetSdkVersion 19
        versionCode 6
        versionName "2.0"
    

    signingConfigs 

    

    buildTypes 
        release 
            runProguard true
            proguardFile file('key/proguard-android.txt')
        
    


dependencies 
    compile 'com.android.support:appcompat-v7:+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.artifex.mupdfdemo:mupdfreader-lib:1.0.0@aar'

这里是 proguard-android.txt 文件:

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
-dontoptimize
-dontpreverify

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * 
    native <methods>;


-keepclassmembers public class * extends android.view.View 
   void set*(***);
   *** get*();


-keepclassmembers class * extends android.app.Activity 
   public void *(android.view.View);


-keepclassmembers enum * 
    public static **[] values();
    public static ** valueOf(java.lang.String);


-keep class * implements android.os.Parcelable 
  public static final android.os.Parcelable$Creator *;


-keepclassmembers class **.R$* 
    public static <fields>;


-dontwarn android.support.**    
-dontwarn android.support.v4.** -keep class android.support.v4.**  *; 
-dontwarn android.support.v7.** -keep class android.support.v7.**  *; 

-keep public class com.artifex.mupdfdemo.MuPDFActivity
-keep public class com.artifex.mupdfdemo.MuPDFCore

如您所见,MuPDFCore 已添加到我的 proguard 文件中。任何人都可以帮助说出问题所在吗?非常感谢。

【问题讨论】:

【参考方案1】:

通过添加这一行

-keep class com.artifex.mupdfdemo.** *;

解决了这个问题。

在我将问题发布到 *** 后,我总能找到问题的解决方案。 无论如何,它可能对其他人有所帮助。

【讨论】:

感谢您分享您的知识。 :) 为公众回答您的问题点赞 你有 64 位版本的 MuPDF 库吗?

以上是关于mupdf 库的 Proguard 问题的主要内容,如果未能解决你的问题,请参考以下文章

Android Proguard 跳过外部 jar

为啥我在使用 Proguard 时会从 Play Services lib 获得 ClassNotFoundException?

Spring boot使用ProGuard实现代码混淆

原创解决Maven ProGuard不混淆局部变量的问题,以及如何使用混淆好的包

运行具有 AQuery 库的 ProGuard

使用 Proguard 时使用 jackson-json 库的问题