今天咱们看看android studio的jar打包,但是jar包里面呢res文件是用不了的,那想用图片文件怎么办呢,这里可以把图片文件放进assets文件里面打进jar包调用还是可以得,但是有点小小的瑕疵就是jar里面assets文件夹里面的文件不能跟调用项目里面assets文件夹里面的文件重名。
好了,接下来看看到底该如何弄呢?首先第一步肯定是需要创建一个项目,这里就不演示了。
第二步:咱们需要在项目里面新new出一个module,请看图:
第三步:new了module之后呢就需要创建咱们需要调用的jar里面的代码和gradle导包需要的一些代码,这里呢我们写的代码有部分是需要调用资源图片的,所以我们这里在src\main路径里面创建一个assets文件夹,并给里面一张图片。当然了,我们打出的jar给别人用肯定是要安全点,这里呢需要加上混淆的代码了。帖完图之后我会把几个需要的代码给粘贴出来供大家参考。请看图:
这里是java代码,我这里呢就写了一个log打印,toast提示,和一个调用assets文件图片的代码。请看代码:
package com.wyw.mylibrary;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import java.io.InputStream;
/**
* Created by wyw on 2016/9/27.
*/
public class Logs {
public static void error () {
LogUtli.e();
}
public static Bitmap getAssets (Context context) {
Bitmap bitmap = null ;
try {
InputStream resourceAsStream = context.getClass().getClassLoader().getResourceAsStream("assets/" + "aabb" );
bitmap = BitmapFactory.decodeStream(resourceAsStream);
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
}
package com.wyw.mylibrary;
import android.util.Log;
/**
* Created by wyw on 2016/9/27.
*/
public class LogUtli {
public static void e () {
Log.e("123456" , "eeeeeeeee" );
}
public static void v () {
Log.v("123456" , "vvvvvvvv" );
}
public void i () {
Log.i("123456" , "iiiiiiiii" );
}
private void d () {
Log.d("123456" , "ddddddddd" );
}
}
package com.wyw.mylibrary;
import android.content.Context;
import android.widget.Toast;
/**
* Created by wyw on 2016/9/27.
*/
public class ToastUtil {
public static void show (Context context, String txt) {
adshow(context, txt);
}
private static void adshow (Context context, String txt) {
Toast.makeText(context, txt, Toast.LENGTH_LONG).show();
}
}
接下来就是module里面的build.gradle代码,最主要的一段就是上面截图那部分。请看代码:
apply plugin: 'com.android.library'
android {
compileSdkVersion 24
buildToolsVersion "23.0.3"
defaultConfig {
minSdkVersion 19
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt' ), 'proguard-rules.pro'
}
}
}
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.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
}
def SDK_BASENAME = "wywSdk_V1.0" ;
def sdkJarPath = "build" ;
def zipFile = file('build/intermediates/bundles/release/classes.jar' )
task makeJar(type : Jar) {
from zipTree(zipFile)
from fileTree(dir: 'src/main' , includes: ['assets/**' ])
baseName = SDK_BASENAME
destinationDir = file(sdkJarPath)
}
makeJar.dependsOn(build)
因为我们用了混淆,所以android studio 默认混淆文件proguard-rules.pro里面肯定要写一部分混淆的逻辑的,因为外部调用的代码是不能混淆的,不然外面调用的变成了a类a方法了。所以这里外面调用的是ToastUtil和Logs类,所以这2个类不能混淆,而LogUtli我们就不管了让他混淆。请看图和代码:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class /merging /*
-keep public class com .wyw .mylibrary .ToastUtil {
public protected *;
}
-keep public class com .wyw .mylibrary .Logs {
public protected *;
}
第四步:现在咱们一切就绪了,就差打包了。好了,我们现在需要在android studio 最下面那排里面有个终端“Terminal”点击它。到终端后路径先指定到你项目的目录,然后输入gradlew makeJar这个命令。由于有的人可能打开终端的时候目录不是项目目录,你这里就需要自己手动指定到你的项目目录,至于怎么弄去百度吧,这个很多的。接下来就是按回车了,如果你是第一次用,它会先去下载文件大概几分钟吧,下完之后再运行次就可以了。请看图:
运行完之后呢,在module项目里面build文件夹下面有个jar包,这就是我们要的jar包,现在就可以把它拷贝到我们的主项目里面去了,请看图:
这里说一句就是如果改了module代码需要重新打jar包,我建议先删除build里面的部分文件,图中带红框的都需要删除,重新生成会省很多事。请看图:
第五步:把jar拷贝进了主项目,现在我们需要写一下依赖,在主项目项目的build.gradle文件里面添加这段代码compile files(‘libs/wywSdk_V1.0.jar’),添加完之后再按右上角sync Now,重新build一下。请看图:
第六步:jar和依赖都弄好了,现在我们就需要去调用了。请看图和代码:
package com.wyw.myapplication;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.widget.ImageView;
import com.wyw.mylibrary.Logs;
import com.wyw.mylibrary.ToastUtil;
public class MainActivity extends Activity {
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView = (ImageView) findViewById(R.id.imageView);
Bitmap assets = Logs.getAssets(MainActivity.this );
if (assets != null ) {
imageView.setImageBitmap(assets);
}
Logs.error();
ToastUtil.show(MainActivity.this , "哈哈哈哈哈哈哈" );
}
}
运行验证下,看下图我们明白了jar打好了,并且assets文件夹里面的图片也调用到了。请看图:
如果细心的看下会发现我们的jar包里面的a类里面的方法就只有一个了。原本混淆类的方法是有4个的,为什么会变的只有一个了呢,这个就是混淆的规则了就是混淆的代码只有调用的部分才会打包进去,而没有混淆的代码是全部打包进去。请看图的对比(灰色的方法是没有被调用):
好了,本篇博客就到这里,如果有疑问的欢迎留言讨论。同时希望大家多多关注我的博客,多多支持我。