一. Android Studio External Tools
AS擴展工具, 可以讓我們自定義一些命令行工具. 比如說: 自動生成JNI頭文件, 反編譯Java字節(jié)碼文件(查看某個類的方法簽名), 打debug/release包等等.
下面就來看看如何利用Android Studio External Tools
機制類實現(xiàn)這些功能.
二. JNI開發(fā)中生成c頭文件
在JNI開發(fā)中我們的Java Native
方法都會對應(yīng)到c語言中的Native方法. 一般我們先在Java中先聲明native方法, 然后在用javah
來生成頭文件. 不過javah這個命令使用起來特別不方便, 應(yīng)為需要輸入文件路徑(或者類名). 這時我們可以使用Android Studio External Tools
來擴展一個圖形工具, 來簡化繁雜的命令輸入:
0x01. 用javah
命令生成C語言頭文件
項目結(jié)構(gòu)如下:
a. 在Java文件中編寫native方法, 如下:
public final class ApiTools {
static {
//加載本地庫文件 (省略前綴lib和后綴.so)
System.loadLibrary("mynative"); //加載libmynative.so文件
}
private ApiTools() {
//no instance
}
/**
* 請求一個API
* @param apiString API地址
* @param callback 回調(diào)對象
* @param <T> api請求的數(shù)據(jù)類型
*/
public static <T> void request(String apiString, Callback<T> callback) {
request(apiString, getSignString(), callback);
}
private static <T> void request(String apiString, String signString, Callback<T> callback) {
// TODO: 17/4/17 require implemnt
}
// 本地方法 (對應(yīng)到C/C++中的本地方法)
private static native String getSignString();
}
b. 切換到源文件根目錄下: cd app/src/main/java
c. 生成C語言頭文件: javah -d jni -jni com.stone.jni_demo.network.ApiTools
0x002. javah擴展工具生成C語言頭文件
a. 操作步驟:
Perferences -> External Tools -> 點擊"加號"添加一個擴展工具 -> 填寫工具信息
如下圖所示:
b. 怎么使用?
操作步驟: 在native方法所在的類上右鍵 -> My Tools
-> 點擊javah (generate c header file)
, 如下圖:
這時會在main目錄下面生成jni目錄且在此目錄下生成C頭文件.
三. 反編譯Java字節(jié)碼文件(查看方法簽名)
在JNI開發(fā)中很多地方需要知道某個方法的簽名, 一般會使用javap命令來查看某個類中的方法簽名. 和javah
命令一樣, javap
使用起來也比較繁瑣, 我們也擴展一個工具來簡化它:
0x01. javap
命令行反編譯字節(jié)碼文件
a. 進入到classpath目錄下:
命令: cd app/build/intermediates/classes/debug
b. 反編譯字節(jié)碼文件(<PROJECT>/app/app/build/intermediates/classes/debug/com/stone/jni_demo/network/ApiTools.class):
命令: javap -c com.stone.jni_demo.network.ApiTools
注意, 最后面是類的全名稱
這樣會在命令行輸出下面的信息:
如果單純是想看方法的簽名, 用
-s
操作會更加清晰, 即:javap -s com.stone.jni_demo.network.ApiTools
輸出如下:
0x02. javap擴展工具查看字節(jié)碼信息
a. 操作和javap
擴展工具一樣, 只是信息界面填寫的信息不一樣, 下面是javap
擴展工具的信息界面填寫的信息:
b. 如何使用?
操作步驟: 在字節(jié)碼文件上右鍵 -> "My Tools" ->點擊"disassembling (javap -c)"
如下圖所示:
注意: 不能操作classpath下的字節(jié)碼文件 (猜測是權(quán)限問題, 但是我把字節(jié)碼文件權(quán)限改成777以及給父目錄添加了讀寫權(quán)限還是操作不能執(zhí)行成功, 具體原因不明, 知道的童鞋給要告訴我哦, 非常感謝!)
如果操作classpath(<MODULE_PATH>/build/intermediates/classes/debug)下的字節(jié)碼會出現(xiàn)下面的錯誤提示:
下面的非常重要
**因此, 需要把字節(jié)碼文件從classpath目錄下copy出來, 我是copy到module的根目錄下了, 即app目錄下, 如下圖所示: **
這時候你在copy出來的字節(jié)碼文件上右鍵操作即可成功, 輸出如下:
四. 打debug/release包
下面這兩個 (當(dāng)然你還可以定制跟多的擴展工具) 擴展工具主要是為了減少輸入而已, 因為本人喜歡用命令行編譯或安裝, 如: ./gradlew :app:assembleDebug
, ./gradlew :myAndroidLibrary:assemRelease
, ./gradlew :app:installDebug
, ....
一般編譯debug/release包的時候會在項目根目錄下執(zhí)行:
./gradlew :someApplicationModule:assembleDebug
, ./gradlew :someApplicationModule:assembleRelease
下面的兩個擴展工具就是根據(jù)這個思路來配置的啦 ...
0x01. 打debug包
a. 操作步驟跟之前的擴展工具一樣, 下面看看擴展工具的信息填寫界面:
b. 如何使用?
操作步驟: 在android application module
或者android library module
上右鍵 -> My Tools
-> 點擊assembleDebug
(注意啦, java module
是沒有assembleDebug
和assembleRelease
task的)
如下圖所示:
0x02. 打release包
打release包的模式跟打debug包一樣, 只要把擴展工具信息頁中的debug字樣替換成release即可, 下面標出了要替換的地方:
前面有個地方忘記說明了, 擴展工具信息填寫頁面的$SomeVariable$
,其實是AS定義的一些宏, 每個宏都有說明, 可以自己查看啰:
Android Studio的External Tools
功能真心強大, 更多工具等待你去定制喲, 趕緊用起來吧 - -
本文只針對 mac os
系統(tǒng), 其他操作系統(tǒng)請自行變通 .
References:
https://www.jetbrains.com/help/idea/2017.1/external-tools.html