1. 程式人生 > >Android 使用grade實現Android 專案debug版與release版共存

Android 使用grade實現Android 專案debug版與release版共存

在Android 專案中,預設debug版與release版的包名相同,從而導致debug版與release版兩者不能共存。為了方便開發,可以通過gradle實現讓兩者在一臺手機上共存

配置app目錄下的build.gradle檔案

android {
    ......
    buildTypes {
    ......
        debug {
            //為debug版本的包名新增.debug字尾
            applicationIdSuffix ".debug"
            ......
        }
    }
}

在debug節點裡新增這個配置後,debug版本的apk 包名會自動新增.debug字尾。比如原本包名為com.example.application的應用,debug包名為com.example.application.debug

許可權重複的問題

如果專案中使用了第三方庫,而在ManiFest中聲明瞭許可權,例如個推

<permission
    android:name="getui.permission.GetuiService.package_name"
    android:protectionLevel="normal"/>

android 5.0以上安裝應用時會報duplicate permission exception,所以要保證debug和release安裝包的permission name 不同,因此我們可以使用applicationId欄位,使用方式如下。

<permission
    android:name="getui.permission.GetuiService.${applicationId}
"
android:protectionLevel="normal"/>

provider authorities

<provider
    android:name="com.igexin.download.DownloadProvider"
    android:authorities="downloads.package_name"
    android:exported="true"
    android:process=":pushservice"/>

同樣也可以使用applicationId欄位來替換

 android:authorities="downloads.${applicationId}
"

使用manifestPlaceholders屬性來替換

但是不是所有的屬性都能使用applicationId來替換,比如融雲這樣的第三方庫

可以看到如下data節點內的host=”package_name” 就不能使用applicationId欄位來替換

<activity
            android:name=".activity.navigation.ConversationListActivity"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateHidden|adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>

                <category android:name="android.intent.category.DEFAULT"/>

                <data
                    android:host="package_name"
                    android:pathPrefix="/conversationlist"
                    android:scheme="rong"/>
            </intent-filter>
        </activity>

因此我們可以用manifestPlaceholders屬性, manifestPlaceholders顧名思義manifest佔位符,上面說的餓${applicationId }就是grade自帶的manifest佔位符,當然我們也可以自定義manifest佔位符

分別在release 和debug節點下新增manifestPlaceholders屬性如下:

android {
    ......
    buildTypes {
    ......
     release {
            .......
            manifestPlaceholders = [
                    APP_NAME      : "@string/app_name",
                    APPLICATION_ID: "@string/application_id"
            ]
        }
        debug {
            //為debug版本的包名新增.debug字尾
            applicationIdSuffix ".debug"
            manifestPlaceholders = [
                    APP_NAME      : "@string/app_name_debug",
                    APPLICATION_ID: "@string/application_id_debug"
            ]
            ......
        }
    }
}

在專案的values/strings.xml檔案裡新增如下:

<string name="app_name">MyApplication</string>
    <string name="app_name_debug">MyApplicationDebug</string>
    <string name="application_id">com.example.myapplication</string>
    <string name="application_id_debug">com.example.myapplication.debug</string>

然後將data節點內的host=”package_name”替換為host=”${APPLICATION_ID}”

<activity
            android:name=".activity.navigation.ConversationListActivity"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateHidden|adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>

                <category android:name="android.intent.category.DEFAULT"/>

                <data
                    android:host="${APPLICATION_ID}"
                    android:pathPrefix="/conversationlist"
                    android:scheme="rong"/>
            </intent-filter>
        </activity>

這樣就能在打包release版本時包名使用release的包名,debug版本使用debug包名

app_name也同理,可以將android:label裡的內容替換成manifestPlaceHolder變數,如下所示:

android:label="${APP_NAME}"

動態打包so包

apk的大小永遠式開發者頭疼的問題,而so包就是apk安裝包體積過大的主要原因之一,因此很多開發者都會將一些用不到so包去除,以減小apk體積,比如x86的so包,但是如果你需要使用A n droid 官方提供的模擬器來測試你的應用的話,那x86的so包是必不可少,解決方案如下:

就是release版本打包時不包含x86的so包,減少正式版apk的體積,debug版本者包含x86的so包,方便在官方模擬器上測試。

android {
    ......
    buildTypes {
    ......
     release {
            .......
            //設定release版本只包含armeabi和armeabi-v7a的so包
            ndk {
                abiFilters "armeabi", "armeabi-v7a"
            }
        }
        debug {
            ......
            //設定debug版本包含x86的so檔案
            ndk {
                abiFilters "armeabi", "armeabi-v7a", "x86"
            }
        }
    }
}

相關推薦

Android 使用grade實現Android 專案debugrelease共存

在Android 專案中,預設debug版與release版的包名相同,從而導致debug版與release版兩者不能共存。為了方便開發,可以通過gradle實現讓兩者在一臺手機上共存 配置app目錄下的build.gradle檔案 android {

GCC 64位程式的makefile條件編譯心得——32位64位debugrelease(相容MinGW、TDM-GCC)

  為了適應現在越來越流行的64位系統,經常需要將程式碼分別編譯為32位版和64位版。其次,除了需要生成debug版用於開發測試外,還需要生成release版用於釋出。本文介紹瞭如何利用makefile條件編譯來生成這些版本,而且不僅相容Linux下的GCC,還支援MinGW、TDM-GCC等Windows

Android AndroidStudio檢視debug keyrelease key

檢視debug key 找到AS左側的gradle,找到root下面的Task點開,找到android點開,雙擊signingReport 執行如下,並點選下圖標出來的按鈕,會看到執行結果

Android直播實現 Android端推流、播放

size input 準備 預覽 不必要 targe height 不出 oar 最近想實現一個Android直播,但是對於這方面的資料都比較零碎,一開始是打算用ffmpeg來實現編碼推流,在搜集資料期間,找到了幾個強大的開源庫,直接避免了jni的代碼,集成後只用少量的ja

演算法設計之Project Euler 11~20 (python3.6C++實現)(未完待更)

一、Project Euler 11:Largest product in a grid Largest product in a grid In the 20×20 grid below, four numbers along a diagonal line have been

img 黑白彩色切換

tco this spa put text get for ret -s function converttoGS(img) { img.color = img.src; img.grayscale = createGSCanvas(img); img.o

Windows 桌面服務核心對比

    因為時常要處理一些非正常的需求,經常要琢磨不同系統間元件的相互代用問題,就整理了一些這方面的資料,簡單記為:2003對應的是XP,2008對應的是Vista,2008 R2對應的是7,2012對應8,2012 R2對應8.1。下面是具體說明,參考自:https:/

Power BI桌面Online功能區別

Power BI桌面服務專注於資料模型的建立,而Power BI線上服務則專注於資料報表的管理,兩者的主要功能以及差別如下: 功能 Power BI桌面版 Power BI線上版

Scrum工具Leangoo“免費“企業”對比

Leangoo(中文名:領歌)官網:(www.leangoo.com) 關於Leangoo敏捷開發工具: https://www.leangoo.com/about-leangoo.html Leangoo是我個人非常喜歡的工具,它輕量又簡潔,上手也很快,並且完美支援Scrum敏捷開發。如果正好

Makefile條件編譯debugrelease

原文地址為: Makefile條件編譯debug版和release版 一般,在開發測試階段用debug版本,而上線釋出用release版本。 使用Makefile定製編譯不同版本,避免修改程式和Makefile檔案,將會十分方便。 讀了一些資料,找到一個解決方法,Makefile

dedecms 手機pc分離方法分享

dedecms對與站長而言,並不陌生,很多站長對dedecms也非常喜歡,因為很多。有SEO功能方面的,也有其它方便的。資訊更多是因為DEDECMS自帶有PC功能和手機門功能。 但大多數的站長用的手機門戶功能卻是DEDECMS自帶的手機WAP功能。本人瞭解過。但凡帶有手機門

win2003 序列號 windows2003 sp2可用序列號大全(準企業)

 通用性好的win2003序列號: (推薦先用這個裡面的)   FJ8DH-TQPYG-9KFHQ-88CB2-Y7V3Y   GRD4P-FTQQF-JCDM8-4P6JK-PFG7M   JD7JX-KCDTH-7WH4X-DM98R-GD73Y   GM34K-RCRKY-CRY4R-TMCMW-DMD

Redis4.0.10單機叢集的搭建

Redis單機版的搭建一、上傳redis-4.0.10.tar.gz至伺服器二、安裝gccyum install gcc-c++三、解壓redis-4.0.10.tar.gz  tar -zxvf redis-4.0.10.tar.gz –C /usr/local四、進入到r

解決VS+opencv中Debug版本Release版本的lib切換的問題

參考方案1: 參考來源:http://blog.csdn.net/xiaohuh421/article/details/7476485 #ifdef _DEBUG #pragma comment(lib,"..\\debug\\LedCtrlBoard.lib") #el

Qt中如何檢測程式是Debug還是Release

方法是檢查QT_NO_DEBUG 這個巨集。 示例程式碼: #ifdef QT_NO_DEBUG qDebug() << "release mode"; #else qDebug() << "debug mode"; #endif

.NET中Debug模式Release模式差別

none bubuko mage 技術分享 png alt deb only 刪除 Debug裏的PDB是full,保存著調試和項目狀態信息、有斷言、堆棧檢查等代碼。Release 裏的PDB是pdb-only,基本上:出什麽錯了+錯誤在哪行。 因為很多人把PD

Android lrucache 實現使用(Android內存優化)

hashmap 獲取 fin pub viewpage map.entry ring zhong 實現 什麽是LruCache? LruCache實現原理是什麽? 這兩個問題其實可以作為一個問題來回答,知道了什麽是 LruCache,就只然而然的知道 LruCac

Android實現新聞專案

這是一個新聞類的專案,由於工作原因只能是一點一點寫,後續會補充完整,有疑惑可以私信我.   首先是首頁面,歡迎頁實現     旋轉 縮放 漸變 的效果 ,三個引導頁實現側滑的同時底部的小點跟隨側滑移動.   GuideA

Android studio 實現javakotlin的相互轉換

其實就是互轉,下面用Android studio 示範 Kotlin 轉換Java檔案 Tools>Kotlin>Show Kotlin Bytecode Decompile Java轉換kotlin檔案(需要studio3.0)或者安裝了kotlin外掛。 選擇頁面的

Android多程序Process開發總結-優點缺陷-(個人註釋,非絕對原創)

1、背景 我公司產品,一共有三個程序,其中主程序一個、子程序一個、推送程序一個   Androiod多程序 為何使用多程序,有啥好處?  推送業務為何都要獨立程序,這裡涉及到的一個知識就是程序保活技術,推送程序只要不掛掉,那麼推送保證沒有問題 a、不會