Android Studio使用gradle导出jar包并混淆代码代码记录二

1.偷懒式导出Jar

task releaseMyLib(type: Copy, dependsOn: ['build']) {
    from('build/intermediates/bundles/release/')
    into('build/libs')
    include('classes.jar')
    rename('classes.jar', 'my-lib.jar')
}

运行项目后会在’build/intermediates/bundles/release/下生成一个classes.jar,我们将其拷贝到build/libs下并重命名,这种方式会将BuildConfig还有R.class等也打包进去


2.规范导出Jar包

task jarMyLib(type: Jar, dependsOn: ['build']) {
    archiveName = 'my-lib.jar'
    from('build/intermediates/classes/release')
    destinationDir = file('build/libs')
    exclude('com/scott/hellolib/BuildConfig.class')
    exclude('com/scott/hellolib/BuildConfig\$*.class')
    exclude('**/R.class')
    exclude('**/R\$*.class')
    manifest {
        attributes(
                'Implementation-Title': "${project.name}",
                'Implementation-Version': "${version}",
                'Built-Date': new Date().getDateTimeString(),
                'Built-With':
                        "gradle-${project.getGradle().getGradleVersion()},groovy-${GroovySystem.getVersion()}",
                'Created-By':
                        'Java ' + System.getProperty('java.version') + ' (' + System.getProperty('java.vendor') + ')')
    }
}

其中涉及到上文说过的修改Manifest信息的方法。


3.混淆Jar

def androidSDKDir = plugins.getPlugin('com.android.library').sdkHandler.getSdkFolder()
def androidJarDir = androidSDKDir.toString() + '/platforms/' + "${android.compileSdkVersion}" + '/android.jar'

task proguardMyLib(type: proguard.gradle.ProGuardTask, dependsOn: ['jarMyLib']) {
    injars('build/libs/my-lib.jar')
    outjars('build/libs/my-pro-lib.jar')
    libraryjars(androidJarDir)
    configuration android.getDefaultProguardFile('proguard-android.txt')
    configuration 'proguard-rules.pro'
    dontshrink
}

proguard-rules.pro文件(较上一篇文章更详细一点,且执行完毕会导出mapping等文件)

-ignorewarnings                     # 忽略警告,避免打包时某些警告出现
-optimizationpasses 5               # 指定代码的压缩级别
-dontusemixedcaseclassnames         # 是否使用大小写混合
-dontskipnonpubliclibraryclasses    # 是否混淆第三方jar
-dontpreverify                      # 混淆时是否做预校验
-verbose                            # 混淆时是否记录日志
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*        # 混淆时所采用的算法


-dump class_files.txt    #记录生成的日志数据,gradle build时在本项目根目录输出 apk 包内所有 class 的内部结构
-printmapping mapping.txt       #混淆前后的映射 (我是在使用了这条语句后,就在build\outputs\mapping\你的项目名\release\文件夹下,出现了dump.txt, mapping.txt, seeds.txt, usage.txt)
-printseeds seeds.txt  #未混淆的类和成员
-printusage unused.txt (dump.txt) #列出从 apk 中删除的代码



-dontwarn android.support.v4.**     #缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。
-dontwarn android.os.**
-keep class android.support.v4.** { *; }        # 保持哪些类不被混淆
-keep class com.baidu.** { *; }
-keep class android.os.**{*;}

-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.support.v4.widget


-keepclasseswithmembernames class * {       # 保持 native 方法不被混淆
     native <methods>;
 }

-keepclasseswithmembers class * {            # 保持自定义控件类不被混淆
     public <init>(android.content.Context, android.util.AttributeSet);
 }

-keepclasseswithmembers class * {            # 保持自定义控件类不被混淆
     public <init>(android.content.Context, android.util.AttributeSet, int);
 }

-keepclassmembers class * extends android.app.Activity { #保持类成员
    public void *(android.view.View);
 }

-keepclassmembers enum * {                  # 保持枚举 enum 类不被混淆
     public static **[] values();
     public static ** valueOf(java.lang.String);
 }

-keep class * implements android.os.Parcelable {    # 保持 Parcelable 不被混淆
   public static final android.os.Parcelable$Creator *;
 }
-keep public class com.scott.hellolib.test.People{
     
     
public protected *;
}

混淆完毕
这里写图片描述
这里写图片描述
这里写图片描述
可以看到在混淆文件中增加如下语句

-keep public class com.scott.hellolib.test.People{
public protected *;
}

混淆后的jar指定类方法没有被混淆。
本文到此结束

猜你喜欢

转载自blog.csdn.net/q919233914/article/details/72467644
今日推荐