├── .gitignore
├── app
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── xyz
│ │ └── bboylin
│ │ └── MainActivity.java
│ └── res
│ ├── drawable-v24
│ └── ic_launcher_foreground.xml
│ ├── drawable
│ └── ic_launcher_background.xml
│ ├── layout
│ └── activity_main.xml
│ ├── mipmap-anydpi-v26
│ ├── ic_launcher.xml
│ └── ic_launcher_round.xml
│ ├── mipmap-hdpi
│ ├── ic_launcher.png
│ └── ic_launcher_round.png
│ ├── mipmap-mdpi
│ ├── ic_launcher.png
│ └── ic_launcher_round.png
│ ├── mipmap-xhdpi
│ ├── ic_launcher.png
│ └── ic_launcher_round.png
│ ├── mipmap-xxhdpi
│ ├── ic_launcher.png
│ └── ic_launcher_round.png
│ ├── mipmap-xxxhdpi
│ ├── ic_launcher.png
│ └── ic_launcher_round.png
│ └── values
│ ├── colors.xml
│ ├── strings.xml
│ └── styles.xml
├── build.gradle
├── cmd.png
├── fatJar.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── lib
├── .gitignore
├── build.gradle
└── src
│ └── main
│ ├── groovy
│ └── xyz
│ │ └── bboylin
│ │ ├── plugin
│ │ ├── FatJarExtension.groovy
│ │ └── FatJarPlugin.groovy
│ │ └── task
│ │ └── FatJarTask.groovy
│ └── resources
│ └── META-INF
│ └── gradle-plugins
│ └── FatJarPlugin.properties
├── readme.md
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 | .externalNativeBuild
10 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 26
5 | defaultConfig {
6 | applicationId "xyz.bboylin"
7 | minSdkVersion 15
8 | targetSdkVersion 26
9 | versionCode 1
10 | versionName "1.0"
11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
12 | }
13 | buildTypes {
14 | release {
15 | minifyEnabled false
16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
17 | }
18 | }
19 | }
20 |
21 | dependencies {
22 | implementation fileTree(dir: 'libs', include: ['*.jar'])
23 | implementation 'com.android.support:appcompat-v7:26.1.0'
24 | implementation 'com.android.support.constraint:constraint-layout:1.0.2'
25 | testImplementation 'junit:junit:4.12'
26 | androidTestImplementation 'com.android.support.test:runner:1.0.1'
27 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
28 | }
29 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/java/xyz/bboylin/MainActivity.java:
--------------------------------------------------------------------------------
1 | package xyz.bboylin;
2 |
3 | import android.support.v7.app.AppCompatActivity;
4 | import android.os.Bundle;
5 |
6 | public class MainActivity extends AppCompatActivity {
7 |
8 | @Override
9 | protected void onCreate(Bundle savedInstanceState) {
10 | super.onCreate(savedInstanceState);
11 | setContentView(R.layout.activity_main);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
12 |
13 |
19 |
22 |
25 |
26 |
27 |
28 |
34 |
35 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
15 |
20 |
25 |
30 |
35 |
40 |
45 |
50 |
55 |
60 |
65 |
70 |
75 |
80 |
85 |
90 |
95 |
100 |
105 |
110 |
115 |
120 |
125 |
130 |
135 |
140 |
145 |
150 |
155 |
160 |
165 |
170 |
171 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bboylin/FatJar/35d9ebb3cce958376cb57ee6c485eb156390f87e/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bboylin/FatJar/35d9ebb3cce958376cb57ee6c485eb156390f87e/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bboylin/FatJar/35d9ebb3cce958376cb57ee6c485eb156390f87e/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bboylin/FatJar/35d9ebb3cce958376cb57ee6c485eb156390f87e/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bboylin/FatJar/35d9ebb3cce958376cb57ee6c485eb156390f87e/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bboylin/FatJar/35d9ebb3cce958376cb57ee6c485eb156390f87e/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bboylin/FatJar/35d9ebb3cce958376cb57ee6c485eb156390f87e/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bboylin/FatJar/35d9ebb3cce958376cb57ee6c485eb156390f87e/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bboylin/FatJar/35d9ebb3cce958376cb57ee6c485eb156390f87e/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bboylin/FatJar/35d9ebb3cce958376cb57ee6c485eb156390f87e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | FatJar
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 |
5 | repositories {
6 | google()
7 | jcenter()
8 | }
9 | dependencies {
10 | classpath 'com.android.tools.build:gradle:3.0.1'
11 | classpath 'com.novoda:bintray-release:0.3.4'
12 | // NOTE: Do not place your application dependencies here; they belong
13 | // in the individual module build.gradle files
14 | }
15 | }
16 |
17 | allprojects {
18 | repositories {
19 | google()
20 | jcenter()
21 | }
22 | }
23 |
24 | task clean(type: Delete) {
25 | delete rootProject.buildDir
26 | }
27 |
--------------------------------------------------------------------------------
/cmd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bboylin/FatJar/35d9ebb3cce958376cb57ee6c485eb156390f87e/cmd.png
--------------------------------------------------------------------------------
/fatJar.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'FatJarPlugin'
2 |
3 | fatJarTask.dependsOn({
4 | def tasks = new ArrayList<>()
5 | def taskName = fatJarExt.isDebug ? ":assembleDebug" : ":assembleRelease"
6 | fatJarExt.jarPaths.each {
7 | if (!it.contains(".jar")) {
8 | tasks.add(":" + it + taskName)
9 | }
10 | }
11 | return tasks.toArray()
12 | })
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | org.gradle.jvmargs=-Xmx1536m
13 |
14 | # When configured, Gradle will run in incubating parallel mode.
15 | # This option should only be used with decoupled projects. More details, visit
16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
17 | # org.gradle.parallel=true
18 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bboylin/FatJar/35d9ebb3cce958376cb57ee6c485eb156390f87e/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Thu Jan 04 16:35:01 CST 2018
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/lib/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/lib/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'groovy'
2 | apply plugin: 'com.novoda.bintray-release'
3 |
4 | repositories {
5 | mavenCentral()
6 | }
7 |
8 | dependencies {
9 | compile localGroovy()
10 | compile gradleApi()
11 | }
12 |
13 | sourceCompatibility = JavaVersion.VERSION_1_7
14 | targetCompatibility = JavaVersion.VERSION_1_7
15 |
16 | publish {
17 | userOrg = 'bboylin' //bintray注册的用户名
18 | groupId = 'xyz.bboylin' //compile引用时的第1部分groupId
19 | artifactId = 'FatJarPlugin' //compile引用时的第2部分项目名
20 | repoName='FatJarPlugin'
21 | publishVersion = '1.0.5' //compile引用时的第3部分版本号
22 | desc = 'a gradle plugin to pack modules and jars into a single jar'
23 | website = 'https://github.com/bboylin/FatJar'
24 | }
--------------------------------------------------------------------------------
/lib/src/main/groovy/xyz/bboylin/plugin/FatJarExtension.groovy:
--------------------------------------------------------------------------------
1 | package xyz.bboylin.plugin
2 |
3 | class FatJarExtension {
4 | String version = "1.0"
5 | String owner = "FatJar@bboylin"
6 | String[] jarPaths
7 | String[] assetsPaths
8 | String output
9 | boolean isDebug = false
10 | }
11 |
--------------------------------------------------------------------------------
/lib/src/main/groovy/xyz/bboylin/plugin/FatJarPlugin.groovy:
--------------------------------------------------------------------------------
1 | package xyz.bboylin.plugin
2 |
3 | import org.gradle.api.Plugin
4 | import org.gradle.api.Project
5 | import xyz.bboylin.task.FatJarTask
6 |
7 | class FatJarPlugin implements Plugin {
8 | public static final String EXT_NAME = "fatJarExt"
9 | public static final String TASK_NAME = "fatJarTask"
10 |
11 | @Override
12 | void apply(Project project) {
13 | FatJarExtension ext = project.extensions.create(EXT_NAME, FatJarExtension)
14 | FatJarTask task = project.tasks.create(TASK_NAME, FatJarTask)
15 | task.doFirst {
16 | String rootPath = project.rootDir.absolutePath
17 | task.jarPaths = ext.jarPaths
18 | task.outputPath = rootPath + "/" + ext.output
19 | task.projectPath = rootPath
20 | task.assetsPaths = ext.assetsPaths
21 | task.owner = ext.owner
22 | task.version = ext.version
23 | if (ext.isDebug) {
24 | task.jarPathSuffix = task.jarPathSuffix.replace("release", "debug")
25 | }
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/lib/src/main/groovy/xyz/bboylin/task/FatJarTask.groovy:
--------------------------------------------------------------------------------
1 | package xyz.bboylin.task
2 |
3 | import org.gradle.api.DefaultTask
4 | import org.gradle.api.tasks.TaskAction
5 |
6 | import java.util.jar.JarEntry
7 | import java.util.jar.JarFile
8 | import java.util.jar.JarOutputStream
9 | import java.util.jar.Manifest
10 | import java.util.zip.ZipException
11 |
12 | class FatJarTask extends DefaultTask {
13 | //manifest版本
14 | def version
15 | //manifest作者
16 | def owner
17 | //jar路径数组
18 | def jarPaths
19 | //assets路径数组
20 | def assetsPaths
21 | //输出文件路径
22 | def outputPath
23 | //project路径
24 | def projectPath
25 | //jar路径后缀
26 | def jarPathSuffix = "/build/intermediates/bundles/release/classes.jar"
27 | private static final String META_INF = "META-INF"
28 | private static final String ASSETS_PREFIX = "assets/"
29 | public static final String SEP = "/"
30 | public static final String ASSETS_SUFFIX = "/src/main/assets"
31 |
32 | @TaskAction
33 | def createFatJar() {
34 | def manifest = getManifest()
35 | JarOutputStream jarOutputStream = null
36 | try {
37 | if (!completePaths()) {
38 | println("build " + outputPath + " failed!!!")
39 | return
40 | }
41 | jarOutputStream = new JarOutputStream(new FileOutputStream(outputPath), manifest)
42 | if (assetsPaths != null && assetsPaths.size() > 0) {
43 | for (String assetPath : assetsPaths) {
44 | addAssets(new File(assetPath), ASSETS_PREFIX, jarOutputStream)
45 | }
46 | }
47 | addFilesFromJars(jarPaths, jarOutputStream)
48 | } catch (Exception e) {
49 | e.printStackTrace()
50 | println("build " + outputPath + " failed!!!")
51 | return
52 | } finally {
53 | if (jarOutputStream != null) {
54 | jarOutputStream.close()
55 | }
56 | }
57 | println("build " + outputPath + " success!!!")
58 | }
59 |
60 | def addAssets(File file, String assetsEntryPrefix, JarOutputStream jarOutputStream) {
61 | if (!file.exists() || !file.isDirectory()) {
62 | println("assets does not exist or is not Directory!!!")
63 | return
64 | }
65 | File[] files = file.listFiles()
66 | for (File f : files) {
67 | addAssetsFile(f, assetsEntryPrefix, jarOutputStream)
68 | }
69 | }
70 |
71 | def addAssetsFile(File file, String assetsEntryPrefix, JarOutputStream jarOutputStream) {
72 | if (file.isDirectory()) {
73 | addAssets(file, assetsEntryPrefix + file.getName() + SEP, jarOutputStream)
74 | } else {
75 | InputStream inputStream = new FileInputStream(file);
76 | copyDataToJar(inputStream, jarOutputStream, assetsEntryPrefix + file.getName());
77 | println("added " + file.getAbsolutePath())
78 | }
79 | }
80 |
81 | def completePaths() {
82 | for (int i = 0; i < jarPaths.length; i++) {
83 | String path = jarPaths[i]
84 | if (!path.contains(".jar")) {
85 | jarPaths[i] = projectPath + SEP + path.replace(":", SEP)
86 | if (!isModule(jarPaths[i])) {
87 | println(jarPaths[i] + " is not a module !!")
88 | return false
89 | }
90 | jarPaths[i] += jarPathSuffix
91 | }
92 | }
93 | if (assetsPaths != null && assetsPaths.size() > 0) {
94 | for (int i = 0; i < assetsPaths.length; i++) {
95 | assetsPaths[i] = projectPath + SEP + assetsPaths[i].replace(":", SEP) + ASSETS_SUFFIX
96 | }
97 | }
98 | return true
99 | }
100 |
101 | def isModule(String path) {
102 | File file = new File(path + SEP + "build.gradle")
103 | return file.exists()
104 | }
105 |
106 | def addFilesFromJars(String[] paths, JarOutputStream jarOutputStream) {
107 | for (String path : paths) {
108 | if (!new File(path).exists()) {
109 | println("create fat jar failed,missing " + path)
110 | break
111 | }
112 | addFilesFromJar(path, jarOutputStream)
113 | }
114 | }
115 |
116 | def addFilesFromJar(String path, JarOutputStream jarOutputStream) {
117 | def jarFile = new JarFile(path)
118 | Enumeration> entries = jarFile.entries()
119 | while (entries.hasMoreElements()) {
120 | JarEntry entry = (JarEntry) entries.nextElement()
121 | if (entry.isDirectory() || entry.getName().toUpperCase().startsWith(META_INF)) {
122 | continue
123 | }
124 |
125 | InputStream inputStream = jarFile.getInputStream(entry)
126 | copyDataToJar(inputStream, jarOutputStream, entry.getName())
127 | }
128 | println("added " + path)
129 | jarFile.close()
130 | }
131 |
132 | def copyDataToJar(InputStream inputStream, JarOutputStream jarOutputStream, String entryName) {
133 | int bufferSize
134 | byte[] buffer = new byte[1024]
135 |
136 | try {
137 | jarOutputStream.putNextEntry(new JarEntry(entryName))
138 | } catch (ZipException e) {
139 | e.printStackTrace()
140 | inputStream.close()
141 | jarOutputStream.closeEntry()
142 | return
143 | }
144 | while ((bufferSize = inputStream.read(buffer, 0, buffer.length)) != -1) {
145 | jarOutputStream.write(buffer, 0, bufferSize)
146 | }
147 |
148 | inputStream.close()
149 | jarOutputStream.closeEntry()
150 | }
151 |
152 | def getManifest() {
153 | def manifest = new Manifest()
154 | def attribute = manifest.getMainAttributes()
155 | attribute.putValue("Manifest-Version", version)
156 | attribute.putValue("Created-By", owner)
157 | return manifest
158 | }
159 |
160 | //1.0.0里的广度优先搜索,1.0.2之后不需要了。
161 | /* def getCompletePath(String module) {
162 | String path = projectPath
163 | File file = new File(path)
164 | String[] fileNames = file.list()
165 | LinkedList queue = new LinkedList<>()
166 | for (String name : fileNames) {
167 | queue.add(path + SEP + name)
168 | }
169 | while (queue.size() > 0) {
170 | String curPath = queue.removeFirst()
171 | if (isModule(curPath)) {
172 | String temp = new String(curPath)
173 | String[] names = temp.replaceAll("\\\\", "/").split("/")
174 | if (module.equals(names[names.length - 1])) {
175 | return curPath + pathSuffix
176 | }
177 | } else {
178 | File file1 = new File(curPath)
179 | String[] names = file1.list()
180 | for (String name : names) {
181 | queue.add(curPath + SEP + name)
182 | }
183 | }
184 | }
185 | println("cannot find module : " + module)
186 | return null
187 | }*/
188 |
189 | }
190 |
--------------------------------------------------------------------------------
/lib/src/main/resources/META-INF/gradle-plugins/FatJarPlugin.properties:
--------------------------------------------------------------------------------
1 | implementation-class=xyz.bboylin.plugin.FatJarPlugin
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | ### FatJar:适用于sdk多module打包和合并多个jar的gradle插件
2 | ----
3 |
4 | [  ](https://bintray.com/bboylin/FatJarPlugin/FatJarPlugin/_latestVersion)
5 | #### usage:
6 |
7 | 1.下载[fatJar.gradle](https://raw.githubusercontent.com/bboylin/FatJar/1b3906361e68eac3c30283b6dc7224ee3f673a56/fatJar.gradle)放置于project根目录
8 |
9 | 2.在project的build.gradle中添加依赖和配置:
10 | ```groovy
11 | apply from: 'fatJar.gradle'
12 | buildscript {
13 | dependencies {
14 | classpath 'xyz.bboylin:FatJarPlugin:1.0.5'
15 | }
16 | }
17 |
18 | //可配置项
19 | fatJarExt {
20 | //这里可配置需要打包的module名和需要加入的第三方jar绝对路径
21 | jarPaths = ["/github/okhttp.jar",
22 | "libtwo",
23 | "commonlib"]
24 | //配置需要添加assets的module名,没有可删掉此项
25 | assetsPaths = ["libtwo","commonlib"]
26 | //最后output的jar名
27 | output = "result.jar"
28 | //manifest中created-by的值
29 | owner = "your name or your organization"
30 | //manifest中version的值
31 | version = 'your sdk version'
32 | //只打debug包的话加上这句,只打release包的话不加
33 | isDebug = true
34 | }
35 | ```
36 | 3.项目根目录下命令行执行`gradlew fatJar`即可。
37 |
38 | 
39 |
40 | ### 注意:
41 | 如果你的module不在项目根目录下,比如`D:\MyApplication\components\libone`和`D:\MyApplication\components\player\bdplayer`,`D:\MyApplication`是我的项目根目录,那你不能直接写"libone",要改为"components:libone",即module用相对路径。示例:
42 | ```groovy
43 | fatJarExt {
44 | jarPaths = ["/github/okhttp.jar"
45 | ,"libtwo",
46 | ,"commonlib"
47 | ,"components:libone"
48 | ,"components:player:bdplayer"]
49 | assetsPaths = ["libtwo"
50 | ,"components:libone"
51 | ,"components:player:bdplayer"]
52 | //最后output的jar名
53 | output = "result.jar"
54 | //manifest中created-by的值
55 | owner = "your name or your organization"
56 | //manifest中version的值
57 | version = 'your sdk version'
58 | //只打debug包的话加上这句,不加默认只打release包
59 | isDebug = true
60 | }
61 | ```
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':lib'
2 |
--------------------------------------------------------------------------------