導航:首頁 > 操作系統 > android載入class

android載入class

發布時間:2022-09-23 11:38:14

android如何調用class類

就像在java中正常調用一樣。new出來一個對象,然後就可以調用其方法了。不用非得寫在Activity中.

② android手機的apk文件中的class.dex文件是什麼是做什麼用的呢

簡單說就是優化後的android版.exe。每個apk安裝包里都有。相對於PC上的java虛擬機能運行.class;android上的Davlik虛擬機能運行.dex。

作用

讓dalvik能夠運行。

dex好處

可以直接用DexClassLoader類載入,動態載入。於是只要在dex上加殼,在程序運行時脫殼,就可以規避靜態反編譯的風險。

(2)android載入class擴展閱讀

使用dex文件的原因

在Android系統中,一個App的所有代碼都在一個Dex文件裡面。Dex是一個類似Jar的包,存儲了很多Java編譯位元組碼的歸檔文件。

因為Android系統使用Dalvik虛擬機,所以需要把使用Java Compiler編譯之後的class文件轉換成Dalvik能夠執行的class文件。

③ Android手機的apk文件中的class.dex文件是什麼是做什麼用的呢

簡單說就是優化後的android版.exe。每個apk安裝包里都有。相對於PC上的java虛擬機能運行.class;android上的Davlik虛擬機能運行.dex。

作用

讓dalvik能夠運行。

dex好處

可以直接用DexClassLoader類載入,動態載入。於是只要在dex上加殼,在程序運行時脫殼,就可以規避靜態反編譯的風險。

(3)android載入class擴展閱讀

使用dex文件的原因

在Android系統中,一個App的所有代碼都在一個Dex文件裡面。Dex是一個類似Jar的包,存儲了很多Java編譯位元組碼的歸檔文件。

因為Android系統使用Dalvik虛擬機,所以需要把使用Java Compiler編譯之後的class文件轉換成Dalvik能夠執行的class文件。

④ Android類載入器以及與Java類載入器區別

載入的位元組碼不同

Android類載入器和Java的類載入器的類體系結構不一樣:

Android的BootClassLoader和Java的BootStrapClassLoader區別:

Android類載入器和Java的類載入器工作機制是類似的,使用雙親委託機制。

⑤ 如何使用URLClassLoader載入本地的Class文件

在Java裡面,我們可以把一些類放到.jar文件裡面,然後用ClassLoader動態載入。例如:[java]viewplainURLClassLoaderucl=URLClassLoader.newInstance(newURL[]{newURL("file:/sdcard/files/test.jar")});Classclazz=ucl.loadClass("com.test.TestClass");但是在Android上面,情況有所不同。首先第一個是jar文件的製作,Java裡面直接把.class文件打包到.jar文件裡面就可以了,但是Android的DalvikVM是不認Java的bytecode的,所以不能直接這么打包,而要用dx工具轉成Dalvikbytecode才可以。當然,dx工具轉了之後,jar包裡面就不是.class文件了,而是.dex文件。第二個是,Android裡面雖然也提供了URLClassLoader的實現,但是並不能用。要動態載入其它類,可以用的ClassLoader有:DexClassLoaderPathClassLoader其中,DexClassLoader可以載入apk,jar或者dex文件,例如:[java]viewplainFilejarFile=newFile("/sdcard/test.dex");if(jarFile.exists()){DexClassLoadercl=newDexClassLoader(jarFile.toString(),"/sdcard/test",null,ClassLoader.getSystemClassLoader());Classc=cl.loadClass("com.qihoo360.test.Test");}但是DexClassLoader要求指定一個可寫的目錄,即DexClassLoader構造函數的第二個參數,在上例中是/sdcard/test這個參數的含義是:因為Dalvik在載入dex文件時,會動態進行優化,DexClassLoader要求指定優化後dex文件存放的位置。PathClassLoader的限制要一些,它只能載入已經安裝到Android系統中的apk文件,也就是/data/app目錄下的apk文件。其它位置的文件載入的時候都會出現ClassNotFoundException.例如:[java]viewplainPathClassLoadercl=newPathClassLoader(jarFile.toString(),"/data/app/",ClassLoader.getSystemClassLoader());為什麼有這個限制呢?我認為這其實是當前Android的一個bug,因為PathClassLoader會去讀取/data/dalvik-cache目錄下的經過Dalvik優化過的dex文件,這個目錄的dex文件是在安裝apk包的時候由Dalvik生成的。例如,如果包的名字是com.qihoo360.test,Android應用安裝之後都保存在/data/app目錄下,即/data/app/com.qihoo360.test-1.apk,那麼/data/dalvik-cache目錄下就會生成data@[email protected]@classes.dex文件。在調用PathClassLoader時,它就會按照這個規則去找dex文件,如果你指定的apk文件是/sdcard/test.apk,它按照這個規則就會去讀/data/dalvik-cache/[email protected]@classes.dex文件,顯然這個文件不會存在,所以PathClassLoader會報錯。在Google修正這個問題之前,我們要麼就只能用DexClassLoader,要麼就只能用PathClassLoader載入已安裝的apk了。

⑥ android中.class是什麼意思

這些是java的基礎知識.
this代表本類的一個引用,
this.*表示調用本類的某個方法,這個時候通常可以省略this;但在內部類中不能省略,否則編譯器會認為是內部類的引用,所以要在this前加上類名
*.this表示本類的引用,通常前面的*是用本類的名字表示,當然也可以省略,但是如果是在內部類中一定要加上類名;
*.class表示其他的類;
在android中通常用的最多的地方是intent.setClass(A.this, B.class);

⑦ android插件化(四)Hook載入插件APK(ClassLoader方式)

前面插件化一和二說了下插樁式載入未安裝的APK,主要是重寫了getResource和getClassloader兩個方法來實現的。以及每個組件要實現一個介面,通過介面注入上下文來達到它的生命周期。

那麼插樁式和hook式的實現方式有什麼不同呢?

插樁式是怎麼載入到插件中的class文件呢,是通過將將APK轉化成插件的Classloader,然後想要載入插件的class文件,我們的去拿這個插件的classloader去loadClass。所以是有一個中間者的。

hook式呢是將插件apk融入到了我們的宿主apk,那直接在裡面就可以直接loadClass了,在不用這個插件的ClassLoader了,這樣的話對於插件和宿主就沒什麼區別了,不像插樁式有一個中間者。

那麼要實現hook式 就要知道android中一個class文件式怎樣被載入到內存中去的。其實就是通過PathClassLoader來載入的。

那麼我們先看下ClassLoader

任何一個java程序都是由一個或者多個class組成的,在程序運行時,需要將class文件載入到JVM中才可以使用,負責載入這些class文件的就是java的類載入機制。CLassLoader的作用就是載入class文件提供給程序運行時使用,每個Class對象內部都有一個ClassLoader來標示自己是有那個classLoade載入的。

Android app的所有的java文件都是通過PathClassLoader來載入的,那麼它的父類是BaseDexClassLoader,還有一個兄弟類是DexClassLoader,那麼他們有什麼區別呢。

從上面可以看出這兩個類的構造函數不同。(在26的源碼中DexClassLoader中的optimizedDirectory也廢棄了)

PathClassLoader:用於Android應用程序類載入器。可以載入指定的dex,以及jar、zip、apk中的classes.dex

DexClassLoader:載入指定的dex以及jar、zip、apk中的classes.dex。

可以看到創建ClassLoader的時候需要接收一個CLassLoader parent的參數,這個parent的目的就在於實現類載入的委託。

某個類載入器在接到載入類的請求時,首先將載入任務委託給父類載入器,一次遞歸,如果父載入器可以完成載入任務,那麼就返回,只有當父載入器無法完成載入任務時,才自己去載入。

因此我們自己創建的ClassLoader:newPathClassLoader("/sdcard/xx.dex",getClassLoader()),並不僅僅只能載入我們的xx.dex中的class。

需要注意的是,findBootstrapClassOrNull 這個方法,當parent為null的時候,去這個BootCLassLoader進行載入,

但是在Android當中的實現:

所以new PathClassLoader("/sdcard/xx.dex",null),是不能載入Activity.class的。

上面分析了載入了一個class,是利用了雙親委託機制,那麼要是都找不到那就開始調用自己的findCLass方法

在ClassLoader類中findClass:

任何ClassLoader的子類,都可以重寫loadClass和findClass。如果你不想使用雙親委託,就重寫loadClas修改實現,重寫findClass則表示在雙親委託機制下,父ClassLoader都找不到class的情況下,定義自己去查找一個class。

而我們的PathClassLoader會自己負責載入Activity這樣的類,利用雙親委託父類去載入activity,而我們的PathClassLoader沒有重寫findClass,是在它的父類裡面。因此我們可以看看父類的findClass是如何實現的。

可以看到載入PathClassLoader載入class,轉化為從DexPathList中載入class了,那麼我們看看DexPathList中的findClass

那麼從上面分析得到

到這里我們想要載入一個插件的apk ,其實最終載入的是一個dex文件(先說class文件,載入資源後面說),有沒有辦法吧這個dex文件給轉化成一個 Element 對象,給放到 Elemeng數組 當中,這樣直接就可以載入我們插件中的類了。

1、首先我們肯定是要得到插件APK的的中DexPathList對象中的dexElement數組

2、插件的dexElements數組我們拿到了,那麼是不是要開始拿我們系統裡面的 ,我們反射獲取,和上面的一樣。

3、上面我們獲取到了系統和我們插件的dexElement數組,然後我們將這個數組合並到一個新的數組裡面去,並且給注入到系統裡面

至此,載入插件的一個流程基本就完成了。但是上面只是處理了class文件,沒有處理資源。資源的話我們也是採用hook的方式去實現

在宿主的Application中hook這個方法,然後去重寫getAsserts和getResources兩個方法:

然後在插件的BaseActivity中繼續重寫getAssets和getResources兩個方法

這樣就可以完成hook式載入一個未安裝的APK了。至此基本就完成了插樁式和Hook式插件化的基本實現。(後面幾篇是優化)。

⑧ android 動態載入class,無法卸載么

class or interface may be unloaded if and only if its class loader is unreachable.
Classesloaded by the BootstrapClassLoader may not be unloaded。

意思是 類或介面可能不會被卸載除非ClassLoader是不能到達的,
被BootstrapClassLoader載入的類可能不會被卸載。也就是說BootstrapClassLoader載入的部分基本不可能被卸載。

其實一個已經載入的類是無法被更新的,如果你試圖用同一個ClassLoader再次載入同一個類,
就會得到異常(java.lang.LinkageError: plicate classdefinition),
我們只能夠重新創建一個新的ClassLoader實例來再次載入新類。
至於原來已經載入的類,開發人員不必去管它,
因為它可能還有實例正在被使用,只要相關的實例都被內存回收了,那麼JVM就會在適當的時候把不會再使用的類卸載。

java的回收機制主要是針對堆區的,即主要針對的是對象的回收,
而其他的關於類的內存,因為自身並不佔用太多而且也不會膨脹式地增長,
所以java沒有對這部分的回收作過多地考慮。

⑨ 關於android鏈接class庫調試

呵呵,一看就是第一次運行AVD吧?
一塊黑色的區域,中間是「ANDROID」證明一切都很正常,不過就是需要等到待機界面出來,不要著急,電腦上運行會比較慢。
要是你有Android手機或MID等實體機就會發現那僅僅是個待機界面而已。
祝你好運!

⑩ android 動態載入class,無法卸載么

可以的,android中使用布局是為了加快開發,最終控制項還是通過解析XML後,通過代碼添加的。 具體方法: 例如你的布局是一個Linearlayout linear;上面有一本Button btn1; 要刪除這個btn1要做的就是 linear.removeView( btn1 );

閱讀全文

與android載入class相關的資料

熱點內容
皓強工具解壓步驟 瀏覽:688
部隊抗洪搶險命令範文 瀏覽:886
歐姆龍plc編程軟體使用教程 瀏覽:592
ai文件pdf 瀏覽:911
騰訊雲伺服器掛載混合雲 瀏覽:758
智能小車用什麼單片機 瀏覽:463
java怎麼給窗口關閉 瀏覽:940
列舉51單片機的定址方式 瀏覽:706
剪輯app怎麼寫長篇文字 瀏覽:400
app專屬流量過月租怎麼不更新 瀏覽:654
王者程序員都有誰 瀏覽:76
給牛換腳掌解壓 瀏覽:387
圍棋有多少種演算法 瀏覽:602
unity資源包在哪個文件夾 瀏覽:704
阿里雲伺服器遠程鏈接不成功 瀏覽:482
文件系統pdf 瀏覽:767
原神安卓區服什麼意思 瀏覽:37
貝殼app怎麼線上發布 瀏覽:161
如何挑選安卓系統機頂盒 瀏覽:55
安卓快充使用有什麼注意事項 瀏覽:911