• Android Studio 使用 Gradle 打包 Jar


    Android Studio 打 Jar 包一直是一个麻烦的事,按照网上现有的教程,打包一个混淆的 jar 需要完成下列步骤:

    1.如果不使用assets文件夹打到jar中可使用一下方法:

    与eclipse不同,android studio 1.0 没提供导出jar包的图形界面。需要结合gradle来生成jar包。

    首先 需要设置module应用的gradle插件为 library 代码长这样:

    apply plugin: 'com.android.library'

    这样,build的时候,android studio 1.0会在 module目录的build/intermediates/bundles/release/ 子目录(这个目录以后版本可能会变)里生成一个名为classes的jar包。
    如果你的项目没用到assets等资源文件,那你直接拷贝出去就可以用了。

    2.以下是Gradle 打 Jar 包

    代码

    废话不多说,先上代码(:只在 Gradle Android Plugin 1.2.3 测试过)

    build.gradle

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    import com.android.build.gradle.AppPlugin
    import com.android.build.gradle.LibraryPlugin
    import proguard.gradle.ProGuardTask

    apply plugin: 'com.android.application'

    android {
       compileSdkVersion 22
       buildToolsVersion "22.0.1"

       defaultConfig {
           applicationId "org.chaos.demo.jar"
           minSdkVersion 22
           targetSdkVersion 22
           versionCode 1
           versionName "1.0"
       }
       buildTypes {
           release {
               minifyEnabled true
               proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
           }
       }
    }

    dependencies {
       compile fileTree(dir: 'libs', include: ['*.jar'])
    }

    //dependsOn 可根据实际需要增加或更改
    task buildJar(dependsOn: ['compileReleaseJava'], type: Jar) {

       appendix = "demo"
       baseName = "androidJar"
       version = "1.0.0"
       classifier = "release"

       //后缀名
       extension = "jar"
       //最终的 Jar 包名,如果没设置,默认为 [baseName]-[appendix]-[version]-[classifier].[extension]
       archiveName = "AndroidJarDemo.jar"

       //需打包的资源所在的路径集
       def srcClassDir = [project.buildDir.absolutePath + "/intermediates/classes/release"];
       //初始化资源路径集
       from srcClassDir

       //去除路径集下部分的资源
       exclude "org/chaos/demo/jar/BuildConfig.class"
       exclude "org/chaos/demo/jar/BuildConfig$*.class"
       exclude "**/R.class"
       exclude "**/R$*.class"

       //只导入资源路径集下的部分资源
       include "org/chaos/demo/jar/**/*.class"

       //注: exclude include 支持可变长参数
    }

    task proguardJar(dependsOn: ['buildJar'], type: ProGuardTask) {
       //Android 默认的 proguard 文件
       configuration android.getDefaultProguardFile('proguard-android.txt')
       //manifest 注册的组件对应的 proguard 文件
       configuration project.buildDir.absolutePath + "/intermediates/proguard-rules/release/aapt_rules.txt"
       configuration 'proguard-rules.pro'

       String inJar = buildJar.archivePath.getAbsolutePath()
       //输入 jar
       injars inJar
       //输出 jar
       outjars inJar.substring(0, inJar.lastIndexOf('/')) + "/proguard-${buildJar.archiveName}"

       //设置不删除未引用的资源(类,方法等)
       dontshrink

       Plugin plugin = getPlugins().hasPlugin(AppPlugin) ?
               getPlugins().findPlugin(AppPlugin) :
               getPlugins().findPlugin(LibraryPlugin)
       if (plugin != null) {
           List<String> runtimeJarList
           if (plugin.getMetaClass().getMetaMethod("getRuntimeJarList")) {
               runtimeJarList = plugin.getRuntimeJarList()
           } else if (android.getMetaClass().getMetaMethod("getBootClasspath")) {
               runtimeJarList = android.getBootClasspath()
           } else {
               runtimeJarList = plugin.getBootClasspath()
           }

           for (String runtimeJar : runtimeJarList) {
               //给 proguard 添加 runtime
               libraryjars(runtimeJar)
           }
       }
    }

    使用方法

    不需要混淆则运行命令

    gradle buildJar
    或
    ./gradlew buildjar
    

    需要混淆则运行

    gradle proguardJar
    或
    ./gradlew proguardJar
    

    最后

    buildJar 这部分相对比较简单,很多内容网上都有教程。关键在于混淆,由于团队每个人都有自己的安装习惯,JDK、Android SDK 路径不一定一致,并不能直接写死 runtime 的路径,最后直接看 Android Plugin 源码才写出了 proguardJartask。

    至于想更多个性化的朋友,建议从源码入手。

  • 相关阅读:
    详解 ES6 Modules
    es6常用基础合集
    透彻掌握Promise的使用,读这篇就够了
    Initialization of deep networks
    Logistic Regression and Gradient Descent
    一定要在年轻的时候读最难的书
    DEEP LEARNING WITH STRUCTURE
    我和NLP的故事(转载)
    Common Pitfalls In Machine Learning Projects
    C++中debug和release的区别 . 转载
  • 原文地址:https://www.cnblogs.com/earl-yongchang/p/5056554.html
Copyright © 2020-2023  润新知