㈠ 如何为android NDK的gradle构建文件中指定NDK
我一直在尝试过解决这个问题。但在通过编写自定义任务,使Android工作室在Eclipse中使用Application.mk和Android.mk就像结束了。
我的build.gradle看起来像这样
应用插件:'com.android.application“安卓{ buildTypes {
发布 {
runProguard假
proguardFiles getDefaultProguardFile('proguard的-android.txt'),'proguard-rules.pro“
}
} compileOptions {
sourceCompatibility javaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
} compileSdkVersion 20
buildToolsVersion“20.0.0” defaultConfig {
15的minSdkVersion
targetSdkVersion 20
版本code 1
} packagingOptions {
排除“META-INF /相关内容”
排除“META-INF / LICENSE”
排除“META-INF /注意事项”
} sourceSets.main {
jniLibs.srcDir'的src / main /库“
jni.srcDirs = [] //禁用自动NDK的构建通话
}
}任务buildNative(类型:执行){
高清ndkBuild = NULL;
高清ndkBuildingDir =新的文件(“钢骨混凝土/主/ JNI”);
高清hasNdk = FALSE;
如果(System.getenv(“NDK_BUILD_CMD”)!= NULL){
hasNdk = TRUE;
ndkBuild =新的文件(System.getenv(“NDK_BUILD_CMD”))
} 命令行ndkBuild,“--directory”,ndkBuildingDir doFirst {
如果(!hasNdk){
logger.error('##################')
logger.error(“NDK构建失败!”)
logger.error('原因:NDK_BUILD_CMD未设置。')
logger.error('##################')
}
断言hasNdk:“NDK_BUILD_CMD未设置。”
}
}
tasks.withType(JavaCompile){compileTask - > compileTask.dependsOn buildNative}任务cleanNative(类型:执行){
高清ndkBuild = NULL;
高清ndkBuildingDir =新的文件(“钢骨混凝土/主/ JNI”);
高清hasNdk = FALSE; 如果(System.getenv(“NDK_BUILD_CMD”)!= NULL){
hasNdk = TRUE;
ndkBuild =新的文件(System.getenv(“NDK_BUILD_CMD”))
} 命令行ndkBuild,“--directory”,ndkBuildingDir,“干净” doFirst {
如果(!hasNdk){
logger.error('##################')
logger.error(“NDK构建失败!”)
logger.error('原因:NDK_BUILD_CMD未设置。')
logger.error('##################')
}
断言hasNdk:“NDK_BUILD_CMD未设置。”
}
}
clean.dependsOn“cleanNative”
对于这个工作,你需要设置一个环境变量NDK_BUILD_CMD要设置的确切NDK建造可执行文件。
在Windows上,你可以设置环境变量NDK_BUILD_CMD点到你的NDK-build.exe
在Mac上,你在你的.bash_profile设置路径变量不在GUI应用程序访问(因此Android的Studio将无法读取它们)。
所以,编辑你的.bash_profile是像
GRADLE_HOME = {} path_to_gradle
ANDROID_SDK_ROOT = {} path_to_sdk_dir
ANDROID_HOME = $ ANDROID_SDK_ROOT /平台的工具
ANDROID_NDK_HOME = {} path_to_ndk
NDK_BUILD_CMD = $ ANDROID_NDK_HOME / NDK的构建出口PATH=$GRADLE_HOME/bin:$ANDROID_HOME:$ANDROID_SDK_ROOT/tools:$ANDROID_NDK_HOME:/opt/local/bin:/opt/local/sbin:$PATHlaunchctl SETENV GRADLE_HOME $ GRADLE_HOME
launchctl SETENV ANDROID_HOME $ ANDROID_HOME
launchctl SETENV ANDROID_NDK_HOME $ ANDROID_NDK_HOME
launchctl SETENV NDK_BUILD_CMD $ NDK_BUILD_CMD
该launchctl线将使您的环境变量的Android Studio中可见。
PS:本.bash_profile中运行每次打开终端的时间。因此,对于这个正确与Android工作室工作,你需要启动一次终端,然后运行Android的工作室。否则,构建就会失败说NDK_BUILD_CMD未设置。我还没有发现任何方式的Mac启动时设置的值。如果有人能找到一个办法,请随时提出。
㈡ android如何使用lambda表达式
在Java8之前,Java并不支持Lambda表达式,而Android目前最新也才支持到Java7特性,所以在Android中使用Lambda表达式需要进行一些处理,将Lambda表达式编译成Android可以“理解”的方式。
Retrolambda是一个能够让我们在Java7中使用Lambda的工具,再通过gradle-retrolambda插件,在gradle编译过程中将会:
将Java8中的 javac编译 Java8的代码;
将产生的Java8的字节码转换为Java6的字节码;
重新打包class。
build.gradle配置文件如下:
buildscript {
repositories {
mavenCentral()
maven {
url "https://oss.sonatype.org/content/repositories/snapshots"
}
}
dependencies {
classpath 'me.tatarka:gradle-retrolambda:1.2.+'
}
}
// Required because retrolambda is on maven central
repositories {
mavenCentral()
}
apply plugin: 'android'
apply plugin: 'retrolambda'
也可以添加如下设置:
retrolambda {
jdk System.getenv("JAVA8_HOME")
javaVersion JavaVersion.VERSION_1_6
}
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
从此以后,
strings.map(new Func1<String, Integer>() {
@Override
public Integer call(String s) {
return s.length();
}
});
可以写作:
strings.map((String s) -> {
return s.length();
});
至于详细的bytecode转换过程,有兴趣的同志们可以自己研究研究。
㈢ 安卓内外部存储完全解析 -- 别再弄混了
安卓开发离不开手机存储,然而大部分人对于安卓开发中的存储概念存在误区,内部外部SD卡傻傻分不清?
以下引用来自对 官方文档 的理解
呵呵呵,先别说话,然而重点来了(敲黑板),按照官方的说法,
内部存储是指系统的存储空间,没有root是访问不到的呦亲,比如sharedPreferenced或者database都是保存在这里面的。
外部存储,又分为 2 部分:
然而现实中,常常有同事把手机那个32G,64G存储叫做内部存储= =,宝宝好累,人家明明是 ExternalStorage !!
希望本篇能让大家对内外部存储有一个正确鲜明的认识
getFilesDir()
路径如下
文档 云:若想操作该路径,你需要一个输出流:
就像这样:
注: this 是 context 对象
在
路径下会看到新文件哦
如果你还想读取的话, 文档 云:你需要一个输入流:
Log如下
getCacheDir()
文档 云:
路径如下:
特别的,还有getDir() :
getDir("- -!.txt", Context.MODE_PRIVATE).getAbsolutePath()
路径如下:
app_是系统自己加上去的
内部存储就是系统的存储,没有root你是看不到的,内部存储最大特点就是可以用Context对象调用各个获取路径的方法。比如: context.fileList()
那就是
下的文件遍历。
而 deleteFile("ABC") 就是
删除下名为 ABC 的文件
</br></br></br>
操作外部存储你首先需要以下权限
当你申请了write权限,那么read权限默认也就通过啦
再判断状态:
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState))
Environment.getExternalStorageDirectory()
这个路径根据手机厂家不同会有些许变化
直接传入 Environment 中的常量获取相应的路径,如下:
Environment.(Environment.DIRECTORY_ALARMS));
或者
Environment.(Environment.DIRECTORY_PICTURES));
公有目录下,系统会区分不同类别 (例如铃声在系统设置中显示为铃声而不是音乐)
4.4以后访问该目录不再需要权限了
getExternalFilesDir(String type)
eg.
getExternalFilesDir(Environment.DIRECTORY_MUSIC)
特别的:ContextCompat下的
ContextCompat.getExternalFilesDirs(context,type)
返回一个File[],在4.4以后第一条数据默认外部主存储目录,第二条数据就是sd卡路径啦,但是注意4.4之前是没有第二条数据的哦
该目录下的特点是卸载程序后,该目录和其下所有文件均会被删除
getExternalCacheDir()
注意,使用该目录注意管理空间,你不能等系统帮你清理,而是自己清理不再需要的缓存
特别的:ContextCompat下的
ContextCompat.getExternalCacheDirs()
道理同上
发现特点了吗朋友,无论外部内部,只有路径中有包名,那么就是私有的,而且是随着程序的卸载而被删除的, 有包名的路径均是Context中的方法,而公有的路径均是Environment调用的
这个货真真是要了老命,一般的方法根部不好使,结合网上有的方法加上公司项目中的方法,总结如下:
百分百好用的获取SD卡路径方法:
最后集合 path 中的值就是SD卡根目录
虽然无视版本百分百好用,但是如果你的手机有SD卡槽却没插SD卡,该方法最后 path 返回的是 null ,也就是说该方法无法判断到底是没插SD卡还是根本不支持SD卡
其实还有一种方法
String path = System.getenv("SECONDARY_STORAGE");
该方法只要你手机支持SD卡,无论你插没插SD卡,均会返回SD卡路径,但是 6.0及以上该方法被移除
Environment中源码其实就是根据这个方法获取路径的
安卓官方文档大家一定要看,他就是我们开发者的权威呀,圣经呀!!
㈣ 获取android手机的自带存储路径和sdcard存储路径
android手机获取自带存储路径和sd卡存储路径的方式是:
调用Environment.getExternalStorageDirectory,返回的存储目录并不是系统内置的SD卡目录。
1、手机将eMC存储挂载到 /mnt/external_sd 、/mnt/sdcard2 等节点,而将外置的SD卡挂载到 Environment.getExternalStorgeDirectory这个结点。
Android在正式发行之前,最开始拥有两个内部测试版本,并且以着名的机器人名称来对其进行命名,它们分别是:阿童木(AndroidBeta),发条机器人(Android 1.0)。后来由于涉及到版权问题,谷歌将其命名规则变更为用甜点作为它们系统版本的代号的命名方法。
Android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。