㈠ 如何為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內核層。