androidandroidmk
『壹』 android mk文件怎麼打開
.mk後綴名文件類型:Makefile擴展名為.mk的文件是一個開發文件。Makefile規則如下所示目標:依賴文件列表命令列表1、目標通常是要產生的文件名稱,目標可以是可執行文件或obj文件,也可是一個動作的名稱.2、依賴文件是用來輸入從而產生目標的文件
『貳』 android.mk ubuntu怎麼編譯
一個Android.mk file用來向編譯系統描述你的源代碼。具體來說:該文件是GNU Makefile的一小部分,會被編譯系統解析一次或多次。你可以在每一個Android.mk file中定義一個或多個模塊。每個模塊屬下列類型之一:
1)APK程序,一般的Android程序,編譯打包生成apk文件
2)java庫,java類庫,編譯打包生成jar文件
3) CC++應用程序,可執行的CC++應用程序
4)CC++靜態庫,編譯生成CC++靜態庫,並打包成.a文件
5)CC++共享庫,編譯生成共享庫(動態鏈接庫),並打包成.so, 有且只有共享庫才能被安裝/復制到您的應用軟體(APK)包中。
(1)先看一個簡單的例子:一個簡單的"hello world",比如下面的文件:
sources/helloworld/helloworld.c
sources/helloworld/Android.mk
相應的Android.mk文件會像下面這樣:
---------- cut here ------------------
普通的.mk一樣
=====================================m、mm、mmm編譯命令===========================================
android源碼目錄下的build/envsetup.sh文件,描述編譯的命令
- m: Makes from the top of the tree.
- mm: Builds all of the moles in the current directory.
- mmm: Builds all of the moles in the supplied directories.
所以要想使用這些命令,首先需要在android源碼根目錄執行build/envsetup.sh 腳本設置環境。
m:編譯所有的模塊
mm:編譯當前目錄下的模塊,當前目錄下要有Android.mk文件
mmm:編譯指定路徑下的模塊,指定路徑下要有Android.mk文件
下面舉個例子說明,假設我要編譯android下的hardwarelibhardware_legacypower模塊,當前目錄為源碼根目錄,方法如下:
1、. build/envsetup.sh
2、mmm hardware/libhardware_legacy/power/
或者 :
1、. build/envsetup.sh
2、cd hardware/libhardware_legacy/power/
3、mm
m沒有試過。默認上述兩個編譯命令,只編譯發生變化的文件。如果要編譯模塊的所有文件,需要-b選項,例如mm -b或者mmm -b
make命令,也可以用來編譯。如果是include $(BUILD_PACKAGE),用makeLOCAL_PACKAGE_NAME值;如果是include $(BUILD_EXECUTABLE)或者include $(BUILD_JAVA_LIBRARY),用makeLOCAL_MODULE值(未驗證)。
『叄』 android mk文件怎麼加混淆
針對android 選擇user版本進行編譯的時候,會出現proguard錯誤,我們需要知道的事情
1.proguard是做什麼的,他的作用是將java代碼進行混淆的工具
2.因為proguard是混淆工具,所以android的mk文件也對其支持為兩種方式:
1.指定不需要混淆的native方法與變數的proguard.flags文件
如:LOCAL_PROGUARD_FLAG_FILES := proguard.flags
2.制定編譯的工程,不要使用代碼混淆的工具進行代碼混淆
如:LOCAL_PROGUARD_ENABLED := disabled
3.不設置,默認使用LOCAL_PROGUARD_ENABLED := full.即將該工程代碼全部混淆
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在Android項目中用到JNI,當用了proguard後,發現native方法找不到很多變數,原來是被proard優化掉了。所以,在JNI應用中該慎用progurad啊。
解決辦法:
1、在Android.mk中加入一行:
LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags
2、創建proguard.flag文件,裡面寫入不需要proguard優化的類和方法。例如:
-keep class oms.miracle.mobiletv.broadcast.ServiceContext {
*;
}
我的這個類是和JNI相關的,不想讓proguard去優化而引起錯誤,向上面寫就能實現。
----------下面是網上找到的一些proguard的資料,貼出來分享:
ProGuard是一個免費的java類文件壓縮,優化,混淆器.它探測並刪除沒有使用的類,欄位,方法和屬性.它刪除沒有用的說明並使用位元組碼得到最大優化.它使用無意義的名字來重命名類,欄位和方法.
ProGuard的使用是為了:
1.創建緊湊的代碼文檔是為了更快的網路傳輸,快速裝載和更小的內存佔用.
2.創建的程序和程序庫很難使用反向工程.
3.所以它能刪除來自源文件中的沒有調用的代碼
4.充分利用java6的快速載入的優點來提前檢測和返回java6中存在的類文件.
參數:
-include {filename} 從給定的文件中讀取配置參數
-basedirectory {directoryname} 指定基礎目錄為以後相對的檔案名稱
-injars {class_path} 指定要處理的應用程序jar,war,ear和目錄
-outjars {class_path} 指定處理完後要輸出的jar,war,ear和目錄的名稱
-libraryjars {classpath} 指定要處理的應用程序jar,war,ear和目錄所需要的程序庫文件
- 指定不去忽略非公共的庫類。
- 指定不去忽略包可見的庫類的成員。
保留選項
-keep {Modifier} {class_specification} 保護指定的類文件和類的成員
-keepclassmembers {modifier} {class_specification} 保護指定類的成員,如果此類受到保護他們會保護的更好
-keepclasseswithmembers {class_specification} 保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。
-keepnames {class_specification} 保護指定的類和類的成員的名稱(如果他們不會壓縮步驟中刪除)
-keepclassmembernames {class_specification} 保護指定的類的成員的名稱(如果他們不會壓縮步驟中刪除)
-keepclasseswithmembernames {class_specification} 保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之後)
-printseeds {filename} 列出類和類的成員-keep選項的清單,標准輸出到給定的文件
『肆』 android.mk是在什麼情況下生成的
當你需要使用JNI的時候,你需要創建一個native工程。Android.mk就是一個makefile配置文件,幫你把C/C++的代碼編譯成動態庫so的。
創建的方式有兩種:
在工程根目錄裏手動創建一個目錄叫jni,在裡面新建一個Android.mk,然後創建c,cpp文件,把他們配置到Android.mk里。
右鍵工程,選擇Android Tools->Add Native Support自動生成。
(4)androidandroidmk擴展閱讀:
創建Android庫
Android 庫在結構上與 Android 應用模塊相同。可以提供構建應用所需的一切內容,包括源代碼、資源文件和 Android 清單。
不過,Android 庫將編譯到可以用作 Android 應用模塊依賴項的 Android 歸檔 (AAR:Android Archive Resource) 文件,而不是在設備上運行的 APK。
與 JAR 文件不同,AAR 文件可以包含 Android 資源和一個清單文件,這樣,除了 Java 類與方法外,還可以捆綁布局和可繪制對象等共享資源。
庫模塊在以下情況下非常有用:
構建使用某些相同組件(例如 Activity、服務或 UI 布局)的多個應用。
構建存在多個 APK 變體(例如免費版本和付費版本)的應用並且需要在兩種版本中使用相同的核心組件。
『伍』 android.mk 這個文件在哪裡 我怎麼找不到
android.mk 是Android開發中,用來編譯JNI代碼的
在開發工具中,new JNI 即可創建一個 android.mk文件
一個Android.mk文件可以編譯多個模塊,每個模塊屬下列類型之一:
APK程序 一般的Android程序,編譯打包生成apk文件
JAVA庫 java類庫,編譯打包生成jar文件
CC++應用程序 可執行的CC++應用程序
CC++靜態庫 編譯生成CC++靜態庫,並打包成.a文件
CC++共享庫 編譯生成共享庫(動態鏈接庫),並打包成.so文, 有且只有共享庫才能被安裝/復制到您的應用軟體(APK)包中。
『陸』 android studio怎麼創建ndkclass.c和android.mk文件
Android.mk文件首先需要指定LOCAL_PATH變數,用於查找源文件,宏函數』my-dir』, 由編譯系統提供。由於一般情況下Android.mk和需要編譯的源文件在同一目錄下,所以定義成如下形式:
LOCAL_PATH:=$(call my-dir)
上面的語句的意思是 將LOCAL_PATH變數定義成 本文件所在 目錄路徑。
一個 Android.mk中 可以 定義 多個編譯模塊,每個編譯模塊 都是 以include $(CLEAR_VARS)開始
以include $(BUILD_XXX)結束
相關鏈接:http://blog.csdn.net/wh_19910525/article/details/7518190
『柒』 Android.mk介紹(一)
在Linux下,可以通過Makefile來對源碼工程進行管理,Android.mk文件是Makefile的一小部分,它用來對Android程序進行編譯。Android.mk文件中描述了哪些C文件將被編譯且指明了如何編譯。Android.mk文件用來告知NDK Build 系統關於Source的信息。
1、編譯可執行程序
2、編譯動態庫或靜態庫
3、預編譯文件(APK或Java庫)
以上三種是Android.mk的主要用法,我們寫mk文件時也就是以上三種目的。
首先看一個最簡單的Android.mk的例子:
講解:
每個Android.mk文件必須以定義 LOCAL_PATH 為開始。它用於在開發tree中查找源文件。
宏 my-dir 由Build System提供。返回包含Android.mk的目錄路徑。
CLEAR_VARS 變數由Build System提供。並指向一個指定的GNU Makefile,由它負責清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理 LOCAL_PATH .
這個清理動作是必須的,因為所有的編譯控制文件由同一個GNU Make解析和執行,其變數是全局的。所以清理後才能避免相互影響。
LOCAL_MODULE 模塊必須定義,以表示Android.mk中的每一個模塊。名字必須唯一且不包含空格。
Build System會自動添加適當的前綴和後綴。例如,foo,要產生動態庫,則生成libfoo.so.
但請注意:如果模塊名被定為:libfoo.則生成libfoo.so. 不再加前綴。
LOCAL_SRC_FILES變數必須包含將要打包如模塊的C/C++ 源碼。
不必列出頭文件,build System 會自動幫我們找出依賴文件。
預設的C++源碼的擴展名為.cpp. 也可以修改,通過LOCAL_CPP_EXTENSION。
BUILD_SHARED_LIBRARY:是Build System提供的一個變數,指向一個GNU Makefile Script。
它負責收集自從上次調用include $(CLEAR_VARS) 後的所有LOCAL_XXX信息。並決定編譯為什麼。
BUILD_STATIC_LIBRARY:編譯為靜態庫。
BUILD_SHARED_LIBRARY :編譯為動態庫
BUILD_EXECUTABLE:編譯為Native C可執行程序
BUILD_PACKAGE(既可以編apk,也可以編資源包文件,但是需要指定LOCAL_EXPORT_PACKAGE_RESOURCES:=true)
BUILD_JAVA_LIBRARY(Java共享庫)
BUILD_STATIC_JAVA_LIBRARY(java靜態庫)
Android源碼中有大量的mk文件,Android系統的編譯就是靠著這些mk文件的,所以學好是非常有必要的哦!
『捌』 怎樣在Android.mk上加宏定義
在Boardconfig.mk
中添加一個
IS_FLAG := true
由於Boardconfig.mk和各目錄的Android.mk是相互關聯的
所以我們可以在Android.mk 中添加
一個
ifdef IS_FLAG
LOCAL_CFLAGS += -DHHHH
endif
在Android.mk中添加的這行相當於在 該目錄下的文件中定義了一個宏
#define HHHH