1. 程式人生 > >Android Studio打包APK後動態庫so檔案被改動

Android Studio打包APK後動態庫so檔案被改動

本人專案中遇到一個非常奇葩的問題,百思不得其解。

問題是這樣的:

由於專案是將C/C++層的程式碼與java程式碼分開管理的,所以C/C++程式碼沒有放進AS裡,編譯時將在linux下編譯好的動態庫直接放進AS工程的jniLibs下再打包生成APK。問題來了。

AS 打包APK後,開啟APK檢查裡面的so動態庫,與工程目錄下jniLibs存放的so對比MD5簽名,發現不一致。



取其中一個動態庫進行校驗,MD5不一致,看檔案大小是一樣大的(都是426460位元組),錯誤庫檔案的修改時間正是APK編譯的時間。

以前用著好好的,並沒有出現這個問題,直到後來專案中踩到坑了,才發現so不對,最終定位到是AS打包APK時so被改動了。最開始以為是AS和Gradle版本問題,遂升級到最新版本,問題依然存在。沒辦法了,只能靜下心來研究一番。

檢視打包APK之後Module級別的build目錄,在 build/intermediates/transforms/stripDebugSymbol/release/0/lib/armeabi 目錄下發現了所有的動態庫檔案,檢查庫檔案的MD5,與jniLibs下的so 不一致。

進一步檢視gradle編譯資訊,發現在packageRelease之前有執行名為“transformNativeLibsWithStripDebugSymbolForRelease”的任務。如圖:


對比一下名字,不難發現這個任務就是生成stripDebugSymbol目錄內檔案的過程。

修改module的build.gradle檔案,嘗試刪除stripDebugSymbol目錄下的庫檔案,看看編譯出的APK會有什麼變化。程式碼如下:

project.afterEvaluate {
    packageRelease.doFirst {
        delete{
            delete 'build/intermediates/transforms/stripDebugSymbol/release/0/lib/armeabi'
        }
    }
}

rebuild一下工程,發現編譯出來的APK沒有動態庫了!這證明了最終打包APK的so檔案就是使用的stripDebugSymbol目錄下的動態庫。

現在可以針對這個目錄進行修改了,在執行了transformNativeLibsWithStripDebugSymbolForRelease任務之後,packageRelease之前,我們將stripDebugSymbol目錄清空,再把jniLibs目錄下的庫檔案拷貝過去。程式碼如下:

packageRelease.doFirst {
        delete{
            delete 'build/intermediates/transforms/stripDebugSymbol/release/0/lib/armeabi'
        }
        copy{
            from 'src/main/jniLibs/armeabi'
            into 'build/intermediates/transforms/stripDebugSymbol/release/0/lib/armeabi/'
            include '*.so'
        }
    }
rebuild一下,檢驗APK,這下APK裡的動態庫檔案正確了。

至於為什麼執行了transformNativeLibsWithStripDebugSymbolForRelease之後,動態庫檔案會被改動,這個實在是查不出原因。

後續在實際使用過程中,又發現目錄不固定,目前發現有兩種目錄:

build/intermediates/transforms/stripDebugSymbol/release/0/lib/armeabi 

build/intermediates/transforms/mergeJniLibs/release/folders/2000/1f/main/lib/armeabi/

紅字對應的是編譯型別,如果是debug型別,則需要改成debug,對應的指令碼也要改成 packageDebug.doFirst

相關推薦

Android Studio打包APK動態so檔案改動

本人專案中遇到一個非常奇葩的問題,百思不得其解。 問題是這樣的: 由於專案是將C/C++層的程式碼與java程式碼分開管理的,所以C/C++程式碼沒有放進AS裡,編譯時將在linux下編譯好的動態庫直接放進AS工程的jniLibs下再打包生成APK。問題來了。 AS 打包A

Android Studio 打包apk應用未安裝

本文轉載地址 http://blog.csdn.net/sinat_14849739/article/details/76383281 前言 Android 要求所有 APK 必須先使用證書進行數字簽署,然後才能安裝。當然這麼做的原因是為了保證APK的唯一性,安全性

單目跟蹤位姿產品研發(二)----在linux下將c++工程打包動態so檔案API

       單目跟蹤位姿專案由對方公司提供應用場景,我方研發核心演算法,通過c++實現功能,然後對方公司通過java\js來開發炫酷的介面,共同合作完成,最終對方公司負責銷售推廣,推向市場。因此,涉及到java介面呼叫c++核心程式碼的問題。 現記錄

linux關於執行編譯命令找不到動態.so檔案的解決辦法。

方法一:(沒有root許可權)利用find找到報錯動態庫檔案目錄lib路徑,vim /home/xxx/.bashrc 新增一行: export LD_LIBRARY_PATH=動態庫/lib:$LD_LIBRARY_PATH 然後 source /home/xxx/.bashrc

新建專案和匯入之前eclipse打包過的專案在android studio打包apk詳解

一、打包之前沒打包過的專案 1.開啟as自己想要打包專案介面,點選如下圖: 2.點選後會出現下圖:貌似和eclipse有點相同 3.應為是之前沒有打包過上面顯示button出現如下圖: 4.看到

Android Studio 打包Apk

Android Studio 打包開發完一款Application之後,需要對其進行打包,才可以釋出工使用者使用(release)。而Android Studio就具備了打包的工具。有一下兩種打包方式:Gradle配置打包Build->Generate Signed APK打包簽名檔案在進行打包之前,首

Android Studio 打包apk遮蔽log,新增所有檔案的行號,設定編碼等配置

在build.gradle中新增以下程式碼: buildTypes {     release {         buildConfigField "boolean","LOG","false"

Android Studio打包APK時出現 is not translated in "en" (English) [MissingTranslation]

轉載於:http://blog.csdn.net/zhangh8627/article/details/47170859 解決辦法:resources 標籤內增加xmlns:tools="http://schemas.android.com/tools" tools:ign

Android Studio打包apk,aar,jar包

1jar vs aar    文字我們將講解android studio打包apk,aar,jar包的相關知識。apk包就是android系統的安裝包,這裡沒什麼好說的,aar包是android中獨有的類庫包,而jar包是java中特有的類庫包,在具體的介紹打包之前,我們

linux下靜態.a和動態.so檔案的生成和使用

1.靜態庫是一些目標檔案(字尾名為.o)的集合體而已。 2.靜態庫的字尾名是.a,對應於windows作業系統的字尾名為.lib的靜態庫。 3.可以使用ar命令來建立一個靜態庫檔案。 來看一個例項,根據書中的程式碼簡化的,先看一看可以編譯成庫檔案的原始檔中的程式碼: /* test.c */ i

Linux下.h與動態.so檔案的路徑新增及gcc編譯的記錄

使用場景 當你在程式中加入一個非gcc預設搜尋路徑上的一個.h標頭檔案時,會報錯“No such file”,當你的程式需要動態連結一個.so庫時,在預設路徑裡找不到該庫,也會報錯。那麼,如何解決這兩種問題呢? gcc編譯使用“-I”選項 當頭檔案非標

解決在android平臺上apk的覆蓋安裝so檔案不覆蓋問題

過程: 在網上搜索android上需要手動清除資料/手動解除安裝的原因及解決方法,發現根本找不到這方面的資料。 反思: 在一個開源平臺上,別人都不會碰到同樣的問題嗎?只能說明一個問題,這個問題,要麼太深奧,要麼太簡單。我想到了自從一開始就一直縈繞在我心頭的一個初始化函式的實現:JNI_OnLoad

linux 呼叫動態so檔案

   關於動態呼叫動態庫方法說明 一、        動態庫概述 1、  動態庫的概念 日常程式設計中,常有一些函式不需要進行編譯或者可以在多個檔案中使用(如資料庫輸入/輸出操作或螢幕控制等標準任務函式)。可以事先對這些函式進行編譯,然後將它們放置在一些特殊的目的碼檔

Android Studio匯出apk在手機上安裝提示“檔案不存在或已失效”

本人曾經在專案測試中兩次遇到匯出的apk在手機上安裝提示“檔案不存在或已失效”,當然兩次都解決了,為了提醒自己以後不犯同樣的錯。 也為了讓遇到相同問題的朋友可以成功解決這個問題寫下了這篇

Android studio執行JNI程式以及生成.so檔案(Windows下)

呼叫JNI中的方法展示出來的結果 生成的各個平臺的so庫的結果 下面開始進入主題 1、首先是要配置NDK(若是已經配置過NDK請略過此步驟) 建立NDK_HOME 再將配置好的NDK_HOME新增到PATH環境變數中 配置好之後可以測試是否配置正確 ,開啟cmd在裡面輸入ndk

android studio ndk-build 編譯C生成.so檔案(ndk基礎篇)

一、概要 最近專案需要,要把程式碼中加密的部分打包成so檔案,剛開始接觸的時候真是痛苦呀,網上好多資料,都不是很詳細,步驟也不清晰,所以我整理了一下,希望大家喜歡。 現在android studio打包so檔案有兩種方式,第一種是ndk-build編譯專案,還有一種用

android反編譯APK,是smali檔案,能反編譯成dex檔案

我也面臨相同的問題,但目前還沒找到類似反編譯smali檔案的方法,一般得到dex檔案只需要用WinRAR或其他壓縮軟體開啟apk檔案就能得到。但也有例外好像,技術先進了,今天遇到個apk用WinRAR開啟異常,沒有dex檔案,所以得到原始碼的計劃就泡影了,至少用目前常規的方

GCC 編譯動態 so檔案時,靜態連結libmysqlclient.a 與動態連結引數一起使用問題。

直接放結論, 下面是編譯一個使用了mysql C API 的 mysql.so 檔案(我們的業務中,它是zbx加裁的modules so檔案) gcc -fPIC -shared -o mysql.so mysql.c \ -I/usr/include

Android Studio 打包動態修改aar、apk 包名稱

動態修改AAR名字 android.libraryVariants.all { variant -> if(variant.name.equalsIgnoreCase("rele

Android Studio 打包生成 APK

如果 sign ext 對話 http ner 分享 技術 oid 1. 第一步 Build -> Generate Signed APK 2. 之後會要求開發者輸入相關的密鑰文件和密碼 如果有則找到對應的 .jks 文件輸入密碼完成相應操作,否則則創建一個對