Android Studio增加单元测试

目前最新版本的Android Studio(1.3.1)默认对测试是支持的,所以现在不需要在build.gradle中添加任何的设置语句。

对于以前的项目新增单元测试的情况,其实非常的简单,只需要在"工程目录->app->src"目录下面新建"androidTest",然后新建与项目目录完全相同的目录即可,如下图所示:

Android_Studio_Unit_Test

至于运行单元测试的方式,"app" 目录右击,点击菜单中的“Run All Test”即可,如下图所示:

Android_Studio_Run_Debug_Unit_Test

 

如果需要单独测试某个文件,则只需要在对应的测试文件中右击,选择运行即可,如下图:

Android_Studio_Unit_Test_Sigle_File

Android Studio 1.2 开发JNI工程

  • 添加native接口

注意写好native接口和System.loadLibrary()即可了,并无特别之处。

public class MainActivity extends Activity{
    static {
        System.loadLibrary("JniTest");
    }
   
    public native String getStringFromNative();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView txtView = (TextView) findViewById(R.id.txt);
        txtView.setText(getStringFromNative());
    }
}
  • 执行Build->Make Project

20141215184150750
这一步骤执行一下,验证工程中并无其它错误,并对工程进行了编译,生成了.class文件.
.class文件的生成路径是在 app_path/build/intermediates/classes/debug下的.如下图:20141215184245654

  • javah生成c头文件

点击"View->Tool Windows->Terminal",即在Studio中进行终端命令行工具.执行如下命令生成c语言头文件。
这里需要注意的是要进入 \app\src\main的目录下执行javah命令,为的是生成的 .h 文件同样是在\app\src\main路径下,可以在Studio的工程结构中直接看到。

$ cd app/src/main

$ javah -d jni -classpath %Android_SDK_Home%\platforms
\android-21\android.jar;..\..\build\intermediates\classes\debug lab.sodino.jnitest.MainActivity

最后的生成结果:20141215184427109

  • 编辑c文件

在main.c文件中实现头文件中的方法,具体功能为直接return回一个String,并且使用android_log打印出相关日志。
代码如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <android/log.h>

#ifndef LOG_TAG
#define LOG_TAG "ANDROID_LAB"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif

/* Header for class lab_sodino_jnitest_MainActivity */

#ifndef _Included_lab_sodino_jnitest_MainActivity
#define _Included_lab_sodino_jnitest_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class: lab_sodino_jnitest_MainActivity
 * Method: getStringFromNative
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_lab_sodino_jnitest_MainActivity_getStringFromNative
  (JNIEnv * env, jobject jObj){
      LOGE("log string from ndk.");
      return (*env)->NewStringUTF(env,"Hello From JNI!");
  }

#ifdef __cplusplus
}
#endif
#endif
    •  配置NDK

20141215184556957

  • Jni目录下手工创建Application.mk

里面内容如下:

APP_PLATFORM := android-21
  • Jni目录下手工创建Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE:= JniTest

LOCAL_LDLIBS+= -L$(SYSROOT)/usr/lib -llog

LOCAL_SRC_FILES := main.c 
					
include $(BUILD_SHARED_LIBRARY)

再执行"Build->Rebuild Project",就可以编译出so文件了.

如果

Android_studio_jni

跟我的代码布局类似,增加了一个include目录,里面包含引用的第三方头文件,那么就比较折腾,因为编译的时候会报告找不到头文件,而通过设置

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include/

是可以通过命令行编译通过的,但是却不能在Gradle中编译通过。

这种情况下,需要放弃Android Studio 自带的配置,修改app目录下的“build.gradle”

原始内容如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "mobibrw.longsky.com.sctpclient"
        minSdkVersion 21
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

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

修改后的内容如下:

import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "mobibrw.longsky.com.sctpclient"
        minSdkVersion 21
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets.main {
        jni.srcDirs = []
        jniLibs.srcDir './src/main/libs'
    }

    task ndkBuild(type:Exec) {
        def Properties localProps = new Properties()
        localProps.load(new FileInputStream("local.properties"))
        def ndk_dir = localProps['ndk.dir']
        def ndk_build_cmd = "$ndk_dir/ndk-build"
        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
            ndk_build_cmd = "$ndk_dir/ndk-build.cmd"
        }
        commandLine ndk_build_cmd, '-j', Runtime.runtime.availableProcessors(),"NDK_OUT=$buildDir/native/obj","NDK_PROJECT_PATH=./src/main"
    }

    tasks.withType(JavaCompile) {
        compileTask->compileTask.dependsOn ndkBuild
    }
}

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

参考 http://blog.csdn.net/sodino/article/details/41946607

Android Studio *.jar 与 *.aar 的生成与*.aar导入项目方法

Android Studio的一个好处在于Android函数库包格式“aar”格式。以前,Android函数库通常需要被导入到IDE以此将App需要的资源加入编译。但是现在的Android函数库可以被直接包含,与“jar”文件被Java项目包含的方式类似。这项功能虽然出现已久,但确实非常受欢迎。

  • Android Studio新建一个Library

1.点击“New Module”

Android_Studio_New_Module_Menu

2.选中新建“Android Library”Android_Studio_New_Module_Libary_Wards

3.根据向导一步一步继续下去就可以了。

  • 简单介绍

在Android Studio中对一个自己库进行生成操作时将会同时生成*.jar与*.aar文件。

分别存储位置:

*.jar:库 /build/intermediates/bundles/debug(release)/classes.jar

*.aar:库 /build/outputs/aar/libraryname.aar

两者区别:

*.jar: 只包含了class文件与清单文件 ,不包含资源文件,如图片等所有res中的文件。

*.aar: 包含所有资源 ,class以及res资源文件全部包含

如果你只是一个简单的类库那么使用生成的*.jar文件即可;如果你的是一个UI库,包含一些自己写的控件布局文件以及字体等资源文件那么就只能使用*.aar文件。

使用方式:

*.jar:拷贝到:libs目录,eclipse直接导入即可,AndroidStudio项目中添加:

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

重新编译一次项目既可完成加载。

*.aar:有两种方式,分别为本地加载以及网络加载,由于网络加载涉及到发布到mavenCentral托管的问题这里不做讨论;另外eclipse很久没有使用了也不做讨论;在这里给大家说一种本地加载的方式,简单快捷。

这里演示的aar文件为: “genius.aar”

第一步:拷贝到:libs目录

第二步:build.gradle 配置文件中更改为

repositories {
    flatDir {
        dirs 'libs'
    }
}
dependencies {
    compile(name:'genius', ext:'aar')
}

分别添加了 “repositories” 与更改了 “dependencies” ,然后重新编译一次项目就可以正常使用了。

这时打开你的项目地址 “\build\intermediates\exploded-aar\” 你会发现下面多了一个文件夹 “genius”打开后能看见里边包含了一个 “classes.jar” 文件与一些 资源文件和“R.txt”文件 。

r6BBviN

这就是Android Studio自动解析了aar文件后出现的东西。

对于比较常见的项目配置,有如下的参考,可以看到带版本号的情况,使用的aar跟jar文件还是有差别的,aar文件,最后要增加一个“@aar”的标记。

dependencies {
    androidTestCompile 'junit:junit:4.+'
    compile fileTree(dir: 'libs', include: '*.jar')
    compile 'com.github.flavienlaurent.datetimepicker:library:0.0.2'
    compile 'de.keyboardsurfer.android.widget:crouton:1.8.4@aar'
    compile 'com.google.android.apps.dashclock:dashclock-api:2.0.0'
}

参考链接


[Android][Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法

Android Studio如何Import Module 即项目依赖(针对非Gradle项目,以Crosswalk为例)

我们要写一个使用CrosswalkWebView的项目,就要依赖Crosswalk的工程,在Eclipse中存在Workspace的概念,对应到Android Studio 就变成了Module.

我们下载到的Crosswalk-WebView的工程是Eclipse建立的项目,此时项目是不能被Android Studio直接引用的,因此需要导入成Android Studio项目的一个Module。

  • 导入Module

1.选择"Import Module"菜单

选择导入Android Studio项目的一个Module
选择导入Android Studio项目的一个Module

2.选择项目的路径,并且重命名 Module Name

导入项目路径并且重命名Module的名字
导入项目路径并且重命名Module的名字

3.完成导入

导入项目的最后一步
导入项目的最后一步

4.查看导入完成后的项目中,出现了新导入的 "CrosswalkWebview",实质上是拷贝了所需要的文件到工程的目录中

导入完成后的模块,出现在工程中
导入完成后的模块,出现在工程中

  • 设置Module之间项目依赖

1.选择"Open Module Settings"
Config_Module_Settings

2.设置模块依赖Module_Depends_Setting

3.选择依赖的ModuleModule_Depends_Select

4.选中依赖的模块,点击“OK”Checked_Selected_Modules

Android Studio中创建keystore

一直在Eclipse中开发`Android`,切换到`Android Studio`中之后,各种不习惯。基本的创建`keystore`文件的操作也是找了半天才找到。

1.点击Build ,在下拉框中选择 "Generate Signed APK"

Signed_APK

2.选择 "Create new"

New_APK_Wizard

3.按照里面的内容填写即可,注意最后文件的扩展名变为".jks",而不是以前的".keystore".

New_Key_Store

注意:最新的`Android Studio 4.x`版本已经没办法按照上面的办法创建证书了,创建证书会报告如下错误:

解决方法是在`Android Studio`的命令行中执行证书创建命令,创建`pkcs12`格式的证书,如下:

$ keytool -deststoretype pkcs12 -genkeypair -alias ka -keystore ks.p12 -keyalg RSA

参考下图:

根据提示,补充内容即可。

`Android Studio`中使用证书:

signingConfigs {
	release {
		File strFile = new File("ks.p12")
		storeFile file(strFile)
		keyAlias 'ka'
		keyPassword 'password'
		storePassword 'password'
	}
	debug {
		File strFile = new File("ks.p12")
		storeFile file(strFile)
		keyAlias 'ka'
		keyPassword 'password'
		storePassword 'password'
	}
}

buildTypes {
	release {
		signingConfig signingConfigs.release
		minifyEnabled false
		proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
	}
	debug {
		signingConfig signingConfigs.debug
	}
}

参考链接


使用keytool 生成证书