Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 使用gradle導出jar包,並包含assets資源文件夾

android 使用gradle導出jar包,並包含assets資源文件夾

編輯:關於Android編程

今天咱們看看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'
}
//打jar包
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)
//在終端執行生成JAR包
// gradlew makeJar

因為我們用了混淆,所以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個的,為什麼會變的只有一個了呢,這個就是混淆的規則了就是混淆的代碼只有調用的部分才會打包進去,而沒有混淆的代碼是全部打包進去。請看圖的對比(灰色的方法是沒有被調用):

這裡寫圖片描述

這裡寫圖片描述


好了,本篇博客就到這裡,如果有疑問的歡迎留言討論。同時希望大家多多關注我的博客,多多支持我。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved