android开发错误记录

使用google的ExoPlayer神器时,试图使用加密程序UUID来构造一个MediaDrm对象时,该设备不支持而报出的错误。我在模拟器上会遇到这个问题,换到真机就没有问题了。

 com.google.android.exoplayer2.drm.UnsupportedDrmException: android.media.UnsupportedSchemeException: Failed to instantiate drm object.
        at com.google.android.exoplayer2.drm.FrameworkMediaDrm.newInstance(FrameworkMediaDrm.java:57)
        at com.devbrackets.android.exomedia.core.exoplayer.ExoMediaPlayer.generateDrmSessionManager(ExoMediaPlayer.java:543)
        at com.devbrackets.android.exomedia.core.exoplayer.ExoMediaPlayer.<init>(ExoMediaPlayer.java:154)
        at com.devbrackets.android.exomedia.core.audio.ExoAudioPlayer.<init>(ExoAudioPlayer.java:62)

MediaPlayer调用prepareAsync报错IllegalStateException。然而在C++源码中MediaPlayer为null,但是java中MediaPlayer却不为null,所以会报这个错误。在MediaPlayer.release(),MediaPlayernull之后,release生效了,但是null却没有生效,所以我们只能加try…catch…进行解决喽!在catch里==null,然后再调用prepareAsync并播放。

C++代码:
sp<MediaPlayer> mp = getMediaPlayer(env, thiz);  
    if (mp == NULL ) {  
        jniThrowException(env, "java/lang/IllegalStateException", NULL);  
        return false;  
    }  
java.lang.IllegalStateException
	at android.media.MediaPlayer.prepareAsync(Native Method)

在UncaughtExceptionHandler中接收日志信息,然后开启线程去上传日志,这个错误的原因就是app即将异常退出时,刚开启的线程start,进程就杀死了,所以会报错。解决办法,不要在UncaughtExceptionHandler中开启线程上传日志,选择app重启的时候再去上传。

java.lang.InternalError: Thread starting during runtime shutdown

开启下载任务去执行下载操作,报出这个错误,原因是DownloadTask类中,我定义了一个任务监听Map集合,当在多个监听在多线程中执行了修改操作之后就汇报这个错,解决办法是,在暂停、错误和完成后及时unRegister监听器,有多个页面包含下载的模块,在退出界面时暂停当前页面的所有下载任务。

java.util.ConcurrentModificationException

微信支付之后报的错误,原因是action if中有异常,解决既可。

java.lang.RuntimeException: Error receiving broadcast Intent { act=WEIXI_PAY_ACTION flg=0x800010 (has extras) } 

这个异常是由于类加载过程中静态块初始化过程失败所导致的,一般情况是初始化过程发生了异常,导致初始化失败所致。

 java.lang.ExceptionInInitializerError

NoClassDefFoundError错误的发生,是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。例如在运行时我们想调用某个类的方法或者访问这个类的静态成员的时候,发现这个类不可用,此时Java虚拟机就会抛出NoClassDefFoundError错误。我的代码中是由于混淆问题所致。

 java.lang.NoClassDefFoundError:

刚买了个vivox21,兴高采烈的插了电脑上就想跑一下自己的项目,结果,安装失败,一脸的蒙蔽。结果查到只要在gradle.properties中加入android.injected.testOnly=false就可以了。

Installation failed with message INSTALL_FAILED_TEST_ONLY;

一般都是解压时候ZipFile会对数据做长度的校验;如果不一致就会出现这个问题;这个原因一般有可能是压缩包的问题;如果采用ZipInputStream会报IO异常, 可能在mac和iOS设备上解压没有这个问题;但是在android设备上会出现。一般重新生成一下压缩包可以解决这个问题

 java.io.IOException: Size mismatch on inflated file: 524288 vs 983040

更新了最新的NDK与cmake,报出了一下的错误,解决办法将gradle中cmake abiFilters配置改为:abiFilters ‘x86’, ‘x86_64’,‘arm64-v8a’, ‘armeabi-v7a’
Google NDK r18解释: Support for ARMv5 (armeabi), MIPS, and MIPS64 has been removed. Attempting to build any of these ABIs will result in an error.

abis [mips64, armeabi, mips] are not supported for platform. supported abis are [armeabi-v7a, arm64-v8a, x86, x86_64].

android8.0中,google将静态注册广播的方式给删除了,静态注册广播不再生效。解决方式就是使用动态注册广播的方式去实现。

android8.0测试,静态广播没有效果

fragment中添加:
@Override
public void onCreate(Bundle savedInstanceState) {
setRetainInstance(true);
super.onCreate(savedInstanceState);
}

FragmentManager fragmentManager = getChildFragmentManager();
FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
beginTransaction.replace(R.id.fl_frame, casePlayBackFragment,fragmentTag);
beginTransaction.addToBackStack(fragmentTag);
beginTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
beginTransaction.commit();

java.lang.IllegalStateException: Failure saving state: active StatisticalQuestionFragment{126ad2c} has cleared index: -1

解决方案如下:
try { if (wakeLock != null&&wakeLock.isHeld()) wakeLock.release(); } catch (Exception ex) { ex.printStackTrace(); }

java.lang.RuntimeException: WakeLock under-locked

我把项目从mac上备份到Windows上,用AS打开就报出了这个错误。解决方法就是:File-Project Structure->选择本地与mac上相同的jdk版本。重新clear一下工程,就OK了。

Intellij IDEA错误“CreateProcess error=2, 系统找不到指定的文件”完美解决

项目中有奔溃日志传回,报了android.os.TransactionTooLargeException异常,原因是fragment保存数据太多,并超过1M造成。解决方案:https://github.com/livefront/bridge/issues
还有这篇博客:https://medium.com/@mdmasudparvez/android-os-transactiontoolargeexception-on-nougat-solved-3b6e30597345

java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 540736 bytes
	at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4042)
	at android.os.Handler.handleCallback(Handler.java:761)
	at android.os.Handler.dispatchMessage(Handler.java:98)
	at android.os.Looper.loop(Looper.java:156)
	at android.app.ActivityThread.main(ActivityThread.java:6605)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:999)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:889)
Caused by: android.os.TransactionTooLargeException: data parcel size 540736 bytes
	at android.os.BinderProxy.transactNative(Native Method)
	at android.os.BinderProxy.transact(Binder.java:617)
	at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3632)
	at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4034)
	... 7 more

项目中收到了一个crash信息,是后台所传的json有问题所致,为了下次不至于奔溃,在Gson解析器中要判断是否为JsonObject,如下代码所示:

public class BaseInfoDeserializer implements JsonDeserializer<BaseInfo> {
    @Override
    public BaseInfo deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        BaseInfo baseInfo = new BaseInfo();
        if (json != null && json instanceof JsonObject) {
            JsonObject jsonObject = json.getAsJsonObject();
            baseInfo.setCode(jsonObject.get("Code").getAsString());
            baseInfo.setMsg(jsonObject.get("Msg").getAsString());
            JsonElement data = jsonObject.get("Data");
            if (data != null && data.isJsonObject()) {
                baseInfo.setData(data.getAsJsonObject());
            } else {
                baseInfo.setData(null);
            }
        }
        return baseInfo;
    }
}
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Not a JSON Object: "<html>"
	at com.google.gson.Gson.fromJson(Gson.java:900)
	at com.google.gson.Gson.fromJson(Gson.java:853)
	at com.google.gson.Gson.fromJson(Gson.java:802)
	at com.google.gson.Gson.fromJson(Gson.java:774)
	at com.wanhe.eng100.listening.utils.GsonUtil.json2Bean(GsonUtil.java:27)
	at com.wanhe.eng100.listening.pro.question.presenter.SubmitRecordPresenter$8.onSuccess(SubmitRecordPresenter.java:324)
	at com.lzy.okgo.cache.policy.NoCachePolicy$1.run(NoCachePolicy.java:43)
	at android.os.Handler.handleCallback(Handler.java:808)
	at android.os.Handler.dispatchMessage(Handler.java:101)
	at android.os.Looper.loop(Looper.java:166)
	at android.app.ActivityThread.main(ActivityThread.java:7425)
	at java.lang.reflect.Method.invoke(Method.java)
	at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
Caused by: java.lang.IllegalStateException: Not a JSON Object: "<html>"
	at com.google.gson.JsonElement.getAsJsonObject(JsonElement.java:91)
	at com.wanhe.eng100.listening.bean.gson.BaseInfoDeserializer.deserialize(BaseInfoDeserializer.java:32)
	at com.wanhe.eng100.listening.bean.gson.BaseInfoDeserializer.deserialize(BaseInfoDeserializer.java:21)
	at com.google.gson.internal.bind.TreeTypeAdapter.read(TreeTypeAdapter.java:69)
	at com.google.gson.TypeAdapter$1.read(TypeAdapter.java:199)
	at com.google.gson.Gson.fromJson(Gson.java:888)
	... 13 more

RecyclerView在部分机型中遇到这个错误,解决版本就是重写LinearLayoutManger 在onLayoutChildren方法中捕获异常。

   @Override  
    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {  
        try {  
            super.onLayoutChildren(recycler, state);  
        } catch (IndexOutOfBoundsException e) {  
            e.printStackTrace();  
        }  
    }  
    
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{14a87e26 position=5 id=-1, oldPos=-1, pLpos:-1 no parent} 

发生这个错误时由于webview一直开启着硬件加速的原因,加入以下代码可以解决:

if (Build.VERSION.SDK_INT >= 19) // KITKAT
{
mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

java.util.concurrent.TimeoutException: android.view.ThreadedRenderer.finalize() timed out after 10 seconds
	at android.view.ThreadedRenderer.nDeleteProxy(Native Method)
	at android.view.ThreadedRenderer.finalize(ThreadedRenderer.java:959)
	at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:253)
	at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:240)
	at java.lang.Daemons$Daemon.run(Daemons.java:103)
	at java.lang.Thread.run(Thread.java:784)

使用kotlin的项目中加入glide,加上apply plugin: 'kotlin-kapt’时,就报错了这个错误,经过尝试,我删掉apply plugin: ‘kotlin-kapt’,编译,然后加上它,再次编译,就不会有这个错误了。

Folder app/build/generated/source/kaptKotlin/debug
Folder app/build/generated/source/kaptKotlin/release

今天NDK项目中使用了Bitmap.h头文件,结果编译找不到已使用Bitmap.h中的一些类,经过查找需要加入在CMakeLists.txt中配置jnigraphics。

error: undefined reference to 'AndroidBitmap_getInfo'

error: undefined reference to 'AndroidBitmap_lockPixels'

error: undefined reference to 'AndroidBitmap_unlockPixels'

JsonReader jsonReader = new JsonReader(new StringReader(json));
jsonReader.setLenient(true);
在调用fromJson方法之前调用这两段代码即可解决。

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 12 path $

选择头像时报错,更改获取图片Uri方法,我将Environment.getExternalStorageDirectory()改为Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)。

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=160, result=-1, data=Intent { dat=content://media/external/images/media/736476 flg=0x1 (has extras) }} to activity {com.wanhe.eng100.listening/com.wanhe.eng100.listening.pro.mine.MineInfoEditActivity}: java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/999/Tencent/QQ_Images/null-7968772d663cc099.jpg

之前开发合并了项目,今天我需要分离开一个moudle成为独立项目,可是报错频频发生,各种奇葩的问题,经过我一番思索后发现没有判断从主moudle中移除要分离的moudle。判断之后一切OK!

因此在Android P 使用HttpUrlConnection进行http请求会出现以下异常:
W/System.err: java.io.IOException: Cleartext HTTP traffic to **** not permitted
使用OKHttp请求则出现:
java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy

android9.0 app不能访问网络,解决方法有三种:
1、APP改用https请求
2、targetSdkVersion 降到27以下
3、在 res 下新增一个 xml 目录,然后创建一个名为:network_security_config.xml 文件(名字自定) ,内容如下,大概意思就是允许开启http请求

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>
//然后在APP的AndroidManifest.xml文件下的application标签增加以下属性
<application
...
 android:networkSecurityConfig="@xml/network_security_config"
...
/>

适配完android9.0网络问题之后,发现流量app访问服务器巨慢无比,经过一番测试,最后发现是服务器开启了ipv6解析,通过和服务器沟通,为android端开启了另一个只解析ipv4的域名,使用之后一切nice。

androidstudio一直显示 Indexing paused due to batch updated,不断地loading。

解决办法,退出项目界面,在其他项目界面Open项目,就没问题了!

java.net.UnknownServiceException: CLEARTEXT communication to 10.0.2.2 not permitted by network security policy

这是因为新的保护机制对于仅使用安全通信的应用,Android 6.0 Marshmallow(API 级别 23)引入了两种机制来解决回退到明文通信的问题:(1) 在生产/安装库中,禁止明文通信,以及 (2) 在开发/QA 期间,在遇到任何非 TLS/SSL 通信时,予以记录或者触发崩溃。下文将更详细地介绍这两种机制。解决方法:如果一定要使用明文通信的话,则可以打开AndroidManifest.xml 文件,在 application 元素中添加:android:usesCleartextTraffic="true"如果声明不使用明文通信,则可以在application元素中添加:android:usesCleartextTraffic=“false”

Manifest merger failed with multiple errors

清单文件合并冲突,有两种情况。
第一种:清单文件Application属性冲突。
解决方式: Application节点加入tools:replace=“android:icon,android:theme”
第二种:minSdkVersion或者targetSdkVersion不一致。
解决方式:统一minSdkVersion和targetSdkVersion


> Can not perform this action after onSaveInstanceState错误终极解决方案

Can not perform this action after onSaveInstanceState
@Override
public void onBackPress(){
	//这行代码可以解决这个问题
	onStateNotSaved();
	super.onBackPress();
}

使用FragmentDialog时报出Can not perform this action after onSaveInstanceState错误,解决方案:

显示FragmentDialog:
       transaction.add(realQuestionDialog, "realQuestionDialog");
       transaction.commitNowAllowingStateLoss();
隐藏FragmentDialog:
	dismissNowAllowingStateLoss();

使用过滤表情、特殊符号的方法,出现如下错误:

java.lang.IndexOutOfBoundsException: setSpan (0 ... 1) ends beyond length 0
    at android.text.SpannableStringInternal.checkRange(SpannableStringInternal.java:436)
    at android.text.SpannableStringInternal.setSpan(SpannableStringInternal.java:163)
    at android.text.SpannableStringInternal.setSpan(SpannableStringInternal.java:152)
    at android.text.SpannableString.setSpan(SpannableString.java:46)
    at android.text.TextUtils.copySpansFrom(TextUtils.java:1080)
    at com.wanhe.eng100.base.utils.o.filter(InputUtils.java:7)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:514)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:504)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:502)
    at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:863)
    at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:627)
    at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:396)
    at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:85)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:192)
    at android.app.ActivityThread.main(ActivityThread.java:6800)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:825)

> 解决方案:
> 将EditText的InputType改为:textNoSuggestions

app点击home键退出,然后再点击app图标,发现app重启了。
解决方案如下:

> 在app启动的第一个界面中加入:
    if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0){
            finish();
            return;
        }

然后在AndroidManifest.xml中找到启动的第一个activity,配置:
android:alwaysRetainTaskState="true"

错误:Caused by: java.lang.NullPointerException: Attempt to invoke virtual method boolean androidx.fragment.app.FragmentManagerImpl.isDestroyed()’ on a null object reference
出现这个错误,如果你在Fragment中这样写,那么解决错误,只需要去掉如下onDetach()方法中的代码。

@Override
public void onDetach() {
    super.onDetach();
    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);

    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}

在5.0中,com.internal.R.string.config_webViewPackageName的值被获取出来是: com.google.android.webview,也就是chrome内核。在5.1以及以上的版本中,com.internal.R.string.config_webViewPackageName的值被获取出来是: com.android.webview, 也就是webkit内核。

android.content.res.Resources$NotFoundException: String resource ID #0x2040003
    at android.content.res.Resources.getText(Resources.java:318)
    at android.content.res.VivoResources.getText(VivoResources.java:123)
    at android.content.res.Resources.getString(Resources.java:404)
    at com.android.org.chromium.content.browser.ContentViewCore.setContainerView(ContentViewCore.java:694)
    at com.android.org.chromium.content.browser.ContentViewCore.initialize(ContentViewCore.java:618)
    at com.android.org.chromium.android_webview.AwContents.createAndInitializeContentViewCore(AwContents.java:631)
    at com.android.org.chromium.android_webview.AwContents.setNewAwContents(AwContents.java:780)
    at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:619)
    at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:556)
    at com.android.webview.chromium.WebViewChromium.initForReal(WebViewChromium.java:312)
    at com.android.webview.chromium.WebViewChromium.access$100(WebViewChromium.java:96)
    at com.android.webview.chromium.WebViewChromium$1.run(WebViewChromium.java:264)
    at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.drainQueue(WebViewChromium.java:123)
    at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue$1.run(WebViewChromium.java:110)
    at com.android.org.chromium.base.ThreadUtils.runOnUiThread(ThreadUtils.java:144)
    at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.addTask(WebViewChromium.java:107)
    at com.android.webview.chromium.WebViewChromium.init(WebViewChromium.java:261)
    at android.webkit.WebView.<init>(WebView.java:554)
    at android.webkit.WebView.<init>(WebView.java:489)
    at android.webkit.WebView.<init>(WebView.java:472)
    at android.webkit.WebView.<init>(WebView.java:459)
    at android.webkit.WebView.<init>(WebView.java:449)
    at com.wanhe.eng100.base.view.ProgressWebView.<init>(ProgressWebView.java:1)
    at com.wanhe.eng100.base.ui.web.LoadNoToolbarWebActivity.A(LoadNoToolbarWebActivity.java:6)
    at com.wanhe.eng100.base.ui.web.LoadNoToolbarWebActivity.a(LoadNoToolbarWebActivity.java:1)
    at com.wanhe.eng100.base.ui.web.LoadNoToolbarWebActivity$a.run(LoadNoToolbarWebActivity.java:1)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5418)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1037)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

错误解决方案:

public class LollipopFixedWebView extends WebView {
    public LollipopFixedWebView(Context context) {
        super(getFixedContext(context));
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs) {
        super(getFixedContext(context), attrs);
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(getFixedContext(context), attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(getFixedContext(context), attrs, defStyleAttr, defStyleRes);
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr, boolean privateBrowsing) {
        super(getFixedContext(context), attrs, defStyleAttr, privateBrowsing);
    }

    public static Context getFixedContext(Context context) {
        if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT < 23) // Android Lollipop 5.0 & 5.1
            return context.createConfigurationContext(new Configuration());
        return context;
    }
}

Fragment中所报的错误

Cannot detach Fragment attached to a different FragmentManager

解决方案如下:

Fragment中onCreateView方法中应该这样引入布局:
LayoutInflater.from(mContext).inflate(getContentView(), container, false);

Android4.4以下系统CheckBox样式问题解决方案:

    <style name="QuestionCheckBox" parent="Widget.AppCompat.CompoundButton.CheckBox">
        <item name="android:button">@null</item>
        <item name="buttonCompat">@null</item>
        <item name="android:background">@null</item>
    </style>

扫描二维码出现这个错误。

FlashlightManager: Unexpected error while invoking public void android.os.IHardwareService$Stub$Proxy.setFlashlightEnabled(boolean) throws android.os.RemoteException
    java.lang.SecurityException: Requires FLASHLIGHT or HARDWARE_TEST permission

解决方案:
在AndroidManifest.xml中添加以下权限

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这里记录一些常用android工具类,android开发经验,面试算法题,牛客算法题解析。也包含java数据结构,算法,爬虫,泛型,反射等实现 开发工具在软件开发生命周期中扮演着至关重要的角色,它们旨在简化和加速从概念设计到产品部署的各个环节。以下是开发工具的主要作用: 代码编写与编辑: 提供集成开发环境(IDE),如Visual Studio、Eclipse、Android Studio和Sublime Text等,这些工具集成了文本编辑器,支持语法高亮、自动补全、代码片段管理和版本控制等功能,有助于开发者高效编写和维护代码。 项目管理: 支持项目创建、组织、构建自动化以及依赖管理,确保不同模块和组件之间的协调一致。 编译与构建: 包括编译器、构建工具(如Make、Gradle、Maven)等,用于将源代码转换为可执行文件或库,并进行资源打包、优化等处理。 调试与测试: 集成调试器允许开发者逐行执行代码,设置断点、查看变量值、跟踪调用堆栈等,帮助定位并修复代码中的错误。 测试框架和工具则协助开发者编写和运行单元测试、集成测试及性能测试,确保软件质量。 版本控制与协作: 通过集成Git、SVN等版本控制系统,支持团队成员间的代码共享、分支管理、合并请求和冲突解决。 可视化设计与原型制作: 对于UI/UX设计,有界面设计工具,如Sketch、Adobe XD,可以帮助设计师快速构建应用程序界面模型,并生成规范的设计稿供开发人员参考实现。 跨平台支持: 跨平台开发工具如Xamarin、React Native和Flutter,让开发者使用一种语言或框架编写可以在多个操作系统上运行的应用程序。 文档编写与API管理: 文档生成工具可以自动生成代码注释文档,便于团队内外理解和使用项目代码。 API管理工具则方便开发者创建、测试、发布和维护API接口。 持续集成与持续部署(CI/CD): Jenkins、Travis CI、GitHub Actions等工具负责自动化构建、测试和部署流程,提高交付效率和可靠性。 数据库管理与ORM工具: 数据库客户端工具用于连接、查询、更新数据库,ORM(对象关系映射)工具简化了数据操作和持久化层的开发工作。 总之,开发工具极大地提升了软件工程师的工作效率,保证了开发过程中的准确性与一致性,同时也促进了团队合作,使得软件开发更系统化、规范化和工业化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值