天天看點

Android Studio生成和引用.aar庫檔案背景:生成jar和aar檔案調用jar和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.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操作有一些條件:

  1. minSdkVersion:主工程的最低版本要求不能低于庫工程
  2. targetSdkVersion:同樣,主工程不能低于庫工程
  3. : 所有工程(包含主工程,庫工程)的Manifest檔案中都要有标簽
  4. 如果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