作者:雨田Android開發
鏈接:http://www.lxweimin.com/p/6182c474b66f
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
1 需求
你是否用過友盟、微信、微博、支付寶的sdk?
有沒有想研究一下對方的代碼,卻發現已經混淆了?
你有沒有想過有一天,你也會進入一家牛逼的企業,需要發布自己SDK?
又或者僅僅是滿足自己的虛榮心,發布一個自己得意的工具?
這篇文章正是為實現這一目的
2 開發環境及工具
MAC(Windows也無所謂,路徑不同而已)
Android Studio 2.3.1
JDK 1.8
Github
Maven
3 實現步驟
3.1 新建工程
新建一個工程TestModule,選擇empty activity,讓Android studio生成一個最簡單的activity,這個工程我們用來做什么的呢?
大家知道,你交付的代碼是需要有質量保證的,因此需要對他有過詳盡的測試,這個工程就是我們的測試工程,簡單來說就模擬用戶的開發環境
3.2 新建module
新版本的Android Studio已經支持模塊開發,我們選擇File-->New-->New Module,此時會有一個彈框,我們選擇Android Library,并起名為MySDK
image
新建成功后,你會發現左側工程導航欄里,多出了一個模塊工程,這個工程有著獨立的一套目錄結構,跟app一樣。他有自己獨立的gradle配置
image
3.2 建立功能類
在mysdk這個模塊下的操作跟普通的Android工程沒有任何區別,所以我們按平常一樣,建立一個新的activity,起名叫mySDKTest,并自動建好layout。這篇文章的重點不在功能,所以我們在這個layout中隨便建一個什么view,我們就建一個button吧,實現一個最簡單的功能,點擊這個button,就打印出一句“You clicked module button”。
假設,這個就是我們最終要封裝的功能。
image
<?xml version="1.0" encoding="utf-8"?><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffffff"xmlns:android="http://schemas.android.com/apk/res/android"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/button"android:text="Button"/></LinearLayout>
publicclassmySDKTestextendsAppCompatActivity{privatestaticfinalStringTAG="mySDKTest";@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_my_sdktest);Buttonbutton=(Button)findViewById(R.id.button);button.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){Log.i(TAG,"You clicked module button!!");}});}}
3.3測試功能
此時,你會發現你根本run不起來這個工程,根本沒有選項去跑這個功能,可選的只有app,沒有mysdk。
image
這就是我們在3.1新建工程時說這個工程是測試工程的原因,因為Module根本跑不起來的啊
3.4配置依賴
因此我們要用到app來測試SDK,所以我們要在app中配置依賴mysdk。
方法是在app的build.gradle里加入依賴語句
compile project(':mysdk')
此時,再去app的MainActivity里,你就可以import我們剛剛建立的mySDKTest了。
同樣,我們實現一個button,點擊跳轉到mysdk的activity。
Buttonbutton=(Button)findViewById(com.flame.mysdk.R.id.button);button.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){Intentintent=newIntent(MainActivity.this,mySDKTest.class);startActivity(intent);}});
這樣就能跑起來測試了
跑起來后,點擊跳轉按鈕,會發現進入了sdk的頁面,再點擊按鈕,會打出那句log。
之后你可以根據自己的需求,繼續開發,并測試。
image
3.5 管理依賴
3.5.1簡單方式
我們假設,你已經完成了功能開發和測試,現在需要發布出去或者提交給用戶,如何給到用戶呢?
我們打開mysdk的目錄,在build-->outputs-->aar下面是有生成的AAR文件,你把這個文件拷貝一份給用戶其實,也是可以的,大家搜一下導入AAR文件即可。
image
3.5.2 Maven + Github
Apache Maven是Apache開發的一個工具,提供了用于貢獻library的文件服務器。
通過Maven + Github的方式,我們可以更簡單的發布,更便捷的做版本管理;用戶可以更簡單的導入。
也是我們重點要講的內容
3.5.2.1配置打包gradle
在mysdk的目錄下,新建一個名為maven-release-aar.gradle的文件,并在build.gradle中添加如下字段:
applyfrom:'maven-release-kline-aar.gradle'
image
3.5.2.2配置maven-release-aar.gradle
可以這么理解,maven-release-aar.gradle就是我們用來設置打包的腳本,在文件中添加如下代碼:
注意看注釋!!
// 1.maven-插件apply plugin:'maven'//?
2.maven-信息ext{// ext is a gradle closure allowing the declaration of global propertiesPUBLISH_GROUP_ID='com.flame'PUBLISH_ARTIFACT_ID='mySDK'PUBLISH_VERSION=android.defaultConfig.versionName}// 3.maven-輸出路徑
uploadArchives{
? ? ? ?repositories.mavenDeployer{
//這里就是最后輸出地址,
在自己電腦上新建個文件夾,把文件夾路徑粘貼在此//注意”file://“ + 路徑,有三個斜杠,別漏了(如果路徑找不到注意要帶上對應盤路徑)
repository(url:"file:///C:/Users/flame/Documents/sourceTree/mysdk")
pom.project{
groupId project.PUBLISH_GROUP_ID
artifactId project.PUBLISH_ARTIFACT_ID
version project.PUBLISH_VERSION
}
}
}
//以下代碼會生成jar包源文件,如果是不開源碼,請不要輸入這段//aar包內包含注釋
taskandroidSourcesJar(type:Jar){
classifier='sources'fromandroid.sourceSets.main.java.sourceFiles
}
artifacts{
archives androidSourcesJar
}
3.5.2.3生成AAR文件
接下來就是生成最終的AAR文件了,在Android studio右側有個gradle側邊欄,點擊會有如下畫面,選擇mysdk,點擊uploadArchives
image
最后build成功
image
再去上面配置好的maven輸出路徑下看,會發現已經有生成文件了。
注意看,version是1.0,而且有jar包,解壓jar包就會得到全部源文件
如果在上一步不開源,注釋掉生成jar包的代碼,這里就不會有jar包
image
3.5.2.4.1上傳至github
將整個文件夾上傳至Github,注意,要上傳的是完整的路徑
在github中新建organization,create new-new organization.
此處需要注意,create new有兩個選項,new repository和new organization,此處務必要選擇organization,雖然區別不大,但是假如選擇repository的話不能夠作為私有倉庫導入到新項目(報Failed to resolve錯誤)
3.5.2.4.2上傳至碼云(
這是另外一篇文章,不要糾結兩篇文章的項目路徑,只要參考對應操作完成即可。
作者:啥啥啥娜娜)
鏈接:http://www.lxweimin.com/p/3e0b213ab03d
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
1,首先在碼云上新建一個項目,如下圖所示
2,本地新建一個文件夾
3,進入新建的文件夾,點擊鼠標右鍵,選擇git bash here
然后在窗口輸入 git init ?這時候文件夾會多出一個.git文件夾,看不到文件夾的,點擊鼠標右鍵選擇“顯示不顯示隱藏的文件”就可以看到這個文件夾了
4,進入剛剛在碼云新建的項目里,復制框框里的路徑
5,然后在回到本地新建的文件夾里
繼續操作git ? ?
輸入git remote add origin + 你剛剛在碼云復制的那行路徑
6,繼續輸入 git pull origin master 命令,將碼云上的倉庫pull到本地文件夾
7,將要上傳的文件,添加到剛剛創建的文件夾? ?
8,使用git add .? (. 表示所有的)或者 git add + 文件名? ? ? ? ? ? // 將文件保存到緩存區
9,使用git commit -m '新添加的文件內容描述'? ? ?//添加文件描述
10、使用git push origin master ,將本地倉庫推送到遠程倉庫
11,回到碼云,刷新試試,就可以看到新建項目了?
3.5.2.5 管理版本
剛剛提到之所以用maven的一個原因就是版本控制,這里我們就演示一下,所謂的版本控制
打開mysdk的build.gradle,修改defaultConfig下的versionName 為"1.1"
image
再來一次#3.5.2.3 - uploadArchives,build成功后再看目錄,已經生成了新的版本1.1
再上傳至Github
這樣我們就有了清晰的版本控制
image
3.6 如何引用
在之前的章節中,我們已經生成了對應代碼,那么如何引用呢?
首先我們先要在app的build.gradle里面移除之前的依賴方法
//注釋掉這段,不需要了//compile project(':mysdk')
3.6.1 本地模式
代碼就在我們本地,我們當然可以就近引用咯
我們在app的build.gradle中加入如下代碼,這里已經省略了無關代碼
repositories{jcenter()//略//指定絕對路徑maven{url"file:///Users/flame/Documents/sourceTree/mysdk"}}dependencies{//略//mysdk,這里可以指定版本,我們有1.0,1.1兩個版本可選compile('com.flame:mySDK:1.1')}
3.6.2 網絡模式
上面提到的方法,當然是少數,畢竟我們大多數都是在網絡導入依賴庫,這里就是需要用到之前上傳至Github的代碼了。
只需把路徑指向Github即可
repositories{jcenter()//略//指定Github路徑maven{url"https://github.com/flameandroid/mysdk/raw/master"}}dependencies{//略?//mysdk,這里可以指定版本,我們有1.0,1.1兩個版本可選compile('com.flame:mySDK:1.1')}
3.7 混淆
我們打開External Libraries,會發現mySDK已經導入工程,而且還是完全開源的。
而很多時候我們是不需要開源的,那么如何做到呢?其實和普通的Android打包混淆一模一樣
把混淆過的代碼上傳至Github,這樣我們就完成了SDK的制作和發布
release{// 不顯示LogbuildConfigField"boolean","LOG_DEBUG","false"http://混淆minifyEnabledtrue//Zipalign優化zipAlignEnabledtrue// 移除無用的resource文件shrinkResourcestrue//前一部分代表系統默認的android程序的混淆文件,該文件已經包含了基本的混淆聲明,后一個文件是自己的定義混淆文件proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}
4 注意事項
注意路徑一定要寫對,特別是大小寫,路徑的大小寫不對是找不到文件的,這雖然是低級錯誤,但其實挺常見的
注意Github路徑不是常見的https://github.com/flameandroid/mysdk.git,
而是https://github.com/flameandroid/mysdk/raw/master
注意如果選擇了混淆,切勿在打包那步生成了jar,還上傳到Github了,否則白混淆了