㈠ 如何使用android Studio打包混淆的Jar
使用AS打包混淆Jar包,網路一下,一片一片的,但是很多都是零零散散的寫得不是很詳細或是直接拷貝,按照他們的教程測試總不是很順利,所以這里我就把我個人學習AS打包混淆Jar的成果總結出來,希望對大家有幫助。個人覺得寫得還是比較詳細的
使用gradle混淆打包Jar
使用AS開發項目,引入第三方庫是非常方便的,我們只需要在build.gradle中配置一行代碼就可以輕松引入我們需要的開發庫。那麼gradle可以幫我們混淆打包Jar嗎?答案是當然可以!
那麼我們如何打包Jar呢?其實我們在編譯項目的時候,AS已經幫我們在目錄build/intermediates/bundles/release/classes.jar打好了Jar。那麼我們需要做的就是把Jar進行混淆的工作了。這里以個人項目bannerDemo為例,混淆步驟如下:
在你的library的build.gradle文件中加入如下代碼:
task makeJar(type: proguard.gradle.ProGuardTask, dependsOn: "build") {
// 未混淆的jar路徑
injars 'build/intermediates/bundles/release/classes.jar'
// 混淆後的jar輸出路徑
outjars 'build/outputs/cocolove2-banner-1.1.0.jar'
// 混淆協議
configuration 'proguard-rules.pro'}
配置混淆協議
1.我們先把AS自帶的協議配置進來中文注釋,筆者添加
# This is a configuration file for ProGuard.# http://proguard.sourceforge.net/index.html#manual/usage.html## Starting with version 2.2 of the Android plugin for Gradle, these files are no longer used. Newer# versions are distributed with the plugin and unpacked at build time. Files in this directory are# no longer maintained.#表示混淆時不使用大小寫混合類名-dontusemixedcaseclassnames#表示不跳過library中的非public的類-#列印混淆的詳細信息-verbose# Optimization is turned off by default. Dex does not like code run# through the ProGuard optimize and preverify steps (and performs some# of these optimizations on its own).-dontoptimize##表示不進行校驗,這個校驗作用 在java平台上的-dontpreverify# Note that if you want to enable optimization, you cannot just# include optimization flags in your own project configuration file;# instead you will need to point to the# "proguard-android-optimize.txt" file instead of this one from your# project.properties file.-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService-keep public class com.android.vending.licensing.ILicensingService# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native-keepclasseswithmembernames class * {
native <methods>;
}# keep setters in Views so that animations can still work.# see http://proguard.sourceforge.net/manual/examples.html#beans-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}# We want to keep methods in Activity that could be used in the XML attribute onClick-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}# The support library contains references to newer platform versions.# Don't warn about those in case this app is linking against an older# platform version. We know about them, and they are safe.-dontwarn android.support.**# Understand the @Keep support annotation.-keep class android.support.annotation.Keep-keep @android.support.annotation.Keep class * {*;}-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
2.AS自帶的配置文檔還是不夠的,我們還需要加入如下配置
這里只展示基本操作,在實際開發中可能需要更多依賴,要根據具體情況引入自己需要的依賴包
#下面代碼中的xx是指我個人的配置路徑,涉及個人信息,這里以xx代替
#引入依賴包rt.jar(jdk路徑)
-libraryjars /xxx/xx/xx/jdk1.8.0_77.jdk/Contents/Home/jre/lib/rt.jar
#引入依賴包android.jar(android SDK路徑)
-libraryjars /xx/xx/xx/Android/sdk/platforms/android-24/android.jar
#如果用到Appcompat包,需要引入
-libraryjars /xxx/xxx/xx/xxx/MyApplication/library-banner/build/intermediates/exploded-aar/com.android.support/appcompat-v7/24.1.1/jars/classes.jar
-libraryjars /xx/xx/xx/xx/MyApplication/library-banner/build/intermediates/exploded-aar/com.android.support/support-v4/24.1.1/jars/classes.jar
#忽略警告
-ignorewarnings
#保證是獨立的jar,沒有任何項目引用,如果不寫就會認為我們所有的代碼是無用的,從而把所有的代碼壓縮掉,導出一個空的jar
-dontshrink
#保護泛型
-keepattributes Signature
3.加入自己不想混淆的配置根據實際需求配置
-keep class com.cocolove2.library_banner.view.**{*;}
在命令行執行命令混淆Jar,提示BUILD SUCCESFUL表示成功!
//mac./gradlew makeJar//windowsgradlew makeJar
示例展示
我這里以混淆library-banner庫為例
1.首先我們要看看下我們的buildTool的配置,如下圖:
混淆報錯解決辦法個人遇到的
proguard5.2.1下載地址
閱讀
㈡ android studio怎麼導出jar包
在Android Studio中,自帶反編譯查看class文件,如果沒有混淆的話,class文件跟java文件基本沒有區別了,為了保護,還是混淆的好。
網上看了不少資料,都是直接下載proguard額外jar,直接生成,覺得不方便,既然apk都能混淆,為什麼不直接通過Android Studio來混淆jar包呢。
做法其實很簡單,一個build文件,一個proguard文件就可以了。
首先要明白jar從哪裡來,以前在Eclipse中是一個project設置為library,然後另外一個主project依賴它。build一下,在library中就會生成jar文件了。
在Android Studio是mole的概念,其實也相當於project。主app mole依賴其它子mole,在打包時,會將其它mole打成aar,賦給主app。所以jar是針對整個mole來make的。
如果mole內僅僅是java代碼,生成jar是沒問題的,但如果還有resource文件,那就得打aar文件了。
在你要打jar包的mole build文件中,加上一個生成jar包的task。其實即使不添加,在整個工程build時也會生成jar文件的。在build/intermediates/bundles/release/classes.jar可以找到。只是沒混淆罷了。
task makeJar(type: proguard.gradle.ProGuardTask, dependsOn: "build") {
// 未混淆的jar
injars 'build/intermediates/bundles/release/classes.jar'
// 混淆後的jar路徑
outjars 'build/http.jar'
// 具體需要keep住的類
configuration 'proguard-rules.pro'
}
這個時候,在Termial中就輸入./gradlew makeJar就能將classes.jar復制倒http.jar了。這個時候還是沒混淆的,因為混淆根本沒寫。
如果mole中同時也依賴其它libs,那需要在proguard中聲明那些libs。比如:#-libraryjars libs\gson-2.2.2.jar,大部分都跟apk混淆類似的,只不過是局限於某個mole而已。
附送一個proguard供大家參考,也是網上找的。最後混淆效果並不是很好,只是簡單的將部分變數改成了abcd這樣,不過也夠了。總不能將方法也混淆,這樣外部調用就麻煩了。
㈢ android proguard 是什麼目錄
android里proguard.cfg文件是代碼混淆用,是為了防止你的apk被反編譯而代碼全部暴露.不過目前的代碼混淆只是把命名修改了一下而已,真正反編譯時還是可以想辦法還原出來的,所以不能真正的混淆。 其詳解為: -injars androidtest.jar【jar包所在地址】 -outjars out【輸出地址】 -libraryjars 'D:\android-sdk-windows\platforms\android-9\android.jar' 【引用的庫的jar,用於解析injars所指定的jar類】 -optimizationpasses 5 -dontusemixedcaseclassnames 【混淆時不會產生形形色色的類名 】 - 【指定不去忽略非公共的庫類。 】 -dontpreverify 【不預校驗】 -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 【優化】 -keep public class * extends android.app.Activity【不進行混淆保持原樣】 -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keep public abstract interface com.asqw.android.Listener{ public protected <methods>; 【所有方法不進行混淆】 } -keep public class com.asqw.android{ public void Start(java.lang.String); 【對該方法不進行混淆】 } -keepclasseswithmembernames class * { 【保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之後)】 native <methods>; } -keepclasseswithmembers class * { 【保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。】 public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity {【保護指定類的成員,如果此類受到保護他們會保護的更好 】 public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable {【保護指定的類文件和類的成員】 public static final android.os.Parcelable$Creator *; }
㈣ proguard android怎麼升級
剛好解決這個問題。
進官網 http://proguard.sourceforge.net/
下載最新版本,覆蓋到 Android sdk 中的 tools 目錄下即可
㈤ proguard-android.txt文件做什麼用的
針對android選擇user版本進行編譯的時候,會出現proguard錯誤,我們需要知道的事情1.proguard是做什麼的,他的作用是將java代碼進行混淆的工具2.因為proguard是混淆工具,所以android的mk文件也對其支持為兩種方式:1.指定不需要混淆的native方法與變數的proguard.flags文件如:LOCAL_PROGUARD_FLAG_FILES:=proguard.flags2.制定編譯的工程,不要使用代碼混淆的工具進行代碼混淆如:LOCAL_PROGUARD_ENABLED:=disabled3.不設置,默認使用LOCAL_PROGUARD_ENABLED:=full.即將該工程代碼全部混淆/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////在Android項目中用到JNI,當用了proguard後,發現native方法找不到很多變數,原來是被proard優化掉了。所以,在JNI應用中該慎用progurad啊。解決法:1、在Android.mk中加入一行:LOCAL_PROGUARD_FLAGS:=-include$(LOCAL_PATH)/proguard.flags2、創建proguard.flag文件,裡面寫入不需要proguard優化的類和方法。例如:-keepclassoms.miracle.mobiletv.broadcast.ServiceContext{*;}我的這個類是和JNI相關的,不想讓proguard去優化而引起錯誤,向上面寫就能實現。----------下面是網上找到的一些proguard的資料,貼出來分享:ProGuard是一個免費的java類文件壓縮,優化,混淆器.它探測並刪除沒有使用的類,欄位,方法和屬性.它刪除沒有用的說明並使用位元組碼得到最大優化.它使用無意義的名字來重命名類,欄位和方法.ProGuard的使用是為了:1.創建緊湊的代碼文檔是為了更快的網路傳輸,快速裝載和更小的內存佔用.2.創建的程序和程序庫很難使用反向工程.3.所以它能刪除來自源文件中的沒有調用的代碼4.充分利用java6的快速載入的優點來提前檢測和返回java6中存在的類文件.參數:-include{filename}從給定的文件中讀取配置參數-basedirectory{directoryname}指定基礎目錄為以後相對的檔案名稱-injars{class_path}指定要處理的應用程序jar,war,ear和目錄-outjars{class_path}指定處理完後要輸出的jar,war,ear和目錄的名稱-libraryjars{classpath}指定要處理的應用程序jar,war,ear和目錄所需要的程序庫文件-指定不去忽略非公共的庫類。-指定不去忽略包可見的庫類的成員。保留選項-keep{Modifier}{class_specification}保護指定的類文件和類的成員-keepclassmembers{modifier}{class_specification}保護指定類的成員,如果此類受到保護他們會保護的更好-keepclasseswithmembers{class_specification}保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。-keepnames{class_specification}保護指定的類和類的成員的名稱(如果他們不會壓縮步驟中刪除)-keepclassmembernames{class_specification}保護指定的類的成員的名稱(如果他們不會壓縮步驟中刪除)-keepclasseswithmembernames{class_specification}保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之後)-printseeds{filename}列出類和類的成員-keep選項的清單,標准輸出到給定的文件
㈥ 有什麼好用的Android Studio的插件值得推薦
1.GsonFormat
快速將json字元串轉換成一個Java Bean,免去我們根據json字元串手寫對應Java Bean的過程。
使用方法:快捷鍵Alt+S也可以使用Alt+Insert選擇GsonFormat
2.Android ButterKnife Zelezny
配合ButterKnife實現註解,從此不用寫findViewById,想著就爽啊。在Activity,Fragment,Adapter中選中布局xml的資源id自動生成butterknife註解。
使用方法:Ctrl+Shift+B選擇圖上所示選項
3.Android Code Generator
根據布局文件快速生成對應的Activity,Fragment,Adapter,Menu。
4.Android Parcelable code generator
JavaBean序列化,快速實現Parcelable介面。
5.Android Methods Count
顯示依賴庫中得方法數
6.Lifecycle Sorter
可以根據Activity或者fragment的生命周期對其生命周期方法位置進行先後排序,快捷鍵Ctrl + alt + K
7.CodeGlance
在右邊可以預覽代碼,實現快速定位
8.findBugs-IDEA
查找bug的插件,Android Studio也提供了代碼審查的功能(Analyze-Inspect Code…)
9.ADB WIFI
使用wifi無線調試你的app,無需root許可權
也可參考以下文章:
Android wifi無線調試App新玩法ADB WIFI
10.AndroidPixelDimenGenerator
Android Studio自動生成dimen.xml文件插件
11.JsonOnlineViewer
在Android Studio中請求、調試介面
12.Android Styler
根據xml自動生成style代碼的插件
Usage:
a. lines with future style from your layout.xml file
b. paste it to styles.xml file with Ctrl+Shift+D (or context menu)
c. enter name of new style in the modal window
d. your style is prepared!
13.Android Drawable Importer
這是一個非常強大的圖片導入插件。它導入Android圖標與Material圖標的Drawable ,批量導入Drawable ,多源導入Drawable(即導入某張圖片各種dpi對應的圖片)
14.SelectorChapek for Android
通過資源文件命名自動生成Selector文件。
15.GenerateSerialVersionUID
實現Serializable序列化bean
Adds a new action 『SerialVersionUID』 in the generate menu (alt + ins). The action adds an serialVersionUID field in the current class or updates it if it already exists, and assigns it the same value the standard 『serialver』 JDK tool would return. The action is only visible when IDEA is not rebuilding its indexes, the class is serializable and either no serialVersionUID field exists or its value is different from the one the 『serialver』 tool would return.
16.genymotion
速度較快的android模擬器
17.LeakCanary
幫助你在開發階段方便的檢測出內存泄露的問題,使用起來更簡單方便。
可以參考以下文章:
LeakCanary 中文使用說明
18.Android Postfix Completion
可根據後綴快速完成代碼,這個屬於拓展吧,系統已經有這些功能,如sout、notnull等,這個插件在原有的基礎上增添了一些新的功能,我更想做的是通過原作者的代碼自己定製功能,那就更爽了
19.Android Holo Colors Generator
通過自定義Holo主題顏色生成對應的Drawable和布局文件
20.dagger-intellij-plugin
dagger可視化輔助工具
21.
maven gradle 依賴支持自動補全
22.RemoveButterKnife
ButterKnife這個第三方庫每次更新之後,綁定view的註解都會改變,從bind,到inject,再到bindview,搞得很多人都不敢升級,一旦升級,就會有巨量的代碼需要手動修改,非常痛苦
當我們有一些非常棒的代碼需要拿到其他項目使用,但是我們發現,那個項目對第三方庫的使用是有限制的,我們不能使用butterknife,這時候,我們又得從註解改回findviewbyid
針對上面的兩種情況,如果view比較少還好說,如果有幾十個view,那麼我們一個個的手動刪除註解,寫findviewbyid語句,簡直是一場噩夢(別問我為什麼知道這是噩夢)
所以,這種有規律又重復簡單的工作為什麼不能用一個插件來實現呢?於是RemoveButterKnife的想法就出現了。
具體介紹
23.AndroidProguardPlugin
一鍵生成項目混淆代碼插件,值得你安裝~(不過目前可能有些第三方項目的混淆還未添加完全)
24.otto-intellij-plugin
otto事件導航工具。
25.eventbus-intellij-plugin
eventbus導航插件
26.idea-markdown
markdown插件
27.Sexy Editor
設置AS代碼編輯區的背景圖
首先點擊界面的設置按鈕 進入設置界面,選中Plugins,右邊選擇 Browser … ,輸入Sexy … 下面自動彈出候選插件,右邊點擊Install 安裝
安裝成功 後需要重啟AS
重啟完成之後 進入設置界面 選擇other Setting 下的Sexy Editor , 右側 insert 一張或多張圖片即可,上面的其他設置可以設置方位 間隔時間 透明度等等,設置完成後,要關閉打開的文件,重新打開項目文件即可在代碼編輯區顯示插入的圖片,作為代碼編輯區的背景圖。
28.folding-plugin
布局文件分組的插件
29.Android-DPI-Calculator
DPI計算插件
使用:
或者
30.gradle-retrolambda
在java 6 7中使用 lambda表達式插件
修改編譯的jdk為java8:
31.Android Studio Prettify
可以將代碼中的字元串寫在string.xml文件中
選中字元串滑鼠右鍵選擇圖中所示
這個插件還可以自動書寫findViewById
32.Material Theme UI
添加Material主題到你的AS
33..ignore
我 們都知道在Git 中想要過濾掉一些不想提交的文件,可以把相應的文件添加到.gitignore 中,而.gitignore 這個Android Studio 插件根據不同的語言來選擇模板,就不用自己在費事添加一些文件了,而且還有自動補全功能,過濾文件再也不要復制文件名了。我們做項目的時候,並不是所有文 件都是要提交的,比如構建的build 文件夾,本地配置文件,每個Mole 生成的iml 文件,但是我們每次add,commit 都會不小心把它們添加上去,而gitignore 就是解決這種痛點的,如果你不想提交的文件,就可以在創建項目的時候將這個文件中添加即可,將一些通用的東西屏蔽掉。
34.CheckStyle-IDEA
CheckStyle-IDEA 是一個檢查代碼風格的插件,比如像命名約定,Javadoc,類設計等方面進行代碼規范和風格的檢查,你們可以遵從像Google Oracle 的Java 代碼指南 ,當然也可以按照自己的規則來設置配置文件,從而有效約束你自己更好地遵循代碼編寫規范。
35.Markdown Navigator
github:Markdown Navigator
Markdown插件
36.ECTranslation
Android Studio Plugin,Translate English to Chinese. Android Studio 翻譯插件,可以將英文翻譯為中文。
37.PermissionsDispatcher plugin
github:PermissionsDispatcher plugin
自動生成6.0許可權的代碼
38.WakaTime
github:WakaTime
記錄你在IDE上的工作時間
39.AndroidWiFiADB
無線調試應用
40.AndroidLocalizationer
可用於將項目中的 string 資源自動翻譯為其他語言的 Android Studio/IntelliJ IDEA 插件
歡迎關注微信公眾號:終端研發部。和我一塊交流和學習
㈦ Android ijkplayer詳細使用步驟
ijkplayer是Bilibili基於ffmpeg開發並開源的輕量級視頻播放器,支持播放本地網路視頻,也支持流媒體播放。支持Android&iOS。
ijkplayer的編譯這里不多闡述,我也是直接獲取別人編譯完成的so庫文件,直接使用的。如果你對ijkplayer的編譯感興趣,可以網路一下,有很多文章。
使用ijkplayer
導包
ijkplayer源碼官方下載地址:https://github.com/Bilibili/ijkplayer
上面是官方提供的ijkplayer的源碼地址,但是它是沒有編譯過的。下面我給大家分享一份編譯好的ijkplayer源碼,由於比較大,分了三個包才上傳完成,需要三個包都下載後才能一起解壓:
編譯好的ijkplayer.part1
編譯好的ijkplayer.part2
編譯好的ijkplayer.part3
我們下載完成,進入android/ijkplayer目錄:
ijkplayer-java:ijkplayer的一些操作封裝及定義。這裡面是通用的API介面,裡面最主要的是IMediaPlayer,它是用來渲染顯示多媒體的。
ijkplayer-exo:google開源的一個新的播放器ExoPlayer,在Demo中和ijkplayer對比用的。通過安裝ijkplayer可以發現setting裡面可以選擇不同player來渲染多媒體顯示,該模塊下面就是一個MediaPlayer。
ijkplayer-example:測試程序
ijkplayer-{arch}:編譯出來的各個版本的.so文件。
官方提供的Demo的代碼還是挺多的,甚至還用了otto,需要對官方的demo進行精簡,去除一些用不到的代碼。
首先需要的是ijkplayer-{arch}、ijkplayer-Java兩個庫。exo是Google提供的新的播放器,這里不需要,直接砍掉。其次是ijkplayer-example里的,我們需要的只有tv.danmaku.ijk.media.example.widget.media包下的部分類。
註:
鏈接庫ijkplayer-arm64,ijkplayer-armv5,ijkplayer-armv7a,ijkplayer-x86,ijkplayer-x86_64是不同體系架構的動態鏈接庫,在當前工程結構裡面作為一個模塊,如果不想做兼容多平台問題,可以刪除其他目錄結構,單獨保留自己需要的平台目錄。
新建一個工程:
(1)把ijkplayer-armv7a/src/main/libs下的文件拷貝到新工程app目錄的libs下。
(2)把ijkplayer-java/build/outputs/aar/ijkplayer-java-release.aar復制到新工程app目錄的libs下。
(3)修改APP下的build.gradle, 主要設置.so及.aar的位置:
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.hx.ijkplayer_demo"
minSdkVersion 14
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs'] /**在libs文件夾下找so文件*/
}
}
}
repositories {
mavenCentral()
flatDir {
dirs 'libs' /**在libs文件夾下找aar文件*/
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', mole: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
compile(name: 'ijkplayer-java-release', ext: 'aar') /**編譯ijkplayer-java-release.aar文件*/
}
(4)復制ijkplayer-example下面的tv.danmaku.ijk.media.example.widget.media到新的工程,刪掉一些不需要類。
(5)IjkVideoView裡面還是有很多如exo等沒用的東西,刪!具體可以參見我後面的Demo。
(6)Manifest
...
<activity android:name=".MainActivity"
android:screenOrientation="sensorLandscape"
android:configChanges="orientation|keyboardHidden">
...
</activity>
...
<uses-permission android:name="android.permission.INTERNET"/>