Mac vim命令行操作
MAC 終端編輯完成后如何保存 如果是vi顺又,則:Esc 退出編輯模式漠趁,輸入以下命令:
:wq 保存后退出vi
:wq! 則為強制儲存后退出(常用)
:w 保存但不退出(常用)
:w! 若文件屬性為『只讀』時逢唤,強制寫入該檔案
:q 離開 vi (常用)
:q! 若曾修改過檔案市怎,又不想儲存闸溃,使用 ! 為強制離開不儲存檔案。
:e! 將檔案還原到最原始的狀態(tài)谆棱!
配置環(huán)境變量:vim ~/.zshrc 按照里面模板去配置 source ~/.zshrc 保存
flutter配置時報錯(flutter not find)
1,open ~/.bash_profile
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
export PATH=/Users/mac/flutter/bin:$PATH
2.open ~/.zshrc 如果文件夾不存在 用vim命令創(chuàng)建文件夾并且和.bash_profile
中內(nèi)容保持一致保存退出后阶祭,再終端輸入:source .bash_profile 更新配置
android工作中碰到的些許問題
1, Android studio 編譯問題:finished with non-zero exit value 2
問題:Error:Execution failed for task
':androidShopNC2014Moblie:transformClassesWithDexForDebug'.>
com.android.build.api.transform.TransformException:
com.android.ide.common.process.ProcessException:
java.util.concurrent.ExecutionException:
com.android.ide.common.process.ProcessException:
org.gradle.process.internal.ExecException:
Process 'command
'/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java''
finished with non-zero exit value 2
答案:android {
defaultConfig {
multiDexEnabled true
}
}
2>.Android studio 編譯問題:finished with non-zero exit value 1(由于導入的依賴出現(xiàn)重復造成的)
問題:Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
>
com.[Android](http://lib.csdn.net/base/15).build.api.transform.TransformException:
com.android.ide.common.process.ProcessException:
org.gradle.process.internal.ExecException: Process 'command 'F:\Program Files
(x86)\[Java](http://lib.csdn.net/base/17)\jdk1.8.0_31\bin\java.exe'' finished
with non-zero exit value 1
解決方案:這個是因為依賴包重復了
(像v4和nineoldandroids),app中實現(xiàn)了對easeUI的依賴勒奇,但是app和easeUI都添加了對這個包的依賴。
所以就報這個錯誤巧骚,修改之后再報赊颠,就clean,rebuild一下劈彪。
3>.Android studio 編譯問題:finished with non-zero exit value
1(由于buildtools版本太高造成的)
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.ide.common.process.ProcessException:
org.gradle.process.internal.ExecException:
Process 'command
'/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java''
finished with non-zero exit value 1
錯誤原因: buildToolsVersion版本太高竣蹦,我原來的 buildToolsVersion "24.0.0”
需要jdk1.8,而我的是jdk1.7沧奴,所以一直報這個錯痘括,剛開始以為是v4包和V7包沖突,
因為之前遇到這樣的問題滔吠,而這次刪除V4包之后依然報這個錯纲菌,上stackoverflow搜了一下,
把buildTools版本降下來就好了疮绷。
4,執(zhí)行 bash: ./gradlew: Permission denied
解決方案: chmod +x gradlew
執(zhí)行./gradlew build --scan 命令查看編譯問題 詳細報錯信息
5.Manifest merger failed with multiple errors, see logs
解決方案:./gradlew processDebugManifest --stacktrace
查看編譯錯誤: ./gradlew clean assembleDebug --stacktrace
連接mumu模擬器: adb connect 127.0.0.1:5555
依賴樹 android studio查看第三方依賴樹
mac打開環(huán)境變量配置: open -e .bash_profile 刷新環(huán)境變量配置: source .bash_profile
生成ssh 如果本地有id_rsa.pub 先刪除本地文件 之后命令行執(zhí)行 ssh-keygen -t rsa -C
"jiyajie@aspirecn.com",一直確定即可Webview優(yōu)化: 創(chuàng)建一個全局的webView 將web單獨一個進程,用aidl進行通信
Activity 的 isDestroy 在被Activity調(diào)用之前就已經(jīng)賦值
所以只要是在onDestroy中處理的過程中isDestroy()返回一直未true獲取應(yīng)用簽名信息
JKS 密鑰庫使用專用格式翰舌。
建議使用
2(.keystore文件), keytool -list -v -alias migu -keystore
/Users/jiyajie/mgsv4pad_new/mgsv4pad_playvideo/mgsv4pad/app/padkey.jks
brew 安裝scrcpy
Mac安裝scrcpy:
1,brew install scrcpy
2,安裝過程比較緩慢 如果出現(xiàn)某一個包安裝失敗
使用 brew install (具體的包名即可 不要帶提示的版本號,否則依然找不到下載路徑)
這個過程非常漫長 如果有提示就一直brew install,終有一次會成功的
這個過程我斷斷續(xù)續(xù)用了五六天時間來完成
git基本操作
git 拉取代碼:
執(zhí)行: git fetch upstream
把上游的遠程代碼合并到本地的 master分支
git checkout master
git merge upstream/master
git commit –amend git commit --amend
相當于上次提交錯誤的信息被覆蓋了,gitk圖形化界面上看不到上次提交的信息冬骚,
git log上也看不到之前的信息椅贱,而add 后再commit
相當于重新加了一個信息。相當于打了個補丁
如果你想保留剛才本地修改的代碼只冻,
并把git服務(wù)器上的代碼pull到本地(本地剛才修改的代碼將會被暫時封存起來)
git stash
git pull origin master
git fetch upstream
git merge upstream/master
git stash pop
Git遠程放棄修改之后,本地恢復到某一個節(jié)點
git reset --soft a287041c0fd791412ff6351c705b036f04237a6e
git push origin master --force
部分adb命令操作
12.adb 開啟應(yīng)用 adb shell am start -n cn.cmvideo.car.play/.SplashActivity(包名)
adb shell getprop dalvik.vm.heapgrowthlimit
單個應(yīng)用可用最大內(nèi)存主要對應(yīng)的是這個值,它表示單個進程內(nèi)存被限定在64m,
即程序運行過程中實際只能使用64m內(nèi)存庇麦,超出就會報OOM。(僅僅針對dalvik堆喜德,不包括native堆)
dalvik.vm.heapstartsize 表示分配的初始堆大小
dalvik.vm.heapsize
heapsize參數(shù)表示單個進程可用的最大內(nèi)存山橄,但如果存在heapgrowthlimit參數(shù),
則以heapgrowthlimit為準.heapsize表示不受控情況下的極限堆住诸,
表示單個虛擬機或單個進程可用的最大內(nèi)存驾胆。而android上的應(yīng)用是帶有獨立虛擬機的,
也就是每開一個應(yīng)用就會打開一個獨立的虛擬機
這樣設(shè)計就會在單個程序崩潰的情況下不會導致整個系統(tǒng)的崩潰)贱呐。
adb shell getprop ro.build.version.release 查看系統(tǒng)版本號
adb logcat >/Users/jiyajie/Desktop/log.txt adb導出運行時log日志
adb shell am start -n com.android.settings/com.android.settings.Settings adb打開應(yīng)用設(shè)置
adb kill-server 殺死adb進程
adb shell getprop ro.product.cpu.abi 查看手機cpu架構(gòu)信息
adb shell cat /proc/cpuinfo 獲取cpu架構(gòu)信息
adb shell top 查看當前硬件下 cpu的實時占用情況
adb shell am start -n com.android.settings/com.android.settings.HWSettings
adb shell wm size 獲取屏幕寬高信息
adb shell pm clear com.xx.xx:清除對應(yīng)包的數(shù)據(jù)和緩存
鴻蒙設(shè)備: 進入setting adb shell am start -n com.android.settings/.HWSettings
更改日期: adb shell 進去: date 0825113620(11:36 8月25號20年)(按這個格式設(shè)置為當前時間)
拷貝密碼丧诺,鼠標放到【連接】按鈕上,粘貼密碼后奄薇,屏幕會變黑驳阎,直接在黑屏幕上點擊連接
性能優(yōu)化相關(guān)
卡頓優(yōu)化方面:
1.webView優(yōu)化: 創(chuàng)建一個全局的webView 將web單獨一個進程,用aidl進行通信
啟動優(yōu)化:
1.adb命令獲取啟動時間 adb shell am start -W 包名.SplashActivity
ThisTime: 代表最后一個Activity啟動時間
TotalTime: 代表所有Activity的啟動時間
WaitTime: 所有時間: ams啟動activity總耗時
2.方法耗時統(tǒng)計: 在Application的onCreat方法下加入Debug.startMethodTracing("TracePath")
總結(jié): 主要分為兩個方面: 1.業(yè)務(wù)流程優(yōu)化(視覺欺騙)
2. 代碼優(yōu)化(減少加載時間) ui優(yōu)化 內(nèi)存優(yōu)化 圖片優(yōu)化/緩存優(yōu)化 代碼量優(yōu)化
進程間通信相關(guān)內(nèi)容
進程間通信:
Binder通信的弊端: 1.aidl語法難寫,容易發(fā)生編譯異常
2.只支持基本類型,不支持對象類型
3.當應(yīng)用需要多個進程互相通信時需要多個aidl
4.調(diào)用復雜容易出現(xiàn)異常,進程的調(diào)用者無法統(tǒng)一管理
android 基礎(chǔ)知識點范圍
java 相關(guān)知識點:
Java 基礎(chǔ)語法,Java 基本數(shù)據(jù)類型,Java 變量類型,Java 運算符,for,while,
do...while,Java 條件語句,Java switch case,Java基礎(chǔ)
Java 對象和類,Java 字符串,Java 修飾符,Java Character 類,Java String 類,
Java 數(shù)組
Java Number & Math 類,StringBuffer 類,StringBuilder 類,Java 日期時間,
Java 方法,輸入、輸出流與文件,
Java Scanner 類,Java 異常處理,面向?qū)ο?線程,Java 繼承,Java 重寫(Override)
與重載(Overload),Java 多態(tài),
Java 抽象類,Java 封裝,Java 接口,Java 枚舉(enum),Java 包(package),
流程控制,Java 文檔注釋,Java 內(nèi)部類
android 基礎(chǔ)知識點:
活動,模擬器,布局組件,通用UI組件,消息通知組件,對話框組件,文件存儲,共享存儲,
SQLite,Tween動畫,Drawable動畫,
Property動畫,Fast-json,Java語言,SwitchView,SugarORM,Android Studio,
抽屜,活動發(fā)布,活動方向變化,
拖放,事件隊列和回調(diào),退出活動,姿勢,用戶輸入,用戶交互,鍵盤輸入
SQLite 簡介,命令,語法
函數(shù),運算符,注釋符,通配符,數(shù)據(jù)類型
信息安全: 實體安全,系統(tǒng)安全,網(wǎng)絡(luò)安全
Android 像素密度相關(guān)知識點dpi(dot per inch,每英寸點數(shù)):
ldpi: 適用于低密度屏幕(120dpi) 的資源
mdpi: 適用于中密度屏幕(160dpi) 的資源(這是基準密度)
hdpi: 適用于高密度屏幕(240dpi) 的資源
xhdpi: 適用于加高密度屏幕(320dpi) 的資源
xxhdpi: 適用于超超搞密度屏幕(480dpi) 的資源
xxxhdpi: 適用于超超超高密度屏幕(640dpi) 的資源
nodpi: 適用于所有密度資源,這些是和密度無關(guān)的資源,不論當前dpi是多少,
系統(tǒng)都不會縮放當前限定下的資源
ldpi-->xxxhdpi 之間的縮放比: 3:4:6:8:12:16
Android 中查找最佳匹配資源的規(guī)則:
一般來說,Android會「更傾向于縮小較大的原始圖像呵晚,而非放大較小的原始圖像」蜘腌。
在此前提下:
? 假設(shè)最接近設(shè)備屏幕密度的目錄選項為xhdpi,如果圖片資源存在饵隙,則匹配成功撮珠;
? 如果不存在,系統(tǒng)就會從更高密度的資源目錄下查找金矛,依次為xxhdpi芯急、xxxhdpi;
? 如果還不存在驶俊,系統(tǒng)就會從「像素密度無關(guān)的資源目錄nodpi」下查找娶耍;
? 如果還不存在,系統(tǒng)就會向更低密度的資源目錄下查找饼酿,依次為hdpi榕酒、mdpi、ldpi故俐。
kotlin 基礎(chǔ)知識點:
包聲明想鹰、導入,注釋,常量與變量定義,位操作符,字符,布爾,數(shù)組,IF表達式,When表達式,
For循環(huán),while與do...while循環(huán),返回和跳轉(zhuǎn)
函數(shù)定義,常量與變量定義,字符串模板,NULL檢查機制,類型檢測及自動類型轉(zhuǎn)換,區(qū)間,比較,類型轉(zhuǎn)換,字符串
字符串模板,類定義,類屬性,主構(gòu)造器,次構(gòu)造函數(shù),抽象類,內(nèi)部類,匿名內(nèi)部類,類修飾符,枚舉常量
協(xié)程,高階函數(shù)等
Kotlin中data class
data class算是Kotlin中一大閃光點了
data class就是一個類中只包含一些數(shù)據(jù)字段,類似于vo,pojo,java bean购披。
一般而言杖挣,我們在Java中定義了這個數(shù)據(jù)類之后要重寫一下toString,equals等方法刚陡。
要生成get,set方法惩妇。
然而在Kotlin中這些都不在需要自己手動去敲了,編譯器在背后默默給我們生成了如下的東西:
equals()/hashCode()
toString()方法
componentN()方法
copy()方法
如何申明一個簡單的數(shù)據(jù)類筐乳? 有一下幾點要求:
主構(gòu)造函數(shù)必須要至少有一個參數(shù)
主構(gòu)造函數(shù)中的所有參數(shù)必須被標記為val或者var
數(shù)據(jù)類不能有以下修飾符:abstract歌殃,inner,open,sealed
data class只能實現(xiàn)接口(Kotlin1.1以前的規(guī)則),現(xiàn)在也可以繼承其它類
data class User(var id: Int, var name: String)
使用方式
fun main(args: Array<String>) {
var user: User = User(123,"liuliqianxiao")
var user2: User = User(123,"liuliqianxiao")
println(user.hashCode())
println(user2.hashCode())
println(user.equals(user2))// true
println(user.toString())// User(id=123, name=liuliqianxiao)
}
kotlin for循環(huán)的集中方式:
1,在Kotlin中想遍歷1-100的數(shù)值可以這樣寫:
for (index in 1..100){
print(index)
}
2,這樣寫是正序遍歷蝙云,如果想倒序遍歷就該使用標準庫中定義的downTo()函數(shù):
for (index in 100 downTo 1){
print(index)
}
3,想不使用1作為遍歷的步長氓皱,可以使用step()函數(shù):
for (index in 1..100 step 2){
print(index)//會輸出1..3..5......
}
4,要創(chuàng)建一個不包含末尾元素的區(qū)間:
for (index in 1 until 10){
println(index)//輸出0..9
}
5,遍歷一個數(shù)組/列表,想同時取出下標和元素:
val array = arrayOf("a", "b", "c")
for ((index,e) in array.withIndex()){
println("下標=$index----元素=$e")
}
6,遍歷一個數(shù)組/列表勃刨,只取出下標:
val array = arrayOf("a", "b", "c")
for (index in array.indices){
println("index=$index")//輸出0波材,1,2
}
7, 遍歷取元素
val array = arrayOf("a", "b", "c")
for (element in array){
println("element=$element")//輸出a,b,c
}
android 組件化開發(fā):
### android 組件化開發(fā):
組件化主要從三個方面進行拆分
1. Gradle
Gradle 內(nèi)主要設(shè)置開關(guān)
在Module(app)中身隐,開關(guān)的目的是判斷Module是否以library的方式在程序中運行
在Module(module)中廷区,來判斷Module是library還是Application,從這兩種方式中為Module設(shè)置不同的清單文件(兩種方式的清單文件不同)
2. 代碼
代碼中組件化又籠統(tǒng)的分為三部分
2.1 第一部分為library部分贾铝,組件化的App部分與Module不能直接交流隙轻,這時就需要一個library作為中間商埠帕,library可以被App和Module共同引入,
所以通過library作為中間商最合適不過玖绿。 也可以將library理解為 MVP 模式中的 P層敛瓷。
2.2 第二部分則為Module部分,該部分根據(jù)開關(guān)斑匪,既可以作為library依賴于App部分運行呐籽,也可以作為一個單獨的App運行(
換句話說:當Module為library時,必須依賴于App部分才能運行秤标,此時可以與App進行數(shù)據(jù)交互等操作绝淡。當Module作為Application時,
Module就相當于一個獨立的個體苍姜,與App部分不能進行數(shù)據(jù)交互,但是可以與其他依賴進行交互)
2.3 第三部分為App部分悬包,也是主程序部分衙猪,該部分位于程序的主界面,Module部分則作為主界面的組成成分布近。
3 . 清單文件
此部分主要分為兩個模塊
3.1 當該模塊作為Application時垫释,為該模塊設(shè)置一個自定義的Application,主要用于初始化操作
3.2 為Module作為library和Application分別設(shè)置不同的清單文件
必須要關(guān)注的幾個部分
1,application
在common組件中有BaseAppliaction撑瞧,提供全局唯一的context棵譬,上層業(yè)務(wù)組件在組件化模式下,均需繼承于BaseAppliaction预伺。
2,applicationId管理
可為不同組件設(shè)置不同的applicationId订咸,也可缺省,在Android Studio中酬诀,默認的applicationId與包名一致脏嚷。
組件的applicationId在其build.gradle文件的defaultConfig中進行配置:
if (Boolean.valueOf(rootProject.ext.isModule_North)) {
//組件模式下設(shè)置applicationId
applicationId "com.hailong.amd.north"
}
3,manifest管理
組件在集成模式和組件化模式下,需要配置不同的manifest文件瞒御,因為在組件化模式下父叙,程序入口Activity和自定義的Application是不可或缺的。
在組件的build.gradle文件的android中進行manifest的管理:
java插件引入了一個概念叫做SourceSets肴裙,通過修改SourceSets中的屬性趾唱,
可以指定哪些源文件(或文件夾下的源文件)要被編譯,
哪些源文件要被排除蜻懦。
sourceSets {
main {
if (Boolean.valueOf(rootProject.ext.isModule_North)) {//apk
manifest.srcFile 'src/main/manifest/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
java {
//library模式下甜癞,排除java/debug文件夾下的所有文件
exclude '*module'
}
}
}
}
4,資源名沖突問題
* 限定所有子類xml中的資源文件的前綴
* 注意:圖片資源,限定失效阻肩,需要手動添加前綴
資源名沖突問題带欢,相信大家多多少少都遇到過运授,以前最常見的就是第三方SDK導致的資源名沖突了。
這個問題沒有特別好的解決辦法乔煞,只能通過設(shè)置資源名前綴 resourcePrefix 以及約束自己開發(fā)習慣進行解決吁朦。
資源名前綴 resourcePrefix ,是在project的build.gradle中進行設(shè)置的:
//限定所有子類xml中的資源文件的前綴
//注意:圖片資源渡贾,限定失效逗宜,需要手動添加前綴
subprojects {
afterEvaluate {
android {
resourcePrefix "${project.name}_"
}
}
}
這樣設(shè)置完之后,string空骚、style纺讲、color、dimens等中資源名囤屹,必須以設(shè)置的字符串為前綴熬甚,
而layout、drawable文件夾下的shape他們的xml文件的命名肋坚,必須以設(shè)置的字符串為前綴蕴忆,否則會報錯提示潮秘。
另外,資源前綴的設(shè)置對圖片的命名無法限定,建議大家約束自己的開發(fā)習慣澜倦,自覺加上前綴碟渺。
建議:
將color透典、shape刽宪、style這些放在基礎(chǔ)庫組件中去,這些資源不會太多诚卸,且復用性極高葵第,所有業(yè)務(wù)組件又都會依賴基礎(chǔ)庫組件。
5,組件間跳轉(zhuǎn)
業(yè)務(wù)組件間不存在依賴關(guān)系惨险,不可以通過Intent進行顯式跳轉(zhuǎn)羹幸,是要借助于路由的,例如開源框架ARouter
我在案例中只使用了ARouter的基礎(chǔ)的頁面跳轉(zhuǎn)功能辫愉,更復雜的諸如攜帶參數(shù)跳轉(zhuǎn)栅受、聲明攔截器等
功能的使用方法,大家可到Github上查看其使用文檔恭朗。
在每一個需要用到ARouter的組件的build.gradle文件中對其進行配置:
android {
...
defaultConfig {
...
//Arouter路由配置
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
includeCompileClasspath = true
}
}
}
}
dependencies{
...
//Arouter路由
annotationProcessor rootProject.ext.dependencies["arouter_compiler"]
}
跳轉(zhuǎn)目標頁面配置:
@Route(path = "/main/MainActivity")
public class MainActivity extends BaseActivity {
……
}
跳轉(zhuǎn)發(fā)起頁面的發(fā)起調(diào)用:
ARouter.getInstance()
.build("/main/MainActivity")
.navigation();
6.第三方sdk集成問題
項目不可避免的要使用第三方sdk屏镊,如友盟分享、高德地圖痰腮、騰訊 bugly 等而芥,
都需要在相應(yīng)第三方的開發(fā)者中心使用包名、applicationId注冊膀值,
獲取相應(yīng)的 appkey 棍丐、appsecret等误辑。那么,在組件化開發(fā)中歌逢,
到底應(yīng)該使用哪個組件的包名巾钉、applicationId 到第三方平臺進行注冊呢?
我的想法是使用基礎(chǔ)庫的包名秘案、applicationId 進行注冊砰苍,
然后將相應(yīng)的第三方sdk的功能封裝為功能組件,供上層業(yè)務(wù)組件進行調(diào)用阱高。
但也存在一個問題赚导,即在第三方的管理平臺上,將無法區(qū)分相應(yīng)統(tǒng)計信息到底屬于
哪一個組件化app赤惊。
所以還是要根據(jù)業(yè)務(wù)要求吼旧、統(tǒng)計要求自己選擇了。
IP協(xié)議淺析
IP 協(xié)議淺析:
物理層: 集線器(網(wǎng)線集合)
數(shù)據(jù)鏈路層: 交換機(發(fā)送數(shù)據(jù)包的數(shù)據(jù)鏈路層需要知道 MAC 地址)
網(wǎng)絡(luò)層:路由器
網(wǎng)絡(luò)層不具有數(shù)據(jù)傳輸功能,數(shù)據(jù)傳輸在交換機
如果兩個ip在同一個子網(wǎng)下(通過子網(wǎng)掩碼(255.255.255.0)判斷ip地址是否在同一個子網(wǎng)下)則不通過路由器(網(wǎng)絡(luò)層傳輸),
如果不在同一個子網(wǎng)下則通過交換機把ip地址相關(guān)信息交給路由器,然后再找到對應(yīng)的ip地址的交換機
在交換機層(網(wǎng)絡(luò)層)未舟,我需要把 IP 地址對應(yīng)的 MAC 地址找到黍少,
也就是通過某種方式,找到 192.168.0.2 對應(yīng)的 MAC 地址 BBBB处面。
這種方式就是 arp 協(xié)議,然后再完成完整的數(shù)據(jù)傳輸