Android Studio生成和引用.aar庫檔案
先來句綜述:.aar和.jar庫檔案的區別
aar 檔案是建立在 jar 檔案的基礎之上, aar 是 jar 檔案的一個變種。其實他們本質上沒有什麼區別,都是壓縮包,只是能包含的內容不一樣。
jar只包含了class檔案與清單檔案。雖然也能包含資原始檔,但不過是文字資源和圖片資源,不能包含Android平臺下的drawable以及各種xml檔案.
aar包括的東西更多一些,包含所有資原始檔、第三方庫檔案、so 檔案、class以及res資原始檔全部包含。
詳細的說明請參考官方開發文件:(自備梯子)
https://developer.android.com/studio/projects/android-library.html#AddDependency
下面就使用做一個簡要說明:
背景:
如果自己寫的一個專案,包含各種UI和res。打算將這個專案做成庫檔案,方便其他的專案呼叫。
生成jar和aar檔案
第一步:修改build.gradle檔案
1.
apply plugin:'com.android.application'
修改為
apply plugin:'com.android.library'
2.註釋 applicationId “……”
defaultConfig {
// applicationId "com.xinyunlian.reglogin"
... ...
}
第二步:修改AndroidManifest.xml
<!--Manifest的合併涉及到很多知識,具體的可以參考本文最後的相關連結-->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="......" >
<!--新增需要的許可權-->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:replace="android:theme,android:icon,android:label">
新增replace屬性
<activity
android:name="com.example.guan.webrtc_android_aar.activity.GWebRTC_MainActivity"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="stateHidden|stateAlwaysHidden">
把theme指定到這裡
註釋掉LAUNCHER
<!--<intent-filter>-->
<!--<action android:name="android.intent.action.MAIN" />-->
<!--<category android:name="android.intent.category.LAUNCHER" />-->
<!--</intent-filter>-->
</activity>
<activity
android:name="com.example.guan.webrtc_android_aar.activity.GWebRTC_CallActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="stateHidden|stateAlwaysHidden">
<!-- 不自動彈出軟體盤-->
<!--固定螢幕方向-->
</activity>
</manifest>
為什麼要修改Manifest?
注:在對有引用library project的Android專案進行打包時有時會需要進行Manifest的merge操作,進行merge操作有一些條件:
- minSdkVersion:主工程的最低版本要求不能低於庫工程
- targetSdkVersion:同樣,主工程不能低於庫工程
- : 所有工程(包含主工程,庫工程)的Manifest檔案中都要有標籤
- 如果Manifest設定不當,當匯入你自己生成的.aar庫檔案到另一個專案時,就會失敗。
第三步:重新編譯
儲存位置:
*.jar:build/intermediates/bundles/debug(release)/classes.jar
*.aar:build/outputs/aar/app-debug.aar
注意:確保.aar中所有資原始檔(如activity_main.xml、drawable等等)和Activity的名稱與呼叫者不一樣。
至此,jar和aar檔案已經生成。下面就可以放到專案中呼叫。
呼叫jar和aar檔案
第一步:jar和aar檔案拷貝到:libs目錄
第二步:修改build.gradle檔案
repositories {
//新增一個本地倉庫,並把libs目錄作為倉庫的地址
flatDir
{
dirs 'libs'
}
}
dependencies {
……
//指定檔案,testaar是檔名,aar是字尾
compile (name:'testaar', ext:'aar')
……
}
注意:如果想在呼叫者中啟動.aar中的Activity,需要在呼叫者AndroidManifest.xml中宣告.aar的Activity。
問題彙總:
- 在Android library中不能使用switch-case語句訪問資源ID
由於library的R.java中的資源ID不是常量引起的,我們可以在library中通過if-else-if條件語句來引用資源ID
參考資料:
《三件事:Aar, Manifest和Activity-Alias》 http://blog.csdn.net/shineflowers/article/details/49993283
《 Android Studio生成和引用aar》http://www.tuicool.com/articles/QfEjYbe
《在Android library中不能使用switch-case語句訪問資源ID的原因分析及解決方案》 http://www.jianshu.com/p/89687f618837
《AndroidManifest合併原理》http://www.open-open.com/lib/view/open1455598198026.html
《 Android官方技術文件翻譯——清單合併》http://blog.csdn.net/maosidiaoxian/article/details/42671999
《AndroidStudio出現tools:replace=”android:icon”問題》 http://blog.csdn.net/u014112893/article/details/52636348