编译能自动保存 logcat 和kernel log 的android镜像

开发过程中,希望系统能自动保存log cat和kernel的log,现在介绍一下方法。

关键字:服务 自启动

概念:

1. 开机自启动脚本: 手机的 /root/init.YourPlatformName.rc,这里面可以启用相关服务和应用;

2. logcat 是一个自带的应用,只要带上相关参数就OK了;

3. kernel log, 为方便使用,这个稍微麻烦一点,需要写一个应用,也很简单。

 

1. 修改/root/init.YourPlatformName.rc:

    根据android/device/YOURPLAT/YOURPLAT/YOURPLAT.mk文件,找到/root/init.YourPlatformName.rc 的原始文件,一般在PRODUCT_COPY_FILES 字段下;有些文件拷贝比较多次,找到源头修改才可以;在合适位置添加如下语句,一般在文件末尾。

# ADD for log
# create logging directory
 mkdir /data/logger 0771 system system //建立存放log的路径
service logcat-pppd /system/bin/logcat -f /data/logger/logcat-pppd.log -r 10000 -n 1 -v time -s pppd:D //使用logcat 
 disabled
 oneshot
on property:persist.service.events.enable=1
 start logcat-pppd
on property:persist.service.events.enable=0
 stop logcat-pppd
service logcat-main /system/bin/logcat -r 10000 -n 4 -v time -f /data/logger/logcat-main.log //使用logcat 
 disabled
 oneshot
on property:persist.service.main.enable=1
 start logcat-main
on property:persist.service.main.enable=0
 stop logcat-main
chmod 0777 /system/bin/kernel_log
service log-kernel /system/bin/kernel_log //使用自己写的kernel_log 应用,这个稍后添加;
 disabled
 oneshot
on property:persist.service.kernel.enable=1
 start log-kernel
on property:persist.service.kernel.enable=0
 stop log-kernel
# ADD for log

2.  logcat指令参数不解释,自己google。

3. 关于生成 kernel_log应用,在android/external 下搞一个子目录,写一个.c 和一个Android.mk,记得需要设置拷贝到out的 system/bin目录,才能编译进系统;

 

<think>我们正在解决Eclipse调试时模拟器黑屏且无logcat输出的问题。根据引用内容,可能的原因包括:1.库未正确加载(引用[1]):ndk-build未正确生成.so文件(如libmain.solibSDL2.so)2.模拟器启动失败(引用[2][3][5]):模拟器黑屏,adb显示设备离线或连接失败3.Java环境问题(引用[5]):32位64位JDK混装可能导致问题解决方案应分步骤排查:###第一步:确认NDK编译成功1.检查`ndk-build`执行是否成功:-在项目根目录执行`ndk-build`(或通过Eclipse的Builders配置执行)-确认`libs/armeabi/`(或对应ABI目录)下生成了`.so`文件(如`libmain.so`)-若未生成,检查`jni/Android.mk`配置(参考[^1])###第二步:修复模拟器启动问题####场景1:模拟器黑屏且adb设备离线(引用[2][5])-**可能原因**:模拟器镜像损坏或配置错误-**解决方案**:1.删除现有AVD,重新创建:-Eclipse→Window→AVDManager→选择对应AVD→Delete-重新创建AVD(注意选择正确API级别CPU架构)2.使用命令行启动模拟器并查看错误:```bashemulator-avd<AVD_NAME>-show-kernel-verbose```3.检查日志中是否有`Failedtoopen/.../kernel-qemu`等错误(表明镜像损坏)####场景2:模拟器启动后无Android界面(引用[3])-**可能原因**:API级别不兼容-**解决方案**:-重新安装对应API级别的SDK(如Android4.2API17)####场景3:JDK安装混乱(引用[5])-**症状**:同时安装32位64位JDK-**解决方案**:1.卸载所有JDK/JRE2.安装**64位JDK**(必须与Eclipse位数一致)3.设置环境变量:-`JAVA_HOME`:指向JDK安装目录(如`C:\ProgramFiles\Java\jdk1.8.0_202`)-`PATH`:添加`%JAVA_HOME%\bin`###第三步:检查logcat输出配置1.**确认logcat视图已打开**:-Eclipse→Window→ShowView→Other→AndroidLogCat2.**筛选日志**:-在LogCat视图顶部选择设备(模拟器序列号)-创建过滤器(FilterName:`MyApp`,byApplicationName:`包名`)3.**检查日志级别**:-确保未设置过滤级别(如Error),应选Verbose###第四步:验证.so文件加载在Java代码中检查库加载:```javastatic{System.loadLibrary("SDL2");System.loadLibrary("main");//与Android.mk中LOCAL_MODULE一致}```若加载失败,logcat会报`java.lang.UnsatisfiedLinkError`(需确认.so路径名称匹配)###第五步:强制重载APK1.卸载旧版应用:```bashadbuninstall<包名>```2.清理项目:-Eclipse→Project→Clean3.重新编译部署---###错误处理流程图```mermaidflowchartTDA[模拟器黑屏+无logcat]-->B{模拟器是否完全启动?}B--否-->C[检查AVD配置/JDK环境]B--是-->D{LogCat是否显示设备?}D--否-->E[检查adb连接:adbdevices]E--设备离线-->F[重启adb:adbkill-server&adbstart-server]D--是-->G{是否有.so加载错误?}G--是-->H[检查ndk-build输出.so路径]G--否-->I[检查应用启动日志]```---###关键配置验证点|组件|验证方法|成功标志||---------------|-----------------------------------|------------------------------||**NDK编译**|查看`libs/armeabi/*.so`|存在目标.so文件||**JDK**|`java-version`|显示64位版本且与Eclipse一致||**模拟器**|`adbdevices`|设备状态为`device`||**LogCat**|选择设备后查看日志|出现`I/ActivityManager:Startproc`等应用启动日志|>数学表达:设问题解决概率为$P$,各步骤独立:>$$>P=P(\text{NDK})\timesP(\text{JDK})\timesP(\text{AVD})\timesP(\text{ADB})>$$>其中$P(\cdot)\in[0,1]$为各环节成功概率[^1][^2][^3][^5]。---§§相关问题§§1.如何为不同ABI(armeabi,arm64-v8a)配置ndk-build?2.adbdevices显示offline的终极解决方案是什么?3.如何在Eclipse中调试JNI代码?4.如何配置logcat以显示SDL2应用的输出?5.模拟器启动时出现`Failedtoopen.../kernel-qemu`错误如何修复?</think>### 🔧 Eclipse模拟器黑屏+Logcat无输出解决方案 根据引用分析,问题核心在于 **NDK编译异常** 或 **模拟器环境故障**。以下是系统化排查流程: --- ### 🛠️ 一、NDK编译验证(解决库加载失败) **症状**:Logcat刷红字错误,黑屏无输出[^1] **解决步骤**: 1. **检查`.so`文件生成**: - 执行`ndk-build`后,确认`libs/armeabi/`目录存在`libmain.so``libSDL2.so` - 若缺失,在命令行手动执行: ```bash cd <项目路径>/jni ndk-build NDK_LOG=1 V=1 # 查看详细编译日志 ``` 2. **验证库加载代码**: 在Java入口类检查加载顺序: ```java static { System.loadLibrary("SDL2"); // 必须先加载SDL2 System.loadLibrary("main"); // 后加载主库 } ``` 3. **检查`Android.mk`配置**: 确保包含SDL库声明: ```makefile LOCAL_SHARED_LIBRARIES := SDL2 ``` --- ### ⚡ 二、模拟器黑屏修复(解决设备离线/启动失败) **症状**:adb显示设备离线,持续黑屏[^2][^5] **解决步骤**: 1. **强制重启ADB服务**: ```bash adb kill-server && adb start-server adb devices # 检查状态是否为"device" ``` 2. **重建模拟器镜像**: - 删除失效AVD: ```bash android delete avd -n <AVD名称> ``` - 新建AVD时勾选**使用主机GPU**(解决渲染黑屏) 3. **指定API级别启动**: ```bash emulator @<AVD名称> -gpu on -no-snapshot-load -verbose ``` > 观察控制台输出,定位卡点(如`Failed to open GLES emulation library`) 4. **JDK环境修复**[^5]: - 卸载所有JDK/JRE - **仅安装64位JDK**(需与Eclipse位数一致) - 设置环境变量: ``` JAVA_HOME=C:\Program Files\Java\jdk1.8.0_xxx PATH=%JAVA_HOME%\bin;... ``` --- ### 📡 三、Logcat无输出调试 **症状**:无任何日志输出(包括系统日志) **解决步骤**: 1. **检查Logcat过滤器**: - 在Eclipse中:`Window > Show View > Other > Android > LogCat` - 清除所有过滤器(点击`X`按钮) 2. **启用SDL日志重定向**: 在`SDLActivity.java`中添加: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 重定向SDL日志Logcat SDL.setenv("SDL_ANDROID_LOG_TAG", "SDL", 1); } ``` 3. **强制刷新设备日志**: ```bash adb logcat -c # 清空日志缓存 adb logcat -s SDL:I *:E # 仅显示SDL信息及错误 ``` --- ### 🔍 四、交叉验证流程图 ```mermaid graph TD A[模拟器黑屏] --> B{adb devices状态} B -->|Offline| C[重启ADB+重建AVD] B -->|No Devices| D[检查JDK安装] A --> E{Logcat输出} E -->|无任何日志| F[检查Logcat视图配置] E -->|有系统日志无SDL输出| G[添加SDL日志重定向] A --> H{运行时崩溃} H --> I[检查libs/armeabi/*.so] I -->|文件缺失| J[手动执行ndk-build] ``` --- ### ✅ 验证成功标志 1. **模拟器**:显示Android启动动画(非黑屏) 2. **ADB**:`adb devices`返回`emulator-5554 device` 3. **Logcat**:出现SDL初始化日志: ``` I/SDL: SDL_Android_Init() I/SDL: Creating surface ``` > 核心公式:成功启动概率 $P$ 与环境配置关系: > $$ > P = P(\text{JDK}) \times P(\text{ADB}) \times P(\text{NDK}) \times P(\text{GPU}) > $$ > 其中 $P(\cdot) \in [0,1]$ 为各环节配置正确概率[^1][^2][^5]。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值