1. 如何動態載入android的so文件,如何壓縮apk尺寸,androidapk
在Android中調用動態庫文件(*.so)都是通過jni的方式,而且往往在apk或jar包中調用so文件時,都要將對應so文件打包進apk或jar包,工程目錄下圖:
以上方式的存在的問題:
1、缺少靈活性比較類似靜態載入了(不是靜態載入),能載入的so文件綁定死了;
2、但so文件很多或很大時,會導致對應的apk和jar包很大;
3、不能動態的對so文件更新;
Android中載入so文件的提供的API:
void System.load(String pathName);
說明:
1、pathName:文件名+文件路勁;
2、該方法調用成功後so文件中的導出函數都將插入的系統提供的一個映射表(類型Map);
看到以上對System.load(String pathName);的函數說明可定有人會想到將so文件放到一個指定的目錄然後再通過參數pathName直接引用該目錄的路勁和對應的so文件問題不就解決了嗎?
這里有個問題被忽略了,那就是System.load只能載入兩個目錄路勁下的so文件:
1、/system/lib ;
2、安裝包的路勁,即:/data/data/<packagename>/…
而且這兩個路勁又是有許可權保護的不能直接訪問;
問題解決方法:
先從網路下載so文件到手機目錄(如:/test/device/test.so) –> 將test.so載入到內存(ByteArrayOutputStream) –> 然後保存到對用安裝包目錄;
具體代碼如下:
try {
String localPath = Environment.getExternalStorageDirectory() + path;
Log.v(TAG, "LazyBandingLib localPath:" + localPath);
String[] tokens = mPatterns.split(path);
if (null == tokens || tokens.length <= 0
|| tokens[tokens.length - 1] == "") {
Log.v(TAG, "非法的文件路徑!");
return -3;
}
// 開辟一個輸入流
File inFile = new File(localPath);
// 判斷需載入的文件是否存在
if (!inFile.exists()) {
// 下載遠程驅動文件
Log.v(TAG, inFile.getAbsolutePath() + " is not fond!");
return 1;
}
FileInputStream fis = new FileInputStream(inFile);
File dir = context.getDir("libs", Context.MODE_PRIVATE);
// 獲取驅動文件輸出流
File soFile = new File(dir, tokens[tokens.length - 1]);
if (!soFile.exists()) {
Log.v(TAG, "### " + soFile.getAbsolutePath() + " is not exists");
FileOutputStream fos = new FileOutputStream(soFile);
Log.v(TAG, "FileOutputStream:" + fos.toString() + ",tokens:"
+ tokens[tokens.length - 1]);
// 位元組數組輸出流,寫入到內存中(ram)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = fis.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
// 從內存到寫入到具體文件
fos.write(baos.toByteArray());
// 關閉文件流
baos.close();
fos.close();
}
fis.close();
Log.v(TAG, "### System.load start");
// 載入外設驅動
System.load(soFile.getAbsolutePath());
Log.v(TAG, "### System.load End");
return 0;
} catch (Exception e) {
Log.v(TAG, "Exception " + e.getMessage());
e.printStackTrace();
return -1;
}
2. .so文件怎麼打開啊急急急
工具/材料來:記事本,so文件。
1、首源先在桌面上,選中「so文件」圖標。
3. I如何打開SO文件
對於打開iso鏡像文件,很多人都會選擇安裝一個虛擬光碟機的。其實不需要的, 鏡像文件其實就是由多個文件通過刻錄軟體或者鏡像文件生成工具壓縮製作而成的。因而直接用壓縮文件就可以打開。
方法/步驟
雖然說iso鏡像文件可以用壓縮軟體打開,但是你不能直接把他解壓。
1.先把文件的後綴名由「.iso」改為「.zip」。
例如「單詞四級.docx」改為「單詞四級.zip」。
2.這時會彈出提示框「如果改變文件擴展名,可能毀導致文件不可用」。
點確認就可以了。
3.這時該文件的格式就變成了 .zip 後綴的壓縮文件格式。
4.這時我們雙擊打開一下壓縮文件,看到需要的文件就可以解壓出來。
5.或者直接右鍵點擊壓縮文件,把整個文件解壓出來。
來源:http://..com/question/52727319
4. 如何動態載入android的so文件,如何壓縮apk尺寸
## snmpwalk -v 2c ServerIP -c public .1.3.6.1.4.1.2021.10.1.3
##查看被控端是否有CPU負載的數據返回
##提示snmp默認的配置文件snmpd.conf的監控對象SNMP團體默認是public
6) 主角上場了現在我們來安裝cacti
a)獲取安裝介質
wget http://www.cacti.net/downloads/cacti-0.8.8a.tar.gz
b)解壓縮安裝包
#tar zxvf cacti-0.8.7h.tar.gz
c)移動解壓後的安裝包到web發布目錄下
#mv cacti-0.8.8h /var/www/html/cacti
5. 怎麼用jni生成so文件 android studio
task NativeLibs(type: Copy) {
from(new File(project(':MyProject').buildDir, 'native-libs')) { include '**/*.so' }
into new File(buildDir, 'native-libs')
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn NativeLibs }
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.PackageApplicationTask) { pkgTask ->
pkgTask.jniDir new File(buildDir, 'native-libs')
}
(2)新版本三種方法:
(2.1)打包前先生成.Jar文件後自動解包到apk文件
task nativeLibsToJar(type: Zip, description: 'create a jar archive of the native libs') {
destinationDir file("$buildDir/native-libs")
baseName 'native-libs'
extension 'jar'
from fileTree(dir: 'libs', include: '**/*.so')
into 'lib/'
}
tasks.withType(Compile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
下面一句話就是打包生成目錄(build\native-libs)中的.jar文件
compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
(2.2)手動生成.Jar文件後自動解包到apk文件
這個方式需要自己手動進行.SO文件壓縮,具體步驟為:將所有需要使用的.so文件壓縮為.zip文件(zip中的文件目錄結構為: lib/armeabi/*.so)然後把zip文件後綴改為.Jar然後放到libs生成apk就ok
默認就是自動打包所有.Jar文件:
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
}
(2.3)這也就是現在正在使用的方式(推薦) ,其實無非就是把.SO文件打包到APK的lib文件夾中,假如仔細閱讀了Gradle的使用方法,自然就知道其實Gradle官方在新版已經自動實現了打包.SO文件的.很簡單級就是在配置的android節點下加入下面的內容就ok:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
其他地方無需修改,整個項目的配置文件如下:
apply plugin: 'android'
android {
compileSdkVersion 19
buildToolsVersion "19.0.0"
defaultConfig {
minSdkVersion 16
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])